使用云托管人和 AWS CDK 自动将适用于 Systems Manager 的 AWS 托管式策略附加到 EC2 实例配置文件 - AWS Prescriptive Guidance

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

使用云托管人和 AWS CDK 自动将适用于 Systems Manager 的 AWS 托管式策略附加到 EC2 实例配置文件

创建者:Ali Asfour(AWS)和 Aaron Lennon(AWS)

环境:PoC 或试点

技术: DevOps; DevelopmentAndTesting; 管理和治理; 安全、身份、合规; 基础架构

工作负载:开源

AWS 服务:亚马逊 SNS;亚马逊 SQS;AWS;AWS; CodeBuildAWS Systems Manager; CodePipelineAWS CodeCommit

Summary

您可以将 Amazon Elastic Compute Cloud(Amazon EC2)实例与 AWS Systems Manager 集成,以自动化操作任务并提供更好的可见性和控制。要与 Systems Manager 集成,EC2 实例必须安装一个 AWS Systems Manager Agent(SSM Agent),并在其实例配置文件上附加一个 AmazonSSMManagedInstanceCore AWS IAM policy。 

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

这种模式通过在 Amazon Web Services account 中部署三项云托管人策略来帮助解决这些困难:

  • 第一项云托管人策略检查是否有实例配置文件但没有该 AmazonSSMManagedInstanceCore 策略的现有 EC2 实例。然后附上 AmazonSSMManagedInstanceCore 策略。 

  • 第二项云托管人策略检查没有实例配置文件的现有 EC2 实例,并添加了附有 AmazonSSMManagedInstanceCore 策略的默认实例配置文件。

  • 第三项云托管人策略在账户中创建 AWS Lambda 函数,以监控 EC2 实例和实例配置文件的创建。这样可以确保在创建 EC2 实例时自动附加该 AmazonSSMManagedInstanceCore 策略。

这种模式使用 AWS DevOps 工具将云托管人策略持续大规模部署到多账户环境,无需配置单独的计算环境。 

先决条件和限制

先决条件

  • 两个或以上有效 Amazon Web Services account。一个账户是安全账户,其他账户是成员账户

  • 在安全账户中预调配 AWS 资源的权限。此模式使用管理员权限,但您应根据贵组织的要求和策略授予权限。

  • 能够从安全账户向成员账户分派 IAM 角色并创建所需 IAM 角色。有关更多信息,请参阅 IAM 文档中的使用 IAM 角色跨 Amazon Web Services account 委派访问权限

  • 已安装和配置 AWS 命令行界面(AWS CLI)。出于测试目的,您可以使用 aws configure 命令或设置环境变量来配置 AWS CLI。重要:不建议在生产环境中这样做,我们建议仅向该账户授予访问的最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限许可

  • 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 或更高版本

架构

AWS CodePipeline workflow with CodeCommit, CodeBuild, and deployment to member accounts.

图表显示了以下工作流:

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

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

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

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

技术堆栈

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自动化和扩缩

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

工具

  • AWS Cloud Development Kit (AWS CDK) 是一个软件开发框架,用于在代码中定义云基础设施并通过 AWS CloudFormation 进行配置。

  • AWS 命令行界面(AWS CLI)是一种开源工具,它使您能够使用命令行 Shell 中的命令与 Amazon Web Services 交互。

  • AWS CodeBuild 是一项完全托管的云端构建服务。

  • AWS CodeCommit 是一项版本控制服务,您可以使用它来私下存储和管理资产。

  • AWS CodePipeline 是一项持续交付服务,您可以使用它对发布软件所需的步骤进行建模、可视化和自动化。

  • AWS Identity and Access Management 是一项 Web 服务,可帮助您安全地控制对 AWS 资源的访问。

  • 云托管人是一种工具,可将大多数组织用于管理其公共云账户的数十种工具和脚本统一到一个开源工具中。

  • Node.js 是一个基于谷歌浏览器 V8 JavaScript 引擎构建的 JavaScript 运行时。

代码

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

操作说明

任务描述所需技能

设置 CodeCommit 存储库。

  1. devops-cdk-cloudcustodian.zip 文件(附件)解压缩到本地计算机上的工作目录中。

  2. 登录您的安全账户的 AWS 管理控制台,打开 CodeCommit 控制台,然后创建新的devops-cdk-cloudcustodian存储库。

  3. 进入项目目录并将 CodeCommit 存储库设置为源,提交更改,然后通过运行以下命令将其推送到 origin 分支:

  • cd devops-cdk-cloudcustodian 

  • git init --initial-branch=main

  • git add . git commit -m 'initial commit' 

  • git remote add origin https://git-codecommit.us-east-1.amazonaws.com/v1/devops-cdk-cloudcustodian 

  • git push origin main

有关这方面的更多信息,请参阅 AWS CodeCommit 文档中的创建 CodeCommit 存储库

开发人员

安装所需工具。

使用该 install-prerequisites.sh 文件在 Amazon Linux 上安装所有必需的工具。这不包括 AWS CLI,因为它是预安装的。

有关这方面的更多信息,请参阅 AWS CDK 文档中的 AWS CDK 入门先决条件部分。

开发人员

安装所需 AWS CDK 软件包。

  1. 在 AWS CLI 中运行以下命令来设置虚拟环境:$ python3 -m venv .env

  2. 运行以下命令来设置虚拟环境:$ source .env/bin/activate

  3. 激活虚拟环境后,通过运行以下命令来安装所需依赖项:$ pip install -r requirements.txt

  4. 要添加其他依赖项(例如,其他 AWS CDK 库),请将它们添加到 requirements.txt 文件中,然后运行以下命令:pip install -r requirements.txt

以下软件包是 AWS CDK 的必需并且包含在 requirements.txt 文件中:

  • aws-cdk.aws-cloudwatch

  • aws-cdk.aws-codebuild

  • aws-cdk.aws-codecommit

  • aws-cdk.aws-codedeploy

  • aws-cdk.aws-codepipeline

  • aws-cdk.aws-codepipeline-actions

  • aws-cdk.aws-events

  • aws-cdk.aws-events-targets

  • aws-cdk.aws-iam

  • aws-cdk.aws-logs

  • aws-cdk.aws-s3

  • aws-cdk.aws-sns

  • aws-cdk.aws-sns-subscriptions

  • aws-cdk.aws-sqs

  • aws-cdk.core

开发人员
任务描述所需技能

更新所需变量。

打开 CodeCommit 存储库根文件夹中的vars.py文件并更新以下变量:

  •  使用要在其中部署管线的 AWS 区域 更新 var_deploy_region = ‘us-east-1’

  •  var_codecommit_repo_name = “cdk-cloudcustodian”使用 CodeCommit 存储库的名称进行更新。

  •  var_codecommit_branch_name = “main”使用 CodeCommit 分支名称进行更新。

  •  使用批准更改的管理员的电子邮件地址更新 var_adminEmail=notifyadmin@email.com’

  • 使用用于在更改时发送云托管人通知的 Slack Webhook 更新 var_slackWebHookUrl = https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX’。

  •  使用贵组织 ID 更新 var_orgId = ‘o-yyyyyyyyyy’

  • 使用部署管线的账户的 Amazon Web Services account ID 更新 security_account = ‘123456789011’

  • 使用想要引导 AWS CDK 堆栈并部署所需 IAM 角色的成员账户更新 member_accounts = [‘111111111111’,’111111111112’,’111111111113’]

  • 如果您希望管线自动将 AWS CDK 引导到成员账户,请将 cdk_bootstrap_member_accounts = True 设置为 True。 如果设置为 True,则还需要成员账户中现有 IAM 角色的名称,该角色可以从安全账户中分派。此 IAM 角色还必须具有引导 AWS CDK 所需权限。

  • 使用成员账户中现有 IAM 角色更新 cdk_bootstrap_role = ‘AWSControlTowerExecution’,该角色可以从安全账户中分派。此角色还必须具有引导 AWS CDK 所需权限。注意:仅在 cdk_bootstrap_member_accounts 设置为 True 时适用。

开发人员

使用成员账户信息更新 account.yml 文件。

要对多个账户运行 c7n-org Cloud Custodian 工具,必须将 accounts.yml 配置文件放在存储库的根目录中。以下是适用于 AWS 的一个示例云托管人配置文件:

accounts: - account_id: '123123123123' name: account-1 regions: - us-east-1 - us-west-2 role: arn:aws:iam::123123123123:role/CloudCustodian vars: charge_code: xyz tags: - type:prod - division:some division - partition:us - scope:pci
开发人员
任务描述所需技能

引导安全账户。

运行以下命令,使用 cloudcustodian_stack 应用程序引导 deploy_account

cdk bootstrap -a 'python3 cloudcustodian/cloudcustodian_stack.py
开发人员

选项 1 – 自动引导成员账户。

如果在 vars.py 文件中将 cdk_bootstrap_member_accounts 变量设置为 True,则管线会自动引导 member_accounts 变量中指定的账户。

如果需要,您可以使用可从安全账户分派且具有引导 AWS CDK 所需权限的 IAM 角色更新 *cdk_bootstrap_role*

管线会自动引导添加到 member_accounts  变量中的新账户,以便可以部署所需角色。

开发人员

选项 2 – 手动引导成员账户。

尽管我们不建议使用这种方法,但您可以将 cdk_bootstrap_member_accounts 的值设置为 False,然后通过运行以下命令手动执行此步骤:

$ cdk bootstrap -a 'python3 cloudcustodian/member_account_roles_stack.py' \ --trust {security_account_id} \ --context assume-role-credentials:writeIamRoleName={role_name} \ --context assume-role-credentials:readIamRoleName={role_name} \ --mode=ForWriting \ --context bootstrap=true \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess

重要:请务必使用可从安全账户分派且具有引导 AWS CDK 所需权限的 IAM 角色的名称更新 {security_account_id}{role_name} 值。

您也可以使用其他方法来引导成员账户,例如,使用 AWS CloudFormation。有关更多信息,请参阅 AWS CDK 文档中的引导

开发人员
任务描述所需技能

在成员账户中创建 IAM 角色。

运行以下命令以部署 member_account_roles_stack 堆栈并在成员账户中创建 IAM 角色:

cdk deploy --all -a 'python3 cloudcustodian/member_account_roles_stack.py' --require-approval never
开发人员

部署云托管人管线堆栈。

运行以下命令以创建部署到安全账户的云托管人 cloudcustodian_stack.py 管线:

cdk deploy -a 'python3 cloudcustodian/cloudcustodian_stack.py'
开发人员

相关资源

附件

要访问与此文档相关联的其他内容,请解压以下文件:attachment.zip