

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS CloudShell 在亚马逊 VPC 中使用
<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 上传和下载选项。
**注意**  
可以从可 ingress/egress 通过其他 CLI 工具访问互联网的 VPC 环境中上传或下载文件。
+ VPC 环境不支持永久存储。支持临时性存储。活动环境会话结束后，数据和主目录将被删除。
+ 您的 AWS CloudShell 环境只有在私有 VPC 子网中才能连接到互联网。
**注意**  
默认情况下，不向 CloudShell VPC 环境分配公有 IP 地址。在将路由表配置为将所有流量路由到互联网网关的公有子网中创建的 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)。

# 创建 V CloudShell PC 环境
<a name="creating-vpc-environment"></a>

 本主题将引导您完成在中创建 VPC 环境的步骤 CloudShell。

**先决条件**

要创建 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 环境的一个或多个安全组。
**注意**  
最多可以选择五个安全组。

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 访问权限（包括 VPC 访问权限）的 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"
				}
			}
		}
	]
}
```

------

## 将 IAM 条件键用于 VPC 环境
<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"
        }
      }
    }
  ]
}
```

### 拒绝用户访问特定 VPCs、子网或安全组
<a name="permission-deny-access-example-1"></a>

要拒绝用户访问特定的 VPCs内容，`StringEquals`请使用检查`cloudshell:VpcIds`条件的值。以下示例拒绝用户访问 `vpc-1` 和 `vpc-2`：

要拒绝用户访问特定的 VPCs内容，`StringEquals`请使用检查`cloudshell:SubnetIds`条件的值。以下示例拒绝用户访问 `subnet-1` 和 `subnet-2`：

要拒绝用户访问特定的 VPCs内容，`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"
          ]
        }
      }
    }
  ]
}
```

------