使用 AWS Systems Manager 访问非入口 EC2 实例 - AWS Cloud9

AWS Cloud9 不再向新客户提供。的现有客户 AWS Cloud9 可以继续照常使用该服务。了解更多”

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

使用 AWS Systems Manager 访问非入口 EC2 实例

为 EC2 环境创建的“非入口 EC2 实例”使 AWS Cloud9 能够路连接到其 Amazon EC2 实例,而无需打开该实例上的任何入站端口。在使用控制台命令行界面AWS CloudFormation 堆栈创建 EC2 环境时,您可以选择非入口选项。

重要

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

控制台的 Create environment(创建环境)部分选择环境类型时,您可以选择需要入站连接的新 EC2 实例,也可以选择不需要以下各项的新的非入口 EC2 实例:

  • New EC2 instance(新 EC2 实例)– 选择此设置时,实例的安全组具有允许传入的网络流量的规则。将传入的网络流量限制为已获批连接 AWS Cloud9 的 IP 地址。打开的入站端口使 AWS Cloud9 能够通过 SSH 连接到其实例。如果您使用 AWS Systems Manager 会话管理器,则可以通过 SSM 访问您的 Amazon EC2 实例,而无需打开入站端口(无入口)。此方法仅适用于新 Amazon EC2 实例。有关更多信息,请参阅在 EC2 环境中使用 Systems Manager 的益处

  • Existing compute(现有计算)– 通过此设置,可以访问需要 SSH 登录详细信息的现有 Amazon EC2 实例,该实例必须具有对应的入站安全组规则。如果您选择此选项,则会自动创建服务角色。您可以在设置屏幕底部的备注中查看服务角色的名称。

如果使用 AWS CLI 创建环境,您可以在调用 create-environment-ec2 命令时设置 --connection-type CONNECT_SSM 选项来配置非入口 EC2 实例。有关创建所需的服务角色和实例配置文件的更多信息,请参阅 使用 AWS CLI 管理 Systems Manager 的实例配置文件

使用非入口 EC2 实例完成创建环境后,请确认以下事项:

在 EC2 环境中使用 Systems Manager 的益处

允许会话管理器来处理 AWS Cloud9 及其 EC2 实例之间的安全连接有两个重大益处:

  • 无需为实例打开入站端口

  • 将实例启动到公有子网或私有子网内的选项

No open inbound ports

AWS Cloud9 与其 EC2 实例之间的安全连接由会话管理器处理。会话管理器是一种完全托管式的 Systems Manager 功能,可启用 AWS Cloud9 到其 EC2 实例的连接,无需打开入站端口。

重要

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

随着会话管理器会话的启动,将建立与目标实例的连接。建立连接后,环境现在可以通过 Systems Manager 服务与实例进行交互。Systems Manager 服务通过 Systems Manager Agent (SSM Agent) 与实例交互。

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

Private/public subnets

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

为您的环境选择新的非入口 EC2 实例

私有子网

对于私有子网,请确保实例仍然可以连接到 SSM 服务。此操作可以通过在公有子网中设置 NAT 网关或者为 Systems Manager 配置 VPC 终端节点完成。

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

对于 VPC 选项,请为 Systems Manager 创建至少三个所需的接口端点com.amazonaws.region.ssmcom.amazonaws.region.ec2messagescom.amazonaws.region.ssmmessages。有关更多信息,请参阅 AWS Systems Manager 用户指南中的创建 Systems Manager 的 VPC 终端节点

重要

目前,如果您的环境的 EC2 实例启动到私有子网,则无法使用 AWS 托管式临时凭证来允许 EC2 环境代表 AWS 实体(例如 IAM 用户)访问 AWS 服务。

公有子网

如果您的开发环境使用 SSM 访问 EC2 实例,请确保该实例被启动到的公有子网分配了公有 IP 地址。为此,您可以指定自己的 IP 地址或启用公有 IP 地址的自动分配。有关修改自动分配 IP 设置所涉及的步骤,请参阅 Amazon VPC 用户指南中的您的 VPC 中的 IP 地址

有关为环境实例配置私有子网和公有子网的更多信息,请参阅 为创建子网 AWS Cloud9

管理 Systems Manager 权限

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

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

重要

如果您首次使用 AWS CLI 创建非入口 EC2 环境,您必须明确定义所需的服务角色和实例配置文件。有关更多信息,请参阅使用 AWS CLI 管理 Systems Manager 的实例配置文件

重要

如果您正在创建 AWS Cloud9 环境并使用附加了 AWSCloud9AdministratorAWSCloud9User 策略的 Amazon EC2 Systems Manager,则还必须附加具有特定 IAM 权限的自定义策略,请参阅用于创建SSM环境的自定义IAM策略。这是由于 AWSCloud9AdministratorAWSCloud9User 策略存在权限问题。

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

注意

如果您不再需要使用 Systems Manager 来访问实例,您可以删除 AWSCloud9SSMAccessRole 服务角色。有关更多信息,请参阅 IAM 用户指南中的删除角色或实例配置文件

使用 AWS CLI 管理 Systems Manager 的实例配置文件

您还可以使用 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

授予用户访问由会话管理器管理的实例的权限

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

方法 描述

使用特定于 AWS Cloud9 的托管式策略

我们建议使用 AWS 托管式策略,以允许用户访问由 Systems Manager 管理的 EC2 实例。托管式策略为标准 AWS Cloud9 使用案例提供一系列权限,并且可以轻松地附到 IAM 实体上。

所有托管式策略还包括运行 StartSession API 操作的权限。以下是特定于 AWS Cloud9 的托管式策略:

  • AWSCloud9Administrator (arn:aws:iam::aws:policy/AWSCloud9Administrator)

  • AWSCloud9User (arn:aws:iam::aws:policy/AWSCloud9User)

  • AWSCloud9EnvironmentMember (arn:aws:iam::aws:policy/AWSCloud9EnvironmentMember)

重要

如果您正在创建 AWS Cloud9 环境并使用附加了 AWSCloud9AdministratorAWSCloud9User 策略的 Amazon EC2 Systems Manager,则还必须附加具有特定 IAM 权限的自定义策略,请参阅用于创建SSM环境的自定义IAM策略。这是由于 AWSCloud9AdministratorAWSCloud9User 策略存在权限问题。

有关更多信息,请参阅AWS 的托管策略 AWS Cloud9

编辑 IAM 策略并添加所需的策略语句

要编辑现有策略,您可以添加对于 StartSession API 的权限。要使用 AWS Management Console 或 AWS CLI 编辑策略,请参阅《IAM 用户指南》中的编辑 IAM policy 所提供的说明。

编辑策略时,添加允许要运行的 ssm:startSession API 操作的 policy statement(请参阅下面的内容)。

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

注意

以下托管式策略还包括这些策略语句:AWSCloud9AdministratorAWSCloud9UserAWSCloud9EnvironmentMember

{ "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/*" ] }

使用 AWS CloudFormation 创建非入口 EC2 环境

使用 AWS CloudFormation 模板定义非入口 Amazon EC2 开发环境,请在创建堆栈之前执行以下操作:

  1. 创建 AWSCloud9SSMAccessRole 服务角色和 AWSCloud9SSMInstanceProfile 实例配置文件。有关更多信息,请参阅使用 AWS CloudFormation 模板创建服务角色和实例配置文件

  2. 更新 IAM 实体调用 AWS CloudFormation 的策略。这样,此实体可以启动连接到 EC2 实例的会话管理器会话。有关更多信息,请参阅将 Systems Manager 权限添加到 IAM 策略

使用 AWS CloudFormation 模板创建服务角色和实例配置文件

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

如果您之前已通过创建非入口 EC2 环境 with the console运行 AWS CLI 命令来创建 AWSCloud9SSMAccessRoleAWSCloud9SSMInstanceProfile,则服务角色和实例配置文件已可用。

注意

假设您尝试为非入口 EC2 环境创建 AWS CloudFormation 堆栈,但没有首先创建所需的服务角色和实例配置文件。那么,不会创建堆栈,并显示以下错误消息:

账户中不存在实例配置文件 AWSCloud9SSMInstanceProfile。

首次使用 AWS CloudFormation 创建非入口 EC2 环境时,您可以在模板中将 AWSCloud9SSMAccessRoleAWSCloud9SSMInstanceProfile 定义为 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 策略

AWS CloudFormation 模板定义服务角色和实例配置文件后,请确保创建堆栈的 IAM 实体具有启动会话管理器会话的权限。会话是使用会话管理器建立的与 EC2 实例的连接。

注意

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

通过调用 AWS 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 终端节点以下载依赖项

如果您的 AWS Cloud9 环境的 EC2 实例无法访问互联网,您需要为指定的 Amazon S3 桶创建 VPC 端点。此存储桶包含使 IDE 保持最新状态所需的依赖项。

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

注意

您可以使用 AWS Management Console、AWS CLI 或 Amazon VPC API 来创建和配置 VPC 终端节点。以下过程说明如何使用控制台界面创建 VPC 端点。

为 Amazon S3 创建和配置 VPC 终端节点

  1. 在 AWS Management Console,转至 Amazon VPC 的控制台页面。

  2. 在导航窗格中,选择 Endpoints(端点)

  3. Endpoints(端点)页面中,选择 Create Endpoint(创建端点)

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

  5. 从返回的 Amazon S3 端点列表中选择 Gateway(网关)类型。

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

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

  8. Policy(策略)部分,选择 Custom(自定义)选项,并将标准策略替换为以下策略。

    { "Version": "2008-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 Cloud9 可用的 AWS 区域 的桶名称。

    AWS Cloud9 区域的 Amazon S3 存储桶
    AWS 区域 存储桶名称

    美国东部(俄亥俄州)

    static-us-east-2-prod-static-1c3sfcvf9hy4m

    美国东部(弗吉尼亚北部)

    static-us-east-1-prod-static-mft1klnkc4hl

    美国西部(俄勒冈州)

    static-us-west-2-prod-static-p21mksqx9zlr

    美国西部(北加利福尼亚)

    static-us-west-1-prod-static-16d59zrrp01z0

    非洲(开普敦)

    static-af-south-1-prod-static-v6v7i5ypdppv

    亚太地区(香港)

    static-ap-east-1-prod-static-171xhpfkrorh6

    Asia Pacific (Mumbai)

    static-ap-south-1-prod-static-ykocre202i9d

    亚太地区(大阪)

    static-ap-northeast-3-prod-static-ivmxqzrx2ioi

    亚太地区(首尔)

    static-ap-northeast-2-prod-static-1wxyctlhwiajm

    亚太地区(新加坡)

    static-ap-southeast-1-prod-static-13ibpyrx4vk6d

    亚太地区(悉尼)

    static-ap-southeast-2-prod-static-1cjsl8bx27rfu

    亚太地区(东京)

    static-ap-northeast-1-prod-static-4fwvbdisquj8

    加拿大(中部)

    static-ca-central-1-prod-static-g80lpejy486c

    欧洲地区(法兰克福)

    static-eu-central-1-prod-static-14lbgls2vrkh

    欧洲地区(爱尔兰)

    static-eu-west-1-prod-static-hld3vzaf7c4h

    欧洲地区(伦敦)

    static-eu-west-2-prod-static-36lbg202837x

    欧洲地区(米兰)

    static-eu-south-1-prod-static-1379tzkd3ni7d

    欧洲地区(巴黎)

    static-eu-west-3-prod-static-1rwpkf766ke58

    欧洲地区(斯德哥尔摩)

    static-eu-north-1-prod-static-1qzw982y7yu7e

    中东(巴林)

    static-me-south-1-prod-static-gmljex38qtqx

    南美洲(圣保罗)

    static-sa-east-1-prod-static-1cl8k0y7opidt

    以色列(特拉维夫)

    static-il-central-1-prod-static-k02vrnhcesue

  9. 选择 Create Endpoint(创建端点)

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

  10. 要检查您的 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 的端点

为私有连接配置 VPC 终端节点

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

要防止实例的出站和入站流量,请为 Systems Manager 创建和配置 Amazon VPC 端点。通过接口 VPC 端点(接口端点),您可以连接到 AWS PrivateLink 支持的服务。AWS PrivateLink 技术可用于通过使用私有 IP 地址私下访问 Amazon EC2 和 Systems Manager API。要将 VPC 终端节点配置为使用 Systems Manager,请按照此知识中心资源提供的说明进行操作。

警告

假设您配置的安全组不允许入站或出站网络流量。然后,支持您的 AWS Cloud9 IDE 的 EC2 实例无法访问互联网。您需要创建一个适用于您的 VPC 的 Amazon S3 端点,以允许访问包含在可信 S3 桶中的依赖项。此外,如果无法访问互联网,一些 AWS services(如 AWS Lambda)可能无法按预期工作。

选择 AWS PrivateLink 后,对于通过 VPC 端点处理的每个 GB 都会收取数据处理费用。这与流量的来源或目的地无关。有关更多信息,请参阅 AWS PrivateLink 定价