

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon VPC AWS CloudShell 에서 사용
<a name="using-cshell-in-vpc"></a>

 AWS CloudShell Virtual Private Cloud(VPC)를 사용하면 VPC에서 CloudShell 환경을 생성할 수 있습니다. 각 VPC 환경에 대해 VPC를 할당하고, 서브넷을 추가하고, 최대 5개의 보안 그룹을 연결할 수 있습니다.는 VPC의 네트워크 구성을 AWS CloudShell 상속하고 VPC의 다른 리소스와 동일한 서브넷 내에서 AWS CloudShell 안전하게 사용하고 연결할 수 있습니다.

Amazon VPC를 사용하면 정의한 논리적으로 격리된 가상 네트워크에서 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함께 고객의 자체 데이터 센터에서 운영하는 기존 네트워크와 매우 유사합니다. 자세한 내용은 [Amazon Virtual Private Cloud(Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)를 참조하세요.

## 운영 제약 조건
<a name="limitations"></a>

AWS CloudShell VPC 환경에는 다음과 같은 제약 조건이 있습니다.
+ IAM 보안 주체당 최대 2개의 VPC 환경을 생성할 수 있습니다.
+ VPC 환경에 최대 5개의 보안 그룹을 할당할 수 있습니다.
+ VPC 환경의 작업 메뉴에서 CloudShell 업로드 및 다운로드 옵션을 사용할 수 없습니다.
**참고**  
다른 CLI 도구를 통해 인터넷 수신/송신에 액세스할 수 있는 VPC 환경에서 파일을 업로드하거나 다운로드할 수 있습니다.
+ VPC 환경은 영구 스토리지를 지원하지 않습니다. 스토리지는 휘발성입니다. 활성 환경 세션이 종료되면 데이터 및 홈 디렉터리가 삭제됩니다.
+  AWS CloudShell 환경은 프라이빗 VPC 서브넷에 있는 경우에만 인터넷에 연결할 수 있습니다.
**참고**  
퍼블릭 IP 주소는 기본적으로 CloudShell VPC 환경에 할당되지 않습니다. 모든 트래픽을 인터넷 게이트웨이로 라우팅하도록 구성된 라우팅 테이블이 있는 퍼블릭 서브넷에서 생성된 VPC 환경은 퍼블릭 인터넷에 액세스할 수 없지만, 네트워크 주소 변환(NAT)으로 구성된 프라이빗 서브넷은 퍼블릭 인터넷에 액세스할 수 있습니다. 이러한 프라이빗 서브넷에서 생성된 VPC 환경은 퍼블릭 인터넷에 액세스할 수 있습니다.
+ 계정에 관리형 CloudShell 환경을 제공하려면 기본 컴퓨팅 호스트에 대해 다음 서비스에 네트워크 액세스를 AWS 프로비저닝할 수 있습니다.
  + Amazon S3
  + VPC 엔드포인트
    + com.amazonaws.<region>.ssmmessages
    + com.amazonaws.<region>.logs
    + com.amazonaws.<region>.kms
    + com.amazonaws.<region>.execute-api
    + com.amazonaws.<region>.ecs-telemetry
    + com.amazonaws.<region>.ecs-agent
    + com.amazonaws.<region>.ecs
    + com.amazonaws.<region>.ecr.dkr
    + com.amazonaws.<region>.ecr.api
    + com.amazonaws.<region>.codecatalyst.packages
    + com.amazonaws.<region>.codecatalyst.git
    + aws.api.global.codecatalyst

  VPC 구성을 수정하여 이러한 엔드포인트에 대한 액세스를 제한할 수 없습니다.

  CloudShell VPC는 모든 AWS 리전 및 GovCloud 리전에서 사용할 수 있습니다. CloudShell VPC를 사용할 수 있는 리전 목록은 [에 지원되는 AWS 리전을 참조하세요 AWS CloudShell](supported-aws-regions.md).

# CloudShell VPC 환경 생성
<a name="creating-vpc-environment"></a>

 이 주제에서는 CloudShell에서 VPC 환경을 생성하는 단계를 안내합니다.

**사전 조건**

관리자가 VPC 환경을 생성할 수 있도록 필요한 IAM 권한을 제공해야 합니다. CloudShell VPC 환경을 생성할 수 있는 권한을 활성화하는 방법에 대한 자세한 내용은 [CloudShell VPC 환경을 생성하고 사용하는 데 필요한 IAM 권한](aws-cloudshell-vpc-permissions-1.md) 섹션을 참조하세요.

**CloudShell VPC 환경을 생성하려면**

1. CloudShell 콘솔 페이지에서 **\$1** 아이콘을 선택한 다음 드롭다운 메뉴에서 **VPC 환경 생성**을 선택합니다.

1. **VPC 환경 생성** 페이지에서 **이름** 상자에 VPC 환경의 이름을 입력합니다.

1. **가상 프라이빗 클라우드(VPC)** 드롭다운 목록에서 VPC를 선택합니다.

1. **서브넷** 드롭다운 목록에서 서브넷을 선택합니다.

1. **보안** 그룹 드롭다운 목록에서 VPC 환경에 할당할 보안 그룹을 하나 이상 선택합니다.
**참고**  
최대 5개의 보안 그룹을 선택할 수 있습니다.

1. **생성**을 선택하여 VPC 환경을 생성합니다.

1. (선택 사항) **작업**을 선택한 다음 **세부 정보 보기**를 선택하여 새로 생성된 VPC 환경의 세부 정보를 검토합니다. VPC 환경의 IP 주소가 명령줄 프롬프트에 표시됩니다.

VPC 환경 사용에 대한 자세한 내용은 [시작하기 AWS CloudShell](getting-started.md) 섹션을 참조하세요.

# CloudShell VPC 환경을 생성하고 사용하는 데 필요한 IAM 권한
<a name="aws-cloudshell-vpc-permissions-1"></a>

CloudShell VPC 환경을 생성하고 사용하려면 IAM 관리자가 VPC 특정 Amazon EC2 권한에 대한 액세스를 활성화해야 합니다. 이 섹션에서는 VPC 환경을 생성하고 사용하는 데 필요한 Amazon EC2 권한을 나열합니다.

 VPC 환경을 생성하려면 역할에 할당된 IAM 정책에 다음 Amazon EC2 권한이 포함되어 있어야 합니다.
+ `ec2:DescribeVpcs`
+ `ec2:DescribeSubnets`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeDhcpOptions`
+ `ec2:DescribeNetworkInterfaces`
+ `ec2:CreateTags`
+ `ec2:CreateNetworkInterface`
+ `ec2:CreateNetworkInterfacePermission`

다음 사항을 포함하는 것이 좋습니다.
+ **ec2:DeleteNetworkInterface**

**참고**  
이 권한은 필수는 아니지만, CloudShell이 생성된 ENI 리소스(CloudShell VPC 환경을 위해 생성된 ENI는 **ManagedByCloudShell** 키로 태그 지정됨)를 정리하는 데 필요합니다. 이 권한이 활성화되지 않은 경우 CloudShell VPC 환경을 사용할 때마다 ENI 리소스를 수동으로 정리해야 합니다.

## VPC에 대한 액세스를 포함하여 전체 CloudShell 액세스 권한을 부여하는 IAM 정책
<a name="cshell-vpc-full-access-example-1"></a>

다음 예제에서는 VPC에 대한 액세스를 포함하여 CloudShell에 대한 전체 권한을 활성화하는 방법을 보여줍니다.

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Sid": "AllowCloudShellOperations",
			"Effect": "Allow",
			"Action": [
				"cloudshell:*"
			],
			"Resource": "*"
		},
		{
			"Sid": "AllowDescribeVPC",
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeSubnets",
				"ec2:DescribeSecurityGroups",
				"ec2:DescribeVpcs"
			],
			"Resource": "*"
		},
		{
			"Sid": "AllowInspectVPCConfigurationViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeDhcpOptions",
				"ec2:DescribeNetworkInterfaces"
			],
			"Resource": "*",
			"Condition": {
				"ForAnyValue:StringEquals": {
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		},
		{
			"Sid": "AllowCreateTagWithCloudShellKeyViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:CreateTags"
			],
			"Resource": "arn:aws:ec2:*:*:network-interface/*",
			"Condition": {
				"StringEquals": {
					"ec2:CreateAction": "CreateNetworkInterface"
				},
				"ForAnyValue:StringEquals": {
					"aws:TagKeys": "ManagedByCloudShell",
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		},
		{
			"Sid": "AllowCreateNetworkInterfaceWithSubnetsAndSGViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:CreateNetworkInterface"
			],
			"Resource": [
				"arn:aws:ec2:*:*:subnet/*",
				"arn:aws:ec2:*:*:security-group/*"
			],
			"Condition": {
				"ForAnyValue:StringEquals": {
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		},
		{
			"Sid": "AllowCreateNetworkInterfaceWithCloudShellTagViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:CreateNetworkInterface"
			],
			"Resource": "arn:aws:ec2:*:*:network-interface/*",
			"Condition": {
				"ForAnyValue:StringEquals": {
					"aws:TagKeys": "ManagedByCloudShell",
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		},
		{
			"Sid": "AllowCreateNetworkInterfacePermissionWithCloudShellTagViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:CreateNetworkInterfacePermission"
			],
			"Resource": "arn:aws:ec2:*:*:network-interface/*",
			"Condition": {
				"StringEquals": {
					"aws:ResourceTag/ManagedByCloudShell": ""
				},
				"ForAnyValue:StringEquals": {
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		},
		{
			"Sid": "AllowDeleteNetworkInterfaceWithCloudShellTagViaCloudShell",
			"Effect": "Allow",
			"Action": [
				"ec2:DeleteNetworkInterface"
			],
			"Resource": "arn:aws:ec2:*:*:network-interface/*",
			"Condition": {
				"StringEquals": {
					"aws:ResourceTag/ManagedByCloudShell": ""
				},
				"ForAnyValue:StringEquals": {
					"aws:CalledVia": "cloudshell.amazonaws.com"
				}
			}
		}
	]
}
```

------

## VPC 환경에 IAM 조건 키 사용
<a name="cloudshell-vpc-condition-keys-1"></a>

VPC 설정에 CloudShell 전용 조건 키를 사용하여 VPC 환경에 대한 추가 권한 제어를 제공할 수 있습니다. 또한 VPC 환경이 사용할 수 있고 사용할 수 없는 서브넷 및 보안 그룹을 지정할 수도 있습니다.

CloudShell은 IAM 정책에서 다음 조건 키를 지원합니다.
+ `CloudShell:VpcIds` - 하나 이상의 VPC 허용 또는 거부
+ `CloudShell:SubnetIds` - 하나 이상의 서브넷 허용 또는 거부
+ `CloudShell:SecurityGroupIds` - 하나 이상의 보안 그룹 허용 또는 거부

**참고**  
퍼블릭 CloudShell 환경에 액세스할 수 있는 사용자의 권한이 수정되어 `cloudshell:createEnvironment` 작업이 제한되는 경우에도 기존 퍼블릭 환경에 액세스할 수 있습니다. 그러나 이 제한으로 IAM 정책을 수정하고 기존 퍼블릭 환경에 대한 액세스를 비활성화하려면 먼저 제한으로 IAM 정책을 업데이트한 다음 계정의 모든 CloudShell 사용자가 CloudShell 웹 사용자 인터페이스(**작업** → **CloudShell 환경 삭제**)를 사용하여 기존 퍼블릭 환경을 수동으로 삭제해야 합니다.

## VPC 설정에 대한 조건 키가 있는 정책의 예제
<a name="vpc-condition-keys-examples-1"></a>

다음 예제에서는 VPC 설정에 조건 키를 사용하는 방법을 보여줍니다. 원하는 제한 사항이 있는 정책 구문을 생성한 후 대상 사용자 또는 역할에 대한 정책 구문을 추가합니다.

### 사용자가 VPC 환경만 생성할 수 있도록 하고 퍼블릭 환경 생성은 거부
<a name="permission-to-create-VPC-env-only-example-1"></a>

사용자가 VPC 환경만 생성할 수 있도록 하려면 다음 예제와 같이 거부 권한을 사용합니다.

```
{
  "Statement": [
    {
      "Sid": "DenyCloudShellNonVpcEnvironments",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudshell:VpcIds": "true"
        }
      }
    }
  ]
}
```

### 특정 VPC, 서브넷 또는 보안 그룹에 대한 사용자 액세스 거부
<a name="permission-deny-access-example-1"></a>

특정 VPC에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `cloudshell:VpcIds` 조건 값을 확인합니다. 다음 예제에서는 `vpc-1` 및 `vpc-2`에 대한 사용자 액세스를 거부합니다.

특정 VPC에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `cloudshell:SubnetIds` 조건 값을 확인합니다. 다음 예제에서는 `subnet-1` 및 `subnet-2`에 대한 사용자 액세스를 거부합니다.

특정 VPC에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `cloudshell:SecurityGroupIds` 조건 값을 확인합니다. 다음 예제에서는 `sg-1` 및 `sg-2`에 대한 사용자 액세스를 거부합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceOutOfSecurityGroups",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "cloudshell:SecurityGroupIds": [
            "sg-1",
            "sg-2"
          ]
        }
      }
    }
  ]
}
```

------

### 사용자가 특정 VPC 구성으로 환경을 생성할 수 있도록 허용
<a name="create-env-with-specific-VPC-conf-1"></a>

특정 VPC에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `cloudshell:VpcIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `vpc-1` 및 `vpc-2`에 액세스하도록 허용합니다.

특정 VPC에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `cloudshell:SubnetIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `subnet-1` 및 `subnet-2`에 액세스하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceStayInSpecificSubnets",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "cloudshell:SubnetIds": [
            "subnet-1",
            "subnet-2"
          ]
        }
      }
    }
  ]
}
```

------

특정 VPC에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `cloudshell:SecurityGroupIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `sg-1` 및 `sg-2`에 액세스하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceStayInSpecificSecurityGroup",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "cloudshell:SecurityGroupIds": [
            "sg-1",
            "sg-2"
          ]
        }
      }
    }
  ]
}
```

------