使用 Cloud Custodian 和 自動將 Systems Manager 的AWS受管政策連接至EC2執行個體設定檔 AWS CDK - AWS 方案指引

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

使用 Cloud Custodian 和 自動將 Systems Manager 的AWS受管政策連接至EC2執行個體設定檔 AWS CDK

由 Ali Asfour (AWS) 和 Aaron Lennon (AWS) 建立

環境:PoC 或試行

技術: DevOps DevelopmentAndTesting;管理與治理;安全、身分、合規;基礎設施

工作負載:開放原始碼

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 Agent (SSM Agent) 和連接到其執行個體設定檔的 AmazonSSMManagedInstanceCore AWS Identity and Access Management (IAM) 政策。 

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

此模式透過在AWS帳戶中部署三個 Cloud Custodian 政策,協助解決這些挑戰:

  • 第一個 Cloud Custodian 政策會檢查是否有具有EC2執行個體設定檔但沒有AmazonSSMManagedInstanceCore政策的現有執行個體。然後連接AmazonSSMManagedInstanceCore政策。 

  • 第二個 Cloud Custodian 政策會檢查沒有執行個體設定檔的現有EC2執行個體,並新增已連接AmazonSSMManagedInstanceCore政策的預設執行個體設定檔。

  • 第三個 Cloud Custodian 政策會在您的帳戶中建立 AWS Lambda 函數,以監控EC2執行個體和執行個體設定檔的建立。這可確保在建立EC2執行個體時自動連接AmazonSSMManagedInstanceCore政策。

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

先決條件和限制

先決條件

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

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

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

  • AWS 命令列介面 (AWS CLI),已安裝並設定。為了測試目的,您可以使用aws configure命令或設定環境變數AWSCLI來設定 。重要 :這不建議用於生產環境,建議您僅將此帳戶授予最低權限存取。如需詳細資訊,請參閱 IAM 文件中的授予最低權限

  • devops-cdk-cloudcustodian.zip 檔案 (已連接),已下載至本機電腦。

  • 熟悉 Python。

  • 安裝和設定必要的工具 (Node.js、AWS雲端開發套件 (AWS) CDK和 Git)。您可以使用devops-cdk-cloudcustodian.zip檔案中install-prerequisites.sh的檔案來安裝這些工具。請確定您使用根權限執行此檔案。 

限制

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

套件版本

  • Cloud Custodian 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 CloudWatch Events 規則會自動啟動AWS CodePipeline 管道。

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

  3. CodeBuild 會執行完整 DevSecOps 動作,包括對 Cloud Custodian 政策的政策語法驗證,並在--dryrun模式下執行這些政策,以檢查識別哪些資源。

  4. 如果沒有錯誤,下一個任務會提醒管理員檢閱變更,並核准成員帳戶中的部署。

技術堆疊

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自動化和擴展

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

工具

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

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

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

  • AWS CodeCommit 是版本控制服務,可用來私下存放和管理資產。

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

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

  • Cloud Custodian 是一種工具,可將大多數組織用於管理公有雲端帳戶的數十種工具和指令碼統一為單一開放原始碼工具。

  • Node.js 是建立在 Google Chrome V8 JavaScript engine 上的 JavaScript 執行期。

Code

如需此模式中使用的模組、帳戶函數、檔案和部署命令的詳細清單,請參閱 devops-cdk-cloudcustodian.zip 檔案中的 README 檔案 (已連接)。

史詩

任務描述所需的技能

設定 CodeCommit 儲存庫。

  1. 解壓縮本機電腦上工作目錄中devops-cdk-cloudcustodian.zip的檔案 (已連接)。

  2. 登入安全帳戶的AWS管理主控台,開啟 CodeCommit 主控台,然後建立新的devops-cdk-cloudcustodian儲存庫。

  3. 變更至專案目錄,並將 CodeCommit 儲存庫設定為原始伺服器,遞交變更,然後執行下列命令將其推送至原始伺服器分支:

  • 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 上安裝所有必要工具。這不包括 ,AWSCLI因為它已預先安裝。

如需詳細資訊,請參閱 AWS CDK 文件AWS中開始使用 CDK 的先決條件一節。

開發人員

安裝所需的AWSCDK套件。

  1. 在 AWS 中執行下列命令來設定您的虛擬環境CLI: $ python3 -m venv .env

  2. 透過執行下列命令來啟用您的虛擬環境: $ source .env/bin/activate

  3. 虛擬環境啟動後,執行下列命令來安裝所需的相依性: $ pip install -r requirements.txt

  4. 若要新增其他相依性 (例如其他AWSCDK程式庫),請將它們新增至 requirements.txt 檔案,然後執行下列命令: pip install -r requirements.txt

下列套件為 所需AWSCDK,並包含在 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',用於在進行變更時傳送 Cloud Custodian 通知。

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

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

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

  • True 如果您想要管道自動將 引導AWSCDK至您的成員帳戶,請將 cdk_bootstrap_member_accounts = True設定為 。 如果設定為True此,也需要成員帳戶中的現有IAM角色名稱,這些角色可以從安全帳戶擔任。此IAM角色也必須具備必要的許可才能啟動 AWS CDK。

  • cdk_bootstrap_role = ‘AWSControlTowerExecution’ 更新成員帳戶中可從安全帳戶擔任的現有IAM角色。此角色也必須具有啟動 AWS 的許可CDK。注意:這僅適用於cdk_bootstrap_member_accounts設定為 的情況True

開發人員

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

若要針對多個帳戶執行 c7n-org Cloud Custodian accounts.yml 工具,您必須將組態檔案放置在儲存庫根中。以下是 的 Cloud Custodian 組態檔案範例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 - 自動啟動成員帳戶。

如果 cdk_bootstrap_member_accounts變數Truevars.py 檔案中設定為 ,則 member_accounts變數中指定的帳戶會自動由管道啟動。

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

新增至member_accounts 變數的新帳戶會自動由管道啟動,以便部署所需的角色。

開發人員

選項 2 - 手動啟動成員帳戶。

雖然我們不建議使用此方法,但您可以將 的值設定為 ,cdk_bootstrap_member_accountsFalse並透過執行下列命令手動執行此步驟:

$ 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

重要 :請務必使用您可以從安全帳戶擔任的角色名稱更新 {security_account_id}{role_name}值,而且該IAM角色具有啟動 AWS 所需的許可CDK。

您也可以使用其他方法來啟動成員帳戶,例如使用 AWS CloudFormation。如需詳細資訊,請參閱 AWS CDK 文件中的引導

開發人員
任務描述所需的技能

在成員帳戶中建立IAM角色。

執行下列命令以部署member_account_roles_stack堆疊,並在成員帳戶中建立IAM角色:

cdk deploy --all -a 'python3 cloudcustodian/member_account_roles_stack.py' --require-approval never
開發人員

部署 Cloud Custodian 管道堆疊。

執行下列命令,以建立部署到安全帳戶的 Cloud Custodian cloudcustodian_stack.py管道:

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

相關資源

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip