

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon VPC AWS CloudShell 中使用
<a name="using-cshell-in-vpc"></a>

 AWS CloudShell 虛擬私有雲端 (VPC) 可讓您在 VPC 中建立 CloudShell 環境。對於每個 VPC 環境，您可以指派 VPC、新增子網路，並關聯最多五個安全群組。 AWS CloudShell 會繼承 VPC 的網路組態，並可讓您在與 VPC 中其他資源相同的子網路內 AWS CloudShell 安全地使用 ，並與其連線。

使用 Amazon VPC，您可以在已定義的邏輯隔離虛擬網路中啟動 AWS 資源。這個虛擬網路與您在資料中心中操作的傳統網路非常相似，且具備使用 AWS可擴展基礎設施的優勢。如需 VPC 的詳細資訊，請參閱 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)。

## 操作限制條件
<a name="limitations"></a>

AWS CloudShell VPC 環境有下列限制：
+ 每個 IAM 主體最多可以建立兩個 VPC 環境。
+ 您最多可以為 VPC 環境指派五個安全群組。
+ 您無法在 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 環境的步驟。

**先決條件**

您的管理員必須提供必要的 IAM 許可，您才能建立 VPC 環境。如需啟用建立 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 環境的一或多個安全群組。
**注意**  
您最多可以選擇五個安全群組。

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 環境建立ENIs 會加上**ManagedByCloudShell**金鑰標籤）。如果此許可未啟用，您必須在每次 CloudShell VPC 環境使用後手動清除 ENI 資源。

## 授予完整 CloudShell 存取權的 IAM 政策，包括對 VPC 的存取
<a name="cshell-vpc-full-access-example-1"></a>

下列範例顯示如何啟用 CloudShell 的完整許可，包括對 VPC 的存取：

------
#### [ 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` – 允許或拒絕一或多個 VPCs
+ `CloudShell:SubnetIds` – 允許或拒絕一或多個子網路
+ `CloudShell:SecurityGroupIds` – 允許或拒絕一或多個安全群組

**注意**  
如果修改可存取公有 CloudShell 環境的使用者許可，以對`cloudshell:createEnvironment`動作新增限制，他們仍然可以存取現有的公有環境。不過，如果您想要修改具有此限制的 IAM 政策，並停用其對現有公有環境的存取，您必須先更新具有限制的 IAM 政策，然後確保帳戶中的每個 CloudShell 使用者使用 CloudShell Web 使用者介面 (**動作** → **刪除 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>

若要允許使用者存取特定 VPCs，請使用 `StringEquals`檢查`cloudshell:VpcIds`條件的值。下列範例允許使用者存取 `vpc-1`和 `vpc-2`：

若要允許使用者存取特定 VPCs，請使用 `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"
          ]
        }
      }
    }
  ]
}
```

------

若要允許使用者存取特定 VPCs，請使用 `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"
          ]
        }
      }
    }
  ]
}
```

------