

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

# 使用云托管人和 AWS CDK 将适用于 Systems Manager 的 AWS 托管策略自动附加到 EC2 实例配置文件
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk"></a>

*Ali Asfour 和 Aaron Lennon，Amazon Web Services*

## Summary
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-summary"></a>

您可以将亚马逊弹性计算云 (Amazon EC2) 实例与 AWS Systems Manager 集成，以自动执行操作任务并提供更多的可见性和控制力。要与 Systems Manager 集成， EC2 实例必须安装一个 [AWS Systems Manager 代理 (SSM 代理)](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)，并在其实例配置文件上附加一个 A `AmazonSSMManagedInstanceCore` WS 身份和访问管理 (IAM) 策略。 

但是，如果您想确保所有 EC2 实例配置文件都附加了`AmazonSSMManagedInstanceCore`策略，则在更新没有 EC2 实例配置文件的新实例或 EC2 具有实例配置文件但没有`AmazonSSMManagedInstanceCore`策略的实例时可能会遇到困难。在多个 Amazon Web Services（AWS）账户和 AWS 区域 中添加此策略也可能很困难。

这种模式通过在 AWS 账户中部署三项[云托管人](https://cloudcustodian.io/)策略来帮助解决这些困难：
+ 第一个 Cloud Custodian 策略会检查是否有实例配置文件但没有该`AmazonSSMManagedInstanceCore`策略的现有 EC2 实例。然后附上 `AmazonSSMManagedInstanceCore` 策略。 
+ 第二个 Cloud Custodian 策略会检查没有 EC2 实例配置文件的现有实例，并添加附加了该`AmazonSSMManagedInstanceCore`策略的默认实例配置文件。
+ 第三项云托管人策略在您的账户中创建 [AWS Lambda](https://cloudcustodian.io/docs/aws/lambda.html) 函数，以监控实例和实例配置 EC2 文件的创建。这样可以确保在创建 EC2 实例时自动附加`AmazonSSMManagedInstanceCore`策略。

这种模式使用 [AWS DevOps](https://aws.amazon.com/devops/) 工具将云托管人策略持续大规模部署到多账户环境，无需配置单独的计算环境。 

## 先决条件和限制
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-prereqs"></a>

**先决条件**
+ 两个或以上活跃 AWS 账户。一个账户是*安全账户*，其他账户是*成员账户*。
+ 在安全账户中预调配 AWS 资源的权限。此模式使用[管理员权限](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)，但您应根据贵组织的要求和策略授予权限。
+ 能够从安全账户向成员账户分派 IAM 角色并创建所需 IAM 角色。有关更多信息，请参阅 IAM 文档中的[使用 IAM 角色跨 AWS 账户委派访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。
+ 
**重要**  
已安装和配置 AWS 命令行界面（AWS CLI）。出于测试目的，您可以使用 `aws configure` 命令或设置环境变量来配置 AWS CLI。：不建议在生产环境中这样做，我们建议仅向该账户授予访问的最低权限。有关更多信息，请参阅 IAM 文档中的[授予最低权限许可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 将 `devops-cdk-cloudcustodian.zip` 文件（附件）下载到本地计算机中。
+ 熟悉 Python。
+ 已安装并配置所需工具（Node.js、AWS Cloud Development Kit（AWS CDK）和 Git）。您可以使用 `install-prerequisites.sh` 文件中的 `devops-cdk-cloudcustodian.zip` 文件来****安装这些工具。****确保以根权限运行此文件。 

**限制**
+ 尽管这种模式可以在生产环境中使用，但请确保所有 IAM 角色和策略都符合贵组织的要求和政策。 

**软件包版本**
+ 云托管人版本 0.9 或更高版本
+ TypeScript 版本 3.9.7 或更高版本
+ Node.js 版本 14.15.4 或更高版本
+ `npm` 版本 7.6.1 或更高版本
+ AWS CDK 版本 1.96.0 或更高版本

## 架构
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-architecture"></a>

![](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/169a7bde-789e-4ebd-b4ca-80eb28ac9927/images/8ec0b6b4-d4b0-42e5-833d-24d1e6098fd9.png)


 

下图显示了如下工作流：

1. 云托管人策略被推送到安全账户中的 AWS CodeCommit 存储库。Amazon E CloudWatch vents 规则会自动启动 AWS CodePipeline 管道。

1. 该管道从中 CodeCommit 获取最新代码，并将其发送到 AWS 处理的持续集成和持续交付 (CI/CD) 管道的持续集成部分。 CodeBuild

1. CodeBuild 执行完整的 DevSecOps 操作，包括对 Cloud Custodian 策略进行策略语法验证，并在`--dryrun`模式下运行这些策略以检查识别了哪些资源。

1. 如果没有错误，则下一个任务会提醒管理员查看更改并批准向成员账户部署。

**技术堆栈**
+ AWS CDK
+ CodeBuild
+ CodeCommit
+ CodePipeline
+ IAM
+ Cloud Custodian 

**自动化和扩缩**

除了使用 CodePipeline AWS 堆栈部署 AWS 资源外，AWS CDK pipelines 模块还提供了一个 CI/CD 管道 CodeBuild，该管道用于协调源代码的构建和测试。 CloudFormation 您可以对贵组织中的所有成员账户和区域使用此模式。您还可以扩展 `Roles creation` 堆栈以在成员账户中部署其他 IAM 角色。 

## 工具
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-tools"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一个软件开发框架，用于在代码中定义云基础设施并通过 AWS CloudFormation 进行配置。
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一种开源工具，它使您能够使用命令行 Shell 中的命令与 Amazon Web Services 交互。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管的云端构建服务。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，您可以使用它来私下存储和管理资产。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 是一项持续交付服务，您可以使用它对发布软件所需的步骤进行建模、可视化和自动化。
+ [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 是一项 Web 服务，可帮助您安全地控制对 AWS 资源的访问。
+ [云托管人](https://cloudcustodian.io/)是一种工具，可将大多数组织用于管理其公共云账户的数十种工具和脚本统一到一个开源工具中。
+ [Node.js](https://nodejs.org/en/) 是一个基于谷歌浏览器 V8 JavaScript 引擎构建的 JavaScript 运行时。

**代码**

有关此模式中使用的模块、账户函数、文件和部署命令的详细列表，请参阅 `devops-cdk-cloudcustodian.zip` 文件（附件）中的 `README` 文件。

## 操作说明
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-epics"></a>

### 使用 AWS CDK 设置管线
<a name="set-up-the-pipeline-with-aws-cdk"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 CodeCommit 存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)有关这方面的更多信息，请参阅 AWS CodeCommit 文档中的[创建 CodeCommit 存储库](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-repository.html)。 | 开发者版 | 
| 安装所需工具。 | 使用该 `install-prerequisites.sh` 文件在 Amazon Linux 上安装所有必需的工具。这不包括 AWS CLI，因为它是预安装的。<br />有关这方面的更多信息，请参阅 AWS CDK 文档中的 [AWS CDK 入门](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_prerequisites)的[先决条件](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)部分。 | 开发者版 | 
| 安装所需 AWS CDK 软件包。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)以下软件包是 AWS CDK 的必需并且包含在 `requirements.txt` 文件中：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html) | 开发者版 | 

### 配置环境
<a name="configure-your-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新所需变量。 | 打开 CodeCommit 存储库根文件夹中的`vars.py`文件并更新以下变量：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html) | 开发者版 | 
| 使用成员账户信息更新 account.yml 文件。 | 要对多个账户运行 [c7n-org Cloud Custodian](https://cloudcustodian.io/docs/tools/c7n-org.html) 工具，必须将 `accounts.yml` 配置文件放在存储库的根目录中。以下是适用于 AWS 的一个示例云托管人配置文件：<pre>accounts:<br />- account_id: '123123123123'<br />  name: account-1<br />  regions:<br />  - us-east-1<br />  - us-west-2<br />  role: arn:aws:iam::123123123123:role/CloudCustodian<br />  vars:<br />    charge_code: xyz<br />  tags:<br />  - type:prod<br />  - division:some division<br />  - partition:us<br />  - scope:pci</pre> | 开发者版 | 

### 引导 AWS 账户
<a name="bootstrap-the-aws-accounts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 引导安全账户。 | 运行以下命令，使用 `cloudcustodian_stack` 应用程序引导 `deploy_account`：<pre>cdk bootstrap -a 'python3 <br />cloudcustodian/cloudcustodian_stack.py</pre> | 开发者版 | 
| 选项 1 – 自动引导成员账户。 | 如果在 `vars.py` 文件中将 `cdk_bootstrap_member_accounts` 变量设置为 `True`，则管线会自动引导 `member_accounts` 变量中指定的账户。<br />如果需要，您可以使用可从安全账户分派且具有引导 AWS CDK 所需权限的 IAM 角色更新 `*cdk_bootstrap_role*`。<br />管线会自动引导添加到 `member_accounts ` 变量中的新账户，以便可以部署所需角色。 | 开发者版 | 
| 选项 2 – 手动引导成员账户。 | 尽管我们不建议使用这种方法，但您可以将 `cdk_bootstrap_member_accounts` 的值设置为 `False`，然后通过运行以下命令手动执行此步骤：<pre>$ cdk bootstrap -a 'python3 cloudcustodian/member_account_roles_stack.py' \<br /><br />--trust {security_account_id} \<br /><br />--context assume-role-credentials:writeIamRoleName={role_name} \<br /><br />--context assume-role-credentials:readIamRoleName={role_name} \<br /><br />--mode=ForWriting \<br /><br />--context bootstrap=true \<br /><br />--cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess</pre>请务必使用可从安全账户分派且具有引导 AWS CDK 所需权限的 IAM 角色的名称更新 `{security_account_id}` 和 `{role_name}` 值。<br />您也可以使用其他方法来引导成员账户，例如，使用 AWS CloudFormation。有关更多信息，请参阅 AWS CDK 文档中的[引导](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)。 | 开发者版 | 

### 部署 AWS CDK 堆栈
<a name="deploy-the-aws-cdk-stacks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在成员账户中创建 IAM 角色。 | 运行以下命令以部署 `member_account_roles_stack` 堆栈并在成员账户中创建 IAM 角色：<pre>cdk deploy --all -a 'python3 cloudcustodian/member_account_roles_stack.py' --require-approval never</pre> | 开发者版 | 
| 部署云托管人管线堆栈。 | 运行以下命令以创建部署到安全账户的云托管人 `cloudcustodian_stack.py` 管线：<pre>cdk deploy -a 'python3 cloudcustodian/cloudcustodian_stack.py'</pre> | 开发者版 | 

## 相关资源
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-resources"></a>
+ [AWS CDK 入门](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)

## 附件
<a name="attachments-169a7bde-789e-4ebd-b4ca-80eb28ac9927"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/169a7bde-789e-4ebd-b4ca-80eb28ac9927/attachments/attachment.zip)