使用雲端保管和 AWS CDK,自動將適用於 Systems Manager 的 AWS 受管政策附加到 EC2 執行個體設定檔 - AWS Prescriptive Guidance

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

使用雲端保管和 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 整合至 AWS 系統管理員,以自動化操作任務並提供更多能見度和控制。若要與 Systems Manager 整合,EC2 執行個體必須安裝AWS Systems Manager 代理程式 (SSM 代理程式)AmazonSSMManagedInstanceCore附加至執行個體設定檔的 AWS Identity and Access Management (IAM) 政策。 

但是,如果您想確保所有 EC2 執行個體設定檔都具有AmazonSSMManagedInstanceCore原則,您可能會遇到更新沒有執行個體描述檔或具有執行個體描述檔但沒有執行個體描述檔的 EC2 執行個體的挑戰AmazonSSMManagedInstanceCore政策。在多個 Amazon Web Services (AWS) 帳戶和 AWS 區域中新增此政策也可能很困難。

這種模式有助於解決這些挑戰,部署三個Cloud CustodianAWS 帳戶中的政策:

  • 第一個雲端保管政策會檢查是否有具有執行個體設定檔但沒有AmazonSSMManagedInstanceCore政策。所以此AmazonSSMManagedInstanceCore原則。 

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

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

此模式使用AWS DevOps工具,將 Cloud Custodian 原則持續大規模部署至多帳戶環境,而無需佈建個別的計算環境。 

先決條件和限制

先決條件

  • 兩個或更多使用中 AWS 帳戶。其中一個帳戶是安全性帳戶,其他則是成員帳戶。 

  • 安全帳戶中具有佈建 AWS 資源許可的現有 IAM 使用者或角色。此模式使用管理員許可,但您應該根據組織的需求和原則授與權限。

  • 能夠從安全性帳戶擔任 IAM 角色至成員帳戶,並建立所需的 IAM 角色。如需此項目的詳細資訊,請參閱使用 IAM 角色將存取權委派給不同 AWS 帳戶在 IAM 文件中。

  • AWS Command Line Interface (AWS CLI),已安裝和設定。針對測試用途,您可以透過使用aws configure命令或設定環境變數。重要:不建議在生產環境中執行這項操作,我們建議您只授與此帳戶最低權限存取權限。如需此項目的詳細資訊,請參閱授予最低權限在 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 或更新版本

  • npm7.6.1 或更新版本

  • AWS CDK 版本 1.96.0 或更新版本

Architecture

此圖表顯示以下工作流程:

  1. 雲端保管政策會推送到安全帳戶中的 AWS CodeCommit 存放庫。Amazon CloudWatch Events 規則會自動啟動 AWS 程式碼管道。

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

  3. CodeBuild 會執行完整的 DevSecOps 動作,包括在雲端保管原則上的原則語法驗證,並在--dryrun模式來檢查識別哪些資源。

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

技術堆疊

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自動化和擴充

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

Tools

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

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

  • AWS CodeBuild— CodeBuild 是在雲端的全受管組建服務。

  • AWS CodeCommit— CodeCommit 是一種版本控制服務,讓您能夠私下存放和管理資產。

  • AWS CodePipeline— CodePipeline 是一種持續交付的服務,讓您能夠將發行軟體所需的步驟模型化、視覺化和自動化。 

  • AWS Identity and Access Management— IAM 是一種 Web 服務,讓您能夠安全地控制對 AWS 資源的存取。

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

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

Code

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

Epics

任務描述所需的技能
設定 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

如需此項目的詳細資訊,請參閱建立 CodeCommit 儲存庫在 AWS 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

開發人員
任務描述所需的技能
更新所需的變數。

開啟vars.py檔案放在 CodeCommit pute 存放庫的根資料夾中,並更新以下變數:

  •  更新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’(用於核准變更的管理員電子郵件地址)。

  • 更新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 角色的成員帳戶。

  • 設定cdk_bootstrap_member_accounts = TrueTrue如果您希望管道自動將 AWS CDK 引導到您的成員帳戶。 如果設定為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_accountcloudcustodian_stack應用程式執行下列命令:

cdk bootstrap -a 'python3 cloudcustodian/cloudcustodian_stack.py

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

如果cdk_bootstrap_member_accounts變數設定為True中的vars.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
開發人員
部署雲端保管程式管線堆疊。

執行以下命令來建立雲端保管cloudcustodian_stack.py管線中部署到安全性帳戶:

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

相關資源

Attachments

attachment.zip