使用雲端託管人和 AWS CDK 自動將適用於 Systems Manager 的 AWS 受管政策附加至 EC2 執行個體設定檔 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用雲端託管人和 AWS CDK 自動將適用於 Systems Manager 的 AWS 受管政策附加至 EC2 執行個體設定檔

由阿里·阿斯福爾(AWS)和亞倫列儂(AWS)創建

環境:PoC 或試點

技術: DevOps;軟體開發與測試;管理與治理;安全性、身分識別、合規性;基礎架構

工作負載:開源

AWS 服務:Amazon SNS; Amazon SQS; AWS CodeBuild; AWS CodePipeline; AWS Systems Manager; AWS CodeCommit

Summary

您可以將 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體與 AWS Systems Manager 整合,以自動化操作任務並提供更多可見度和控制權。若要與 Systems Manager 整合,EC2 執行個體必須已安裝 AWS Systems Manager 代理程式 (SSM 代理程式)AmazonSSMManagedInstanceCore AWS Identity and Access Management (IAM) 政策附加至其執行個體設定檔。 

但是,如果您想確保所有 EC2 執行個體設定檔都附加了AmazonSSMManagedInstanceCore政策,則更新沒有執行個體設定檔的新 EC2 執行個體或具有執行個體設定檔但沒有該AmazonSSMManagedInstanceCore政策的 EC2 執行個體可能會面臨挑戰。在多個 Amazon Web Services (AWS) 帳戶和 AWS 區域之間新增此政策也可能很困難。

透過在 AWS 帳戶中部署三個雲端託管政策,此模式有助於解決這些挑戰:

  • 第一個雲端託管人政策會檢查具有執行個體設定檔但沒有AmazonSSMManagedInstanceCore政策的現有 EC2 執行個體。然後會附加AmazonSSMManagedInstanceCore原則。 

  • 第二個 Cloud 託管人政策會檢查沒有執行個體設定檔的現有 EC2 執行個體,並新增已附加AmazonSSMManagedInstanceCore政策的預設執行個體設定檔。

  • 第三個雲端託管人政策會在您的帳戶中建立 AWS Lambda 函數,以監控 EC2 執行個體和執行個體設定檔的建立。這可確AmazonSSMManagedInstanceCore保在建立 EC2 執行個體時自動附加政策。

此模式使用 AWS DevOps 工具將雲端託管人政策的持續大規模部署到多帳戶環境,而無需佈建單獨的運算環境。 

先決條件和限制

先決條件

  • 兩個或多個作用中的 AWS 帳戶。一個帳戶是安全帳戶,其他帳戶是成員帳戶。

  • 在安全帳戶中佈建 AWS 資源的許可。此模式使用管理員權限,但您應該根據組織的需求和策略授與權限。

  • 能夠從安全帳戶擔任 IAM 角色到成員帳戶,並建立必要的 IAM 角色。如需詳細資訊,請參閱 IAM 文件中的使用 IAM 角色在 AWS 帳戶之間委派存取權。

  • 已安裝和設定的 AWS Command Line Interface (AWS CLI) (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檔案來安裝這些工具。 確保您以 root 權限運行此文件。 

限制

  • 雖然此模式可用於生產環境,但請確保所有 IAM 角色和政策都符合組織的需求和政策。 

Package 版本

  • 雲端託管人 0.9 版或更新版本

  • TypeScript 版本 3.9.7 或更新版本

  • Node.js 版本 14.15.4 或更新版本

  • npm版本 7.6.1 或更新版本

  • AWS CDK 版本 1.96.0 或更新版本

架構

該圖顯示以下工作流程:

  1. 雲端託管政策會推送至安全帳戶中的 AWS CodeCommit 儲存庫。Amazon CloudWatch 事件規則會自動啟動 AWS CodePipeline 管道。

  2. 管道會從中擷取最新的程式碼, CodeCommit 並將其傳送至 AWS 處理之持續整合和持續交付 (CI/CD) 管道的持續整合部分。 CodeBuild

  3. CodeBuild 執行完整 DevSecOps 動作 (包括 Cloud Managed 政策上的政策語法驗證),並以--dryrun模式執行這些政策以檢查識別的資源。

  4. 如果沒有錯誤,下一個工作會警示管理員檢閱變更並核准部署至成員帳戶。

技術堆疊

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自動化和規模

AWS CDK 管道模組佈建一個 CI/CD 管道,除了使 CodePipeline 用 AWS 堆疊部署 AWS 資源之外 CodeBuild,還可用來協調原始程式碼的建置和測試。 CloudFormation 您可以將此模式用於組織中的所有成員帳戶和區域。您也可以擴充Roles creation堆疊,以在成員帳戶中部署其他 IAM 角色。 

工具

  • AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可在程式碼中定義雲端基礎設施,並透過 AWS CloudFormation 佈建雲端基礎設施。

  • AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可讓您使用命令列殼層中的命令與 AWS 服務互動。

  • AWS CodeBuild 是雲端中的全受管建置服務。

  • AWS CodeCommit 是一種版本控制服務,可用於私有存放和管理資產。

  • AWS CodePipeline 是一種持續交付服務,可用來建立軟體發行所需步驟的模型、視覺化和自動化。

  • AWS Identity and Access Management 是一種 Web 服務,可協助您安全地控制 AWS 資源的存取。

  • Cloud Bookdian 是一種工具,可將大多數組織用於管理其公共雲帳戶的數十種工具和腳本統一為一個開源工具。

  • Node.js 是建立在谷歌瀏覽器的 V8 JavaScript 引擎 JavaScript 運行時。

Code

有關此模式中使用的模塊,帳戶函數,文件和部署命令的詳細列表,請參閱README文件中的devops-cdk-cloudcustodian.zip文件(附件)。

史诗

任務描述所需技能

設定 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檔案,並更新下列變數:

  •  var_deploy_region = ‘us-east-1’使用您希望部署管道的 AWS 區域進行更新。

  •  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 ',用於在進行變更時傳送雲端託管人通知。

  •  var_orgId = ‘o-yyyyyyyyyy’使用您的組織 ID 更新。

  • security_account = ‘123456789011’使用部署管道的帳戶的 AWS 帳戶 ID 進行更新。

  • 使member_accounts = [‘111111111111’,’111111111112’,’111111111113’]用您想要啟動 AWS CDK 堆疊並部署必要 IAM 角色的成員帳戶進行更新。

  • True如果您希望管道自動將 AWS CDK 引導至您的成員帳戶,請設cdk_bootstrap_member_accounts = True定為。 如果設True為,則還需要成員帳戶中現有 IAM 角色的名稱,該角色可以從安全帳戶承擔。此 IAM 角色也必須具有啟動 AWS CDK 的必要許可。

  • 使cdk_bootstrap_role = ‘AWSControlTowerExecution’用成員帳戶中現有的 IAM 角色進行更新,這些角色可以從安全帳戶承擔。此角色也必須獲得啟動 AWS CDK 的權限。注意:這僅在設定cdk_bootstrap_member_accounts為時適用True

開發人員

使用成員帳戶資訊更新帳戶 .yml 檔案。

若要針對多個帳戶執行 c7n-org 雲端託管工具,您必須將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
開發人員
任務描述所需技能

自舉安全帳戶。

透過執行deploy_account下列命令來啟動cloudcustodian_stack應用程式:

cdk bootstrap -a 'python3 cloudcustodian/cloudcustodian_stack.py
開發人員

選項 1-自動引導成員帳戶。

如果在vars.py檔案True中將cdk_bootstrap_member_accounts變數設定為,則管線會自動啟動載入member_accounts變數中指定的帳戶。

如果需要,您可以使*cdk_bootstrap_role*用可以從安全帳戶承擔的 IAM 角色進行更新,並具有啟動 AWS CDK 所需許可的 IAM 角色。

新增至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

重要事項:請務必使用可從安全帳戶承擔的 IAM 角色名稱更新和{role_name}值,並具有啟動 AWS CDK 所需的許可。{security_account_id}

您也可以使用其他方法來引導成員帳戶,例如使用 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