

 AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用这项服务。[了解详情](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

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

# 使用访问无入口 EC2 实例 AWS Systems Manager
<a name="ec2-ssm"></a>

为 EC2 环境创建的 “无入口 EC2 实例” 可以 AWS Cloud9 连接到其 Amazon EC2 实例，而无需在该实例上打开任何入站端口。使用控制台、命令行界面或 [CloudFormation 堆栈](#cfn-role-and-permissions)创建 EC2 环境时，可以选择非入口选项。有关如何使用控制台或命令行界面创建环境的更多信息，请参阅[步骤 1：创建环境](tutorials-basic.md#tutorial-create-environment)。

**重要**  
使用 Systems Manager 会话管理器管理与 EC2 实例的连接不会产生额外费用。

在  控制台的 **Create environment**（创建环境）部分选择环境类型时，您可以选择需要入站连接的新 EC2 实例，也可以选择不需要以下各项的新的非入口 EC2 实例：
+ **[New EC2 instance](create-environment-main.md#create-environment-console)**（新 EC2 实例）– 选择此设置时，实例的安全组具有允许传入的网络流量的规则。将传入的网络流量限制为[已获批连接 AWS Cloud9 的 IP 地址](ip-ranges.md)。开放的入站端口 AWS Cloud9 允许通过 SSH 连接到其实例。如果您使用 S AWS ystems Manager 会话管理器，则无需打开入站端口（无入口）即可通过 SSM 访问您的 Amazon EC2 实例。此方法仅适用于新 Amazon EC2 实例。有关更多信息，请参阅 [在 EC2 环境中使用 Systems Manager 的益处](#ssm-benefits)。
+ **[Existing compute](create-environment-main.md#create-environment-console)**（现有计算）– 通过此设置，可以访问需要 SSH 登录详细信息的现有 Amazon EC2 实例，该实例必须具有对应的入站安全组规则。如果您选择此选项，则会自动创建服务角色。您可以在设置屏幕底部的备注中查看服务角色的名称。

如果使用 [AWS CLI](tutorials-basic.md#tutorial-create-environment) 创建环境，您可以在调用 `create-environment-ec2` 命令时设置 `--connection-type CONNECT_SSM` 选项来配置非入口 EC2 实例。有关创建所需的服务角色和实例配置文件的更多信息，请参阅 [使用管理 Systems Manager 的实例配置文件 AWS CLI](#aws-cli-instance-profiles)。

使用非入口 EC2 实例完成创建环境后，请确认以下事项：
+ Systems Manager 会话管理器具有代表您对 EC2 实例执行操作的权限。有关更多信息，请参阅 [管理 Systems Manager 权限](#service-role-ssm)。
+ AWS Cloud9 用户可以访问会话管理器管理的实例。有关更多信息，请参阅 [授予用户访问由会话管理器管理的实例的权限](#access-ec2-session)。

## 在 EC2 环境中使用 Systems Manager 的益处
<a name="ssm-benefits"></a>

允许[会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)处理与其 EC2 实例 AWS Cloud9 之间的安全连接有两个主要好处：
+ 无需为实例打开入站端口
+ 将实例启动到公有子网或私有子网内的选项

------
#### [ No open inbound ports ]

与其 EC2 实例 AWS Cloud9 之间的安全连接由[会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)处理。会话管理器是一项完全托管的 S AWS Cloud9 ystems Manager 功能，无需打开入站端口即可连接到其 EC2 实例。

**重要**  
使用 Systems Manager 进行非入口连接的选项目前仅在创建新的 EC2 环境时可用。

 随着会话管理器会话的启动，将建立与目标实例的连接。建立连接后，环境现在可以通过 Systems Manager 服务与实例进行交互。Systems Manager 服务通过 Systems Manager Agent ([SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)) 与实例交互。

原定设置情况下，SSM Agent 安装在 EC2 环境使用的所有实例上。

------
#### [ Private/public subnets ]

当在 **Network settings (advanced) 网络设置（高级）**部分中为实例选择子网时，如果环境实例通过 Systems Manager 访问，则可以选择私有子网或公有子网。

![为您的环境选择新的非入口 EC2 实例](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/images/private-subnet-option.png)


**私有子网**

对于私有子网，请确保实例仍然可以连接到 SSM 服务。此操作可以通过[在公有子网中设置 NAT 网关](https://aws.amazon.com/premiumsupport/knowledge-center/nat-gateway-vpc-private-subnet)或者[为 Systems Manager 配置 VPC 终端节点](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints)完成。

使用 NAT 网关的优点在于它可以防止互联网启动到私有子网中的实例的连接。为您的环境的实例分配了一个私有 IP 地址，而不是公有 IP 地址。因此，NAT 网关会将流量从实例转发到互联网或其他 AWS 服务，然后将响应发送回实例。

对于 VPC 选项，请为 Systems Manager 创建至少三个所需的*接口端点*：*com.amazonaws.region.ssm*、*com.amazonaws.region.ec2messages* 和 *com.amazonaws.region.ssmmessages*。有关更多信息，请参阅 *AWS Systems Manager 用户指南*中的[创建 Systems Manager 的 VPC 终端节点](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html#sysman-setting-up-vpc-create)。

**重要**  
目前，如果您的环境的 EC2 实例启动到私有子网，则无法使用[AWS 托管临时证书](security-iam.md#auth-and-access-control-temporary-managed-credentials)允许 EC2 环境代表 AWS 实体（例如 IAM 用户）访问 AWS 服务。

**公有子网**

如果您的开发环境使用 SSM 访问 EC2 实例，请确保该实例被启动到的公有子网分配了公有 IP 地址。为此，您可以指定自己的 IP 地址或启用公有 IP 地址的自动分配。有关修改自动分配 IP 设置所涉及的步骤，请参阅 *Amazon VPC 用户指南*中的[您的 VPC 中的 IP 地址](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html)。

有关为环境实例配置私有子网和公有子网的更多信息，请参阅 [为创建子网 AWS Cloud9](vpc-settings.md#vpc-settings-create-subnet)。

------

## 管理 Systems Manager 权限
<a name="service-role-ssm"></a>

默认情况下，Systems Manager 没有在您的 EC2 实例上执行操作的权限。通过 AWS Identity and Access Management (IAM) 实例配置文件提供访问权限。（实例配置文件是一个容器，可在启动时将 IAM 角色信息传递给 EC2 实例。）

当您使用 AWS Cloud9 控制台创建无入口 EC2 实例时，系统会自动为您创建服务角色 (`AWSCloud9SSMAccessRole`) 和 IAM 实例配置文件 (`AWSCloud9SSMInstanceProfile`)。（您可以在 IAM 管理控制台中查看 `AWSCloud9SSMAccessRole`。实例配置文件不会显示在 IAM 控制台中。） 

**重要**  
如果您首次使用创建无入口 EC2 环境 AWS CLI，则必须明确定义所需的服务角色和实例配置文件。有关更多信息，请参阅 [使用管理 Systems Manager 的实例配置文件 AWS CLI](#aws-cli-instance-profiles)。

**重要**  
如果您正在创建 AWS Cloud9 环境并使用附加`AWSCloud9Administrator`或`AWSCloud9User`策略的 Amazon EC2 Systems Manager，则还必须附加具有特定 IAM 权限的自定义策略，请参阅[用于创建 SSM 环境的自定义 IAM 策略](security-iam.md#custom-policy-ssm-environment)。这是由于 `AWSCloud9Administrator` 和 `AWSCloud9User` 策略存在权限问题。

为了提供额外的安全保护， AWS Cloud9 服务相关角色的`AWSCloud9ServiceRolePolicy`策略中存在`PassRole`限制。`AWSServiceRoleforAWSCloud9`在您将 IAM 角色*传递*到服务时，则允许该服务代入该角色并代表您执行操作。在这种情况下，该`PassRole`权限可确保 AWS Cloud9 只能将`AWSCloud9SSMAccessRole`角色（及其权限）传递给 EC2 实例。这将可以在 EC2 实例上执行的操作限制为仅 AWS Cloud9要求的操作。

**注意**  
如果您不再需要使用 Systems Manager 来访问实例，您可以删除 `AWSCloud9SSMAccessRole` 服务角色。有关更多信息，请参阅 *IAM 用户指南*中的[删除角色或实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html)。

### 使用管理 Systems Manager 的实例配置文件 AWS CLI
<a name="aws-cli-instance-profiles"></a>

您还可以使用 AWS CLI创建非入口 EC2 环境。当您调用 `create-environment-ec2` 时，将 `--connection-type` 选项设置为 `CONNECT_SSM`。

如果您使用此选项，则 `AWSCloud9SSMAccessRole` 服务角色和 `AWSCloud9SSMInstanceProfile` 不会自动创建。因此，要创建所需的服务配置文件和实例配置文件，请执行下列操作之一：
+ 使用控制台创建 EC2 环境，然后 `AWSCloud9SSMAccessRole` 服务角色和 `AWSCloud9SSMInstanceProfile` 之后将自动创建。创建后，服务角色和实例配置文件可用于其他使用 AWS CLI创建的 EC2 环境。
+ 运行以下 AWS CLI 命令以创建服务角色和实例配置文件。

  ```
  aws iam create-role --role-name AWSCloud9SSMAccessRole --path /service-role/ --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{"Effect": "Allow","Principal": {"Service": ["ec2.amazonaws.com","cloud9.amazonaws.com"]      },"Action": "sts:AssumeRole"}]}'
  aws iam attach-role-policy --role-name AWSCloud9SSMAccessRole --policy-arn arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile
  aws iam create-instance-profile --instance-profile-name AWSCloud9SSMInstanceProfile --path /cloud9/
  aws iam add-role-to-instance-profile --instance-profile-name AWSCloud9SSMInstanceProfile --role-name AWSCloud9SSMAccessRole
  ```

## 授予用户访问由会话管理器管理的实例的权限
<a name="access-ec2-session"></a>

要打开通过 Systems Manager 连接到 EC2 实例的 AWS Cloud9 环境，用户必须拥有 API 操作权限`StartSession`。此操作为会话管理器会话启动与托管 EC2 实例的连接。您可以使用 AWS Cloud9 特定的托管策略（推荐）或编辑 IAM 策略并添加必要的权限来授予用户访问权限。


****  

| 方法 | 说明 | 
| --- | --- | 
| 使用 AWS Cloud9特定的托管策略 | 我们建议使用 AWS 托管策略允许用户访问由 Systems Manager 管理的 EC2 实例。托管策略为标准 AWS Cloud9 用例提供了一组权限，并且可以轻松地附加到 IAM 实体。<br />所有托管式策略还包括运行 `StartSession` API 操作的权限。以下是专用于的托管策略 AWS Cloud9：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/ec2-ssm.html) 如果您正在创建 AWS Cloud9 环境并使用附加`AWSCloud9Administrator`或`AWSCloud9User`策略的 Amazon EC2 Systems Manager，则还必须附加具有特定 IAM 权限的自定义策略，请参阅[用于创建 SSM 环境的自定义 IAM 策略](security-iam.md#custom-policy-ssm-environment)。这是由于 `AWSCloud9Administrator` 和 `AWSCloud9User` 策略存在权限问题。 <br />有关更多信息，请参阅 [AWS 的托管策略 AWS Cloud9](security-iam.md#auth-and-access-control-managed-policies)。 | 
| 编辑 IAM 策略并添加所需的策略语句 | 要编辑现有策略，您可以添加对于 `StartSession` API 的权限。要使用 AWS 管理控制台 或编辑策略 AWS CLI，请按照 IAM *用户指南*中[编辑 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/#edit-managed-policy-console)提供的说明进行操作。<br />编辑策略时，添加允许要运行的 `ssm:startSession` API 操作的 [policy statement](#policy-statement)（请参阅下面的内容）。 | 

您可以使用以下权限运行 `StartSession` API 操作。`ssm:resourceTag`条件键指定可以为任何实例 (`Resource: arn:aws:ec2:*:*:instance/*`) 启动会话管理器会话，前提是该实例是 AWS Cloud9 EC2 开发环境 (`aws:cloud9:environment`)。

**注意**  
以下托管式策略还包括这些策略语句：`AWSCloud9Administrator`、`AWSCloud9User` 和 `AWSCloud9EnvironmentMember`。

```
{
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/aws:cloud9:environment": "*"
                },
                "StringEquals": {
                    "aws:CalledViaFirst": "cloud9.amazonaws.com"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:document/*"
            ]
        }
```

## CloudFormation 用于创建无入口的 EC2 环境
<a name="cfn-role-and-permissions"></a>

使用 [CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html)定义非入口 Amazon EC2 开发环境，请在创建堆栈之前执行以下操作：

1. 创建 `AWSCloud9SSMAccessRole` 服务角色和 `AWSCloud9SSMInstanceProfile` 实例配置文件。有关更多信息，请参阅 [使用 CloudFormation 模板创建服务角色和实例配置文件](#creating-cfn-instance-profile)。

1. 更新调用 IAM 实体的策略 CloudFormation。这样，此实体可以启动连接到 EC2 实例的会话管理器会话。有关更多信息，请参阅 [将 Systems Manager 权限添加到 IAM 策略](#updating-IAM-policy)。

### 使用 CloudFormation 模板创建服务角色和实例配置文件
<a name="creating-cfn-instance-profile"></a>

您需要创建服务角色 `AWSCloud9SSMAccessRole` 和实例配置文件 `AWSCloud9SSMInstanceProfile` 以使 Systems Manager 能够管理支持您的开发环境的 EC2 实例。

如果您之前创建`AWSCloud9SSMAccessRole`并`AWSCloud9SSMInstanceProfile`通过创建无入口的 EC2 环境[with the console](#using-the-console)或[运行 AWS CLI 命令](#aws-cli-instance-profiles)，则服务角色和实例配置文件已经可供使用。

**注意**  
假设您尝试为无入口的 EC2 环境创建 CloudFormation 堆栈，但没有先创建所需的服务角色和实例配置文件。那么，不会创建堆栈，并显示以下错误消息：  
账户中不存在实例 AWSCloud9SSMInstance配置文件。

首次使用创建无入口 EC2 环境时 CloudFormation，可以在模板中将`AWSCloud9SSMAccessRole`和定义`AWSCloud9SSMInstanceProfile`为 IAM 资源。

摘自示例模板的此内容显示了如何定义这些资源。该`AssumeRole`操作会返回安全证书，这些证书提供对 AWS Cloud9 环境及其 EC2 实例的访问权限。

```
AWSTemplateFormatVersion: 2010-09-09
Resources: 
  AWSCloud9SSMAccessRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
              - cloud9.amazonaws.com
              - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Description: 'Service linked role for AWS Cloud9'
      Path: '/service-role/'
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile
      RoleName: 'AWSCloud9SSMAccessRole'

  AWSCloud9SSMInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties: 
      InstanceProfileName: AWSCloud9SSMInstanceProfile
      Path: "/cloud9/"
      Roles: 
        - 
          Ref: AWSCloud9SSMAccessRole
```

### 将 Systems Manager 权限添加到 IAM 策略
<a name="updating-IAM-policy"></a>

在 [CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html)中[定义服务角色和实例配置文件](#creating-cfn-instance-profile)后，请确保创建堆栈的 IAM 实体具有启动会话管理器会话的权限。会话是使用会话管理器建立的与 EC2 实例的连接。

**注意**  
如果您没有在为非入口 EC2 环境创建堆栈之前添加启动会话管理器会话的权限，则会返回 `AccessDeniedException` 错误。

通过调用 CloudFormation，向 IAM 实体的策略添加以下权限。

```
{
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/aws:cloud9:environment": "*"
                },
                "StringEquals": {
                    "aws:CalledViaFirst": "cloudformation.amazonaws.com"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:document/*"
            ]
        }
```

## 为 Amazon S3 配置 VPC 终端节点以下载依赖项
<a name="configure-s3-endpoint"></a>

如果您 AWS Cloud9 环境的 EC2 实例无法访问互联网，请为指定的 Amazon S3 存储桶创建 VPC 终端节点。此存储桶包含保留 IDE 所需的依赖项 up-to-date。

为 Amazon S3 设置 VPC 端点还涉及自定义访问策略。您希望访问策略仅允许访问包含要下载的依赖项的可信 S3 桶。

**注意**  
您可以使用、或 Amazon VPC API 创建和配置 VPC 终端节点。 AWS 管理控制台 AWS CLI以下过程说明如何使用控制台界面创建 VPC 端点。<a name="create-s3-endpoint"></a>

## 为 Amazon S3 创建和配置 VPC 终端节点
<a name="create-s3-endpoint"></a>

1. 在中 AWS 管理控制台，前往 Amazon VPC 的控制台页面。

1. 在导航窗格中，选择 **Endpoints（端点）**。

1. 在 **Endpoints（端点）**页面中，选择 **Create Endpoint（创建端点）**。

1. 在 **Create Endpoint**（创建端点）页面中，在搜索字段中输入“s3”，然后按 **Return**（返回）以列出 Amazon S3 在当前 AWS 区域内可用的端点。

1. 从返回的 Amazon S3 端点列表中选择 **Gateway（网关）**类型。

1. 接下来，选择包含您环境的 EC2 实例的 VPC。

1. 现在选择 VPC 的路由表。这样，关联的子网可以访问端点。您环境的 EC2 实例位于其中一个子网中。

1. 在 **Policy**（策略）部分，选择 **Custom**（自定义）选项，并将标准策略替换为以下策略。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
         {
             "Sid": "Access-to-C9-bucket-only",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::{bucket_name}/content/dependencies/*"
         }
     ]
   }
   ```

------

   对于 `Resource` 元素，将 `{bucket_name}` 替换为您的 AWS 区域内可用的桶的实际名称。例如，如果您 AWS Cloud9 在欧洲（爱尔兰）地区使用，则需要指定以下内容：`"Resource": "arn:aws:s3:::static-eu-west-1-prod-static-hld3vzaf7c4h/content/dependencies/`。

   下表列出了可用 AWS 区域 位置 AWS Cloud9 的存储桶名称。  
**区域中的 AWS Cloud9 亚马逊 S3 存储桶**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/cloud9/latest/user-guide/ec2-ssm.html)

1. 选择**创建端点**。

   如果您提供了正确的配置信息，则会出现一条消息，显示已创建的端点的 ID。

1. 要检查您的 IDE 是否可以访问 Amazon S3 存储桶，请在菜单栏选择 **Window（窗口）**> **New Terminal（新建终端）**以启动终端会话。然后，运行下面的命令，同时将 `{bucket_name}` 替换为您的区域的桶名称。

   ```
   ping {bucket_name}.s3.{region}.amazonaws.com.
   ```

   例如，如果您在美国东部（弗吉尼亚州北部）区域为 S3 桶创建了端点，则运行以下命令。

   ```
   ping static-us-east-1-prod-static-mft1klnkc4hl.s3.us-east-1.amazonaws.com
   ```

   如果 ping 得到响应，则确认 IDE 可以访问该存储桶及其依赖项。

有关此功能的更多信息，请参阅*AWS PrivateLink指南*[中的 Amazon S3 终端节点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)。

## 为私有连接配置 VPC 终端节点
<a name="configure-no-egress"></a>

当您将实例启动到带有 **access using Systems Manager**（使用 Systems Manager 访问）选项的子网内，则其安全组没有允许传入网络流量的入站规则。但是，安全组具有出站规则，以允许来自实例的出站流量。这是下载使 AWS Cloud9 IDE 保持最新状态所需的软件包和库所必需的。

要防止实例的出站和入站流量，请为 Systems Manager 创建和配置 Amazon VPC 端点。使用接口 VPC 终端节点（接口终端节点），您可以连接到由提供支持的服务[AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html)。 AWS PrivateLink 是一种可用于使用私有 IP 地址私有访问 Amazon EC2 和 System APIs s Manager 的技术。要将 VPC 终端节点配置为使用 Systems Manager，请按照此[知识中心资源](https://aws.amazon.com/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/)提供的说明进行操作。

**警告**  
假设您配置的安全组不允许入站或出站网络流量。然后，支持您的 AWS Cloud9 IDE 的 EC2 实例无法访问互联网。您需要创建一个[适用于您的 VPC 的 Amazon S3 端点](#configure-s3-endpoint)，以允许访问包含在可信 S3 桶中的依赖项。此外，如果没有互联网接入 AWS 服务 AWS Lambda，有些内容（例如）可能无法按预期运行。  
使用 AWS PrivateLink，通过 VPC 终端节点处理的每 GB 会产生数据处理费用。这与流量的来源或目的地无关。有关更多信息，请参阅[AWS PrivateLink 定价](https://aws.amazon.com/privatelink/pricing/)。