

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

# Cloud Custodian と AWS CDK を使用して、Systems Manager の AWS マネージドポリシーを EC2 インスタンスプロファイルに自動的にアタッチする
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk"></a>

*Ali Asfour、Aaron Lennon (Amazon Web Services)*

## 概要
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-summary"></a>

運用タスクを自動化し、より多くの可視性と制御を提供する AWS Systems Manager に、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを統合することができます。Systems Manager と統合するには、EC2 インスタンスに [AWS Systems Manager Agent(SSM Agent)](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html) をインストールし、`AmazonSSMManagedInstanceCore` AWS Identity and Access Management (IAM) ポリシーをプロファイルに追加する必要があります。 

ただし、すべての EC2 インスタンスプロファイルに `AmazonSSMManagedInstanceCore` ポリシーを確実にアタッチする場合、インスタンスプロファイルを持たない新規 EC2 インスタンスや、インスタンスプロファイルを持つが `AmazonSSMManagedInstanceCore` ポリシーを持たない EC2 インスタンスを更新する際に問題が発生する可能性があります。また、このポリシーを複数の Amazon Web Services (AWS) アカウントや AWS リージョンに追加することが難しい場合もあります。

このパターンは、AWS アカウントに次の 3 つの [Cloud Custodian](https://cloudcustodian.io/) ポリシーをデプロイすることで、これらの課題を解決するのに役立ちます。
+ 最初の Cloud Custodian ポリシーは、インスタンスプロファイルを持つが、`AmazonSSMManagedInstanceCore` ポリシーを持たない既存の EC2 インスタンスをチェックします。その後、`AmazonSSMManagedInstanceCore` ポリシーがアタッチされます。 
+ 2 つ目の Cloud Custodian ポリシーは、インスタンスプロファイルのない既存の EC2 インスタンスをチェックし、`AmazonSSMManagedInstanceCore` ポリシーがアタッチされたデフォルトのインスタンスプロファイルを追加します。
+ 3 つ目の Cloud Custodian ポリシーでは、EC2 インスタンスとインスタンスプロファイルの作成を監視するための [AWS Lambda 関数](https://cloudcustodian.io/docs/aws/lambda.html)をアカウント内に作成します。これにより、EC2 インスタンスの作成時に自動的に `AmazonSSMManagedInstanceCore` ポリシーがアタッチされます。

このパターンは、[AWS DevOps](https://aws.amazon.com/devops/) ツールを使用することで、個別のコンピューティング環境をプロビジョニングすることなく、マルチアカウント環境で Cloud Custodian ポリシーの継続的かつ大規模なデプロイを実現します。 

## 前提条件と制限
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-prereqs"></a>

**前提条件**
+ 2 つ以上の AWS アカウントがアクティブである。一方のアカウントは*セキュリティアカウント*で、他方は*メンバーアカウント*である。
+ セキュリティアカウントで AWS リソースをプロビジョニングする権限がある。このパターンでは、[管理者権限](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)を使用しますが、組織の要件とポリシーに従って権限を付与する必要があります。
+ セキュリティアカウントから IAM ロールをメンバーアカウントに引き継ぎ、必要な IAM ロールを作成できます。詳細については、IAM ドキュメントの「[IAM ロールを使用して AWS アカウント間でアクセスを委任する](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)」を参照してください。
+ 
**重要**  
AWS コマンドラインインターフェイス (AWS CLI) をインストールして設定済み。テスト目的で、`aws configure` コマンドを使用するか、環境変数を設定することで、AWS CLI を設定できます。: これは本番環境では推奨されません。このアカウントには、最小特権のみ付与することをお勧めします。詳細については、IAM ドキュメントの「[最小特権を付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)」を参照してください。
+ `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 またはそれ以降

## アーキテクチャ
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-architecture"></a>

![](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/169a7bde-789e-4ebd-b4ca-80eb28ac9927/images/8ec0b6b4-d4b0-42e5-833d-24d1e6098fd9.png)


 

この図表は、次のワークフローを示しています:

1. Cloud Custodian ポリシーが、セキュリティ アカウントに AWS CodeCommit リポジトリにプッシュされます。Amazon CloudWatch Events ルールは、AWS CodePipeline パイプラインを自動的に起動します。

1. パイプラインは CodeCommit から最新のコードを取得し、AWS CodeBuild で処理される CI/CD (継続統合および継続配信) パイプラインの継続的な統合部分に送信します。

1. CodeBuild は、Cloud Custodian ポリシーのポリシー構文検証を含む完全な DevSecOps アクションを実行し、`--dryrun` モードでこれらのポリシーを実行して、どのリソースが認識されているかをチェックします。

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

**テクノロジースタック**
+ AWS CDK
+ CodeBuild
+ CodeCommit
+ CodePipeline
+ IAM
+ Cloud Custodian 

**自動化とスケール**

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

## ツール
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-tools"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、コードでクラウドインフラストラクチャを定義し、AWS CloudFormation を通じてプロビジョニングするための、ソフトウェア開発フレームワーク
+ [AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) はオープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ [AWS CodeBuild ](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)はクラウドで動作する、完全マネージド型のビルドサービスです。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) は、プライベートな保存と管理を有効にするバージョン管理サービスです。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)は、ソフトウェアをリリースするために必要な手順のモデル化、視覚化、および自動化に使用できる継続的な配信サービスです。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) は、AWS リソースへのアクセスをセキュアに制御するためのウェブサービスです。
+ [Cloud Custodian](https://cloudcustodian.io/) は、多くの組織がパブリック クラウドアカウントの管理に使用しているツールとスクリプトを 1 つのオープンソースツールに統合します。
+ [Node.js](https://nodejs.org/en/) は Google Chrome の V8 JavaScript エンジンをベースに構築された JavaScript ランタイムです。

**コード **

このパターンで使用されるモジュール、アカウント関数、ファイル、およびデプロイコマンドの詳細なリストについては、`devops-cdk-cloudcustodian.zip` ファイル（添付） `README` 内のファイルを参照してください。

## エピック
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-epics"></a>

### AWS CDK でパイプラインをセットアップする
<a name="set-up-the-pipeline-with-aws-cdk"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CodeCommit リポジトリを設定します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)詳細については、AWS CodeCommit ドキュメントの「[CodeCommit リポジトリの作成](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-repository.html)」を参照してください。 | 開発者 | 
| 必要なツールをインストールします。 | `install-prerequisites.sh` ファイルを使用して Amazon Linux に必要なすべてのツールをインストールします。AWS CLI は事前にインストールされているため、含まれていません。<br />詳細については、AWS CDK ドキュメントの「[AWS CDK の使用開始](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)」にある「[前提条件](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_prerequisites)」セクションを参照してください。 | 開発者 | 
| 必要な AWS CDK パッケージをインストールします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html)以下のパッケージは AWS CDK に必要であり、`requirements.txt` ファイルに含まれています。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html) | 開発者 | 

### 環境の設定
<a name="configure-your-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 必要な変数を更新してください。 | CodeCommit `vars.py` リポジトリのルートフォルダにあるファイルを開き、次の変数を更新します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk.html) | 開発者 | 
| account.yml ファイルをメンバーアカウント情報で更新します。 | [c7n-org Cloud Custodian](https://cloudcustodian.io/docs/tools/c7n-org.html) ツールを複数のアカウントに対して実行するには、`accounts.yml` 設定ファイルをリポジトリのルートに配置する必要があります。以下は、AWS の Cloud Custodian 設定のサンプルファイルです。<pre>accounts:<br />- account_id: '123123123123'<br />  name: account-1<br />  regions:<br />  - us-east-1<br />  - us-west-2<br />  role: arn:aws:iam::123123123123:role/CloudCustodian<br />  vars:<br />    charge_code: xyz<br />  tags:<br />  - type:prod<br />  - division:some division<br />  - partition:us<br />  - scope:pci</pre> | 開発者 | 

### AWS アカウントをブートストラップする
<a name="bootstrap-the-aws-accounts"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| セキュリティアカウントをブートストラップします。 | 以下のコマンドを実行して、`cloudcustodian_stack` アプリケーションで `deploy_account` をブートストラップします。<pre>cdk bootstrap -a 'python3 <br />cloudcustodian/cloudcustodian_stack.py</pre> | 開発者 | 
| オプション 1 - メンバーアカウントを自動的にブートストラップします。　 | `vars.py` ファイルで `cdk_bootstrap_member_accounts` 変数が `True` に設定されている場合、`member_accounts` 変数で指定されたアカウントは パイプラインによって自動的にブートストラップされます。<br />必要に応じて、IAM ロールを使用して `*cdk_bootstrap_role*` を更新できます。このロールは、セキュリティアカウントから引き受けることができ、AWS CDK をブートストラップするために必要な権限を持っています。<br />`member_accounts ` 変数に追加された新規アカウントは、パイプラインによって自動的にブートストラップされ、必要なロールをデプロイできるようになります。 | 開発者 | 
| オプション 2 - メンバーアカウントを手動でブートストラップします。　  | この方法はお勧めしませんが、`cdk_bootstrap_member_accounts` の値を `False` に設定し、次のコマンドを使用して手動で実行できます：<pre>$ cdk bootstrap -a 'python3 cloudcustodian/member_account_roles_stack.py' \<br /><br />--trust {security_account_id} \<br /><br />--context assume-role-credentials:writeIamRoleName={role_name} \<br /><br />--context assume-role-credentials:readIamRoleName={role_name} \<br /><br />--mode=ForWriting \<br /><br />--context bootstrap=true \<br /><br />--cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess</pre>`{security_account_id}` と `{role_name}` の値は、セキュリティアカウントから引き受けることができ、AWS CDK のブートストラップに必要な権限を持つ IAM ロールの名前で更新されることを確認してください。<br />AWS CloudFormation など、他の方法を使用してメンバーアカウントをブートストラップすることもできます。詳細については、AWS CDK ドキュメントの「[ブートストラップ](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)」を参照してください。 | 開発者 | 

### AWS CDK スタックをデプロイする
<a name="deploy-the-aws-cdk-stacks"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| メンバーアカウントで IAM ロールを作成します。 | 次のコマンドを実行して、`member_account_roles_stack` スタックをデプロイし、メンバーアカウントに IAMロールを作成します：<pre>cdk deploy --all -a 'python3 cloudcustodian/member_account_roles_stack.py' --require-approval never</pre> | 開発者 | 
| Cloud Custodian パイプラインスタックをデプロイします。　 | 次のコマンドを実行して、セキュリティアカウントにデプロイされる Cloud Custodian `cloudcustodian_stack.py` パイプラインを作成します。<pre>cdk deploy -a 'python3 cloudcustodian/cloudcustodian_stack.py'</pre> | 開発者 | 

## 関連リソース
<a name="automatically-attach-an-aws-managed-policy-for-systems-manager-to-ec2-instance-profiles-using-cloud-custodian-and-aws-cdk-resources"></a>
+ [AWS CDK の使用開始](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)

## アタッチメント
<a name="attachments-169a7bde-789e-4ebd-b4ca-80eb28ac9927"></a>

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「[attachment.zip](samples/p-attach/169a7bde-789e-4ebd-b4ca-80eb28ac9927/attachments/attachment.zip)」