Cloud Custodian と AWS CDK を使用して、Systems Manager の AWS マネージドポリシーを EC2 インスタンスプロファイルに自動的にアタッチする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Cloud Custodian と AWS CDK を使用して、Systems Manager の AWS マネージドポリシーを EC2 インスタンスプロファイルに自動的にアタッチする

作成者: Ali Asfour (AWS)、Aaron Lennon (AWS)

環境:PoC またはパイロット

テクノロジー: DevOps、ソフトウェア開発とテスト、管理とガバナンス、セキュリティ、アイデンティティ、コンプライアンス、インフラストラクチャ

ワークロード:オープンソース

AWS サービス: Amazon SNS 、Amazon SQS 、AWS CodeBuild、AWS CodePipeline、AWS Systems Manager 、AWS CodeCommit

[概要]

運用タスクを自動化し、より多くの可視性と制御を提供する AWS Systems Manager に、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを統合することができます。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 アカウントに次の 3 つの Cloud Custodian ポリシーをデプロイすることで、これらの課題を解決するのに役立ちます。

  • 最初の Cloud Custodian ポリシーは、インスタンスプロファイルを持つが、AmazonSSMManagedInstanceCore ポリシーを持たない既存の EC2 インスタンスをチェックします。その後、AmazonSSMManagedInstanceCore ポリシーがアタッチされます。 

  • 2 つ目の Cloud Custodian ポリシーは、インスタンスプロファイルのない既存の EC2 インスタンスをチェックし、AmazonSSMManagedInstanceCore ポリシーがアタッチされたデフォルトのインスタンスプロファイルを追加します。

  • 3 つ目の Cloud Custodian ポリシーでは、EC2 インスタンスとインスタンスプロファイルの作成を監視するための AWS Lambda 関数をアカウント内に作成します。これにより、EC2 インスタンスの作成時に自動的に AmazonSSMManagedInstanceCore ポリシーがアタッチされます。

このパターンでは、AWS DevOps ツールを使用して、個別のコンピューティング環境をプロビジョニングすることなく、マルチアカウント環境に Cloud Custodian ポリシーを継続的かつ大規模にデプロイします。 

前提条件と制限

前提条件

  • 2 つ以上の AWS アカウントがアクティブである。一方のアカウントはセキュリティアカウントで、他方はメンバーアカウントである。

  • セキュリティアカウントで AWS リソースをプロビジョニングする権限がある。このパターンでは、管理者権限を使用しますが、組織の要件とポリシーに従って権限を付与する必要があります。

  • セキュリティアカウントから IAM ロールをメンバーアカウントに引き継ぎ、必要な IAM ロールを作成できます。詳細については、IAM ドキュメントの「IAM ロールを使用して AWS アカウント間でアクセスを委任する」を参照してください。

  • AWS コマンドラインインターフェイス (AWS CLI) をインストールして設定済み。テスト目的で、aws configure コマンドを使用するか、環境変数を設定することで、AWS CLI を設定できます。重要: これは本番環境では推奨されません。このアカウントには,最小特権のみ付与することをお勧めします。詳細については、IAM ドキュメントの「最小特権を付与する」を参照してください。

  • devops-cdk-cloudcustodian.zip ファイル (添付) は、ローカルコンピュータにダウンロードされます。

  • Python に精通していること。

  • 必要なツール (Node.js、AWS Cloud Development Kit (AWS CDK)、および Git) をインストールして設定済み。devops-cdk-cloudcustodian.zip ファイル内の install-prerequisites.sh ファイルを使用して、これらのツールをインストールできます。このファイルを root 権限で実行していることを確認します。 

機能制限

  • このパターンは実稼働環境でも使用できますが、すべての IAM ロールとポリシーが組織の要件とポリシーを満たしていることを確認してください。 

パッケージバージョン

  • Cloud Custodian バージョン 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 Events ルールは、AWS CodePipeline パイプラインを自動的に開始します。

  2. パイプラインは から最新のコードを取得し、AWS が処理する継続的インテグレーション CodeCommit と継続的デリバリー (CI/CD) パイプラインの継続的インテグレーション部分に送信します CodeBuild。

  3. CodeBuild は、 クラウドカストディアンポリシーのポリシー構文検証を含む完全な DevSecOps アクションを実行し、これらのポリシーを --dryrun モードで実行して、どのリソースが特定されているかをチェックします。

  4. エラーがなければ、次のタスクで変更を確認し、メンバーアカウントへのデプロイを承認するよう管理者にアラートが送信されます。

テクノロジースタック

  • AWS CDK

  • CodeBuild

  • CodeCommit

  • CodePipeline

  • IAM

  • Cloud Custodian 

自動化とスケール

AWS CDK パイプラインモジュールは、AWS CloudFormation スタック CodePipeline での AWS リソースのデプロイに加えて CodeBuild、 を使用してソースコードの構築とテストを調整する CI/CD パイプラインをプロビジョニングします。このパターンは、組織内のすべてのメンバーアカウントとリージョンで使用できます。Roles creation スタックを拡張して、メンバーアカウントに他の IAM ロールをデプロイすることもできます。 

ツール

  • AWS Cloud Development Kit (AWS CDK) は、コードでクラウドインフラストラクチャを定義し、AWS を通じてプロビジョニングするためのソフトウェア開発フレームワークです CloudFormation。

  • AWS コマンドラインインターフェイス (AWS CLI) はオープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • AWS CodeBuildはクラウド内のフルマネージド型のビルドサービスです。

  • AWS CodeCommit は、アセットをプライベートに保存および管理するために使用できるバージョン管理サービスです。

  • AWS CodePipeline は、ソフトウェアのリリースに必要なステップをモデル化、視覚化、自動化するために使用できる継続的な配信サービスです。

  • AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスをセキュアに制御するためのウェブサービスです。

  • Cloud Custodian は、多くの組織がパブリック クラウドアカウントの管理に使用しているツールとスクリプトを 1 つのオープンソースツールに統合します。

  • Node.js は Google Chrome の V8 JavaScript エンジン上に構築された JavaScript ランタイムです。

コード

このパターンで使用されるモジュール、アカウント関数、ファイル、およびデプロイコマンドの詳細なリストについては、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 に必要なすべてのツールをインストールします。AWS CLI は事前にインストールされているため、含まれていません。

詳細については、AWS CDK ドキュメントの「AWS CDK の使用開始」にある「前提条件」セクションを参照してください。

開発者

必要な AWS CDK パッケージをインストールします。

  1. AWS CLI で、$ python3 -m venv .env コマンドを実行して仮想環境を設定します。

  2. AWS CLIで、$ 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’ を更新します。

  •   CodeCommit リポジトリの名前var_codecommit_repo_name = “cdk-cloudcustodian”で を更新します。

  •   CodeCommit ブランチの名前var_codecommit_branch_name = “main”で を更新します。

  •  変更を承認する管理者のメールアドレスで var_adminEmail=notifyadmin@email.com’ を更新します。

  • 変更があった場合に Cloud Custodian 通知を送信する Slack webhook を使用して var_slackWebHookUrl = https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX を更新します。

  •  組織 ID で var_orgId = ‘o-yyyyyyyyyy’ を更新します。

  • パイプラインがデプロイされているアカウントの AWS アカウント ID で security_account = ‘123456789011’ を更新します。

  • AWS CDK スタックをブートストラップし、必要な IAMロールをデプロイするメンバーアカウントを使用して member_accounts = [‘111111111111’,’111111111112’,’111111111113’] を更新します。

  • パイプラインで AWS CDKをメンバーアカウントに自動的にブートストラップする場合は、cdk_bootstrap_member_accounts = TrueTrue に設定します。 True に設定した場合は、メンバーアカウント内の既存の IAMロールの名前も必要になります。このロールは、セキュリティアカウントから引き受けることができます。この IAM ロールには、AWS CDK をブートストラップするためのアクセス権限も必要です。

  • メンバーアカウント内の既存の IAMロールの名前を使用して cdk_bootstrap_role = ‘AWSControlTowerExecution’ を更新します。このロールは、セキュリティアカウントから引き受けることができます。このロールには、AWS CDK をブートストラップするためのアクセス権限も必要です。: これは、cdk_bootstrap_member_accountsTrue に設定した場合にのみ適用されます。

開発者

account.yml ファイルをメンバーアカウント情報で更新します。

c7n-org Cloud Custodian ツールを複数のアカウントに対して実行するには、accounts.yml 設定ファイルをリポジトリのルートに配置する必要があります。以下は、AWS の Cloud Custodian 設定のサンプルファイルです。

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 変数で指定されたアカウントは パイプラインによって自動的にブートストラップされます。

必要に応じて、IAM ロールを使用して *cdk_bootstrap_role* を更新できます。このロールは、セキュリティアカウントから引き受けることができ、AWS CDK をブートストラップするために必要な権限を持っています。

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

重要{security_account_id}{role_name} の値は、セキュリティアカウントから引き受けることができ、AWS CDK のブートストラップに必要な権限を持つ IAM ロールの名前で更新されることを確認してください。

他の方法を使用して、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