

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

# と CloudFormation を使用して AWS Control Tower コントロールをデプロイ AWS CDK および管理する
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation"></a>

*Iker Reina Fuente、Ivan Girardi (Amazon Web Services)*

## 概要
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-summary"></a>

このパターンでは、 AWS CloudFormation と を使用して、予防、検出、プロアクティブ AWS Control Tower コントロール AWS Cloud Development Kit (AWS CDK) をコードとしてのインフラストラクチャ (IaC) として実装および管理する方法を説明します。[コントロール](https://docs.aws.amazon.com/controltower/latest/controlreference/controls.html) (*ガードレール*とも呼ばれます) は、 AWS Control Tower 環境全体に継続的なガバナンスを提供する高レベルのルールです。たとえば、コントロールを使用して のログ記録を要求し AWS アカウント 、特定のセキュリティ関連イベントが発生した場合に自動通知を設定できます。

AWS Control Tower は、 AWS リソースを管理し、複数の にわたるコンプライアンスをモニタリングする予防、検出、プロアクティブコントロールを実装するのに役立ちます AWS アカウント。各コントロールは、1 つのルールを適用します。このパターンでは、提供された IaC テンプレートを使用して、環境にデプロイするコントロールを指定します。

AWS Control Tower コントロールは[組織単位 (OU)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#organizationalunit) 全体に適用され、コントロールは OU AWS アカウント 内のすべての に影響します。したがって、ユーザーがランディングゾーン内の任意のアカウントで作業を実行する場合、アクションは OU に適用されるコントロールに従います。

 AWS Control Tower コントロールを実装することで、 AWS ランディングゾーンの強力なセキュリティ基盤を確立できます。このパターンを使用して CloudFormation と を通じてコントロールを IaC としてデプロイすることで AWS CDK、ランディングゾーンのコントロールを標準化し、より効率的にデプロイおよび管理できます。このソリューションでは、[cdk\_nag](https://github.com/cdklabs/cdk-nag#readme) を使用してデプロイ中に AWS CDK アプリケーションをスキャンします。このツールは、アプリケーションが AWS ベストプラクティスに準拠しているかどうかをチェックします。

 AWS Control Tower コントロールを IaC としてデプロイするには、代わりに HashiCorp Terraform を使用することもできます AWS CDK。詳細については、[「Terraform を使用した AWS Control Tower コントロールのデプロイと管理](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-terraform.html)」を参照してください。

**対象者**

このパターンは AWS Control Tower、、CloudFormation AWS CDK、および の経験があるユーザーに推奨されます AWS Organizations。

## 前提条件と制限
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-prereqs"></a>

**前提条件**
+  AWS Organizations とラン AWS Control Tower ディングゾーンで組織として AWS アカウント 管理されているアクティブ。手順については、 AWS Control Tower ドキュメントの[「開始方法](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)」を参照してください。
+ AWS Command Line Interface (AWS CLI)、[インストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)および[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)済み。
+ Node Package Manager (npm) が AWS CDK用に[インストールされ設定済み](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)。
+ [の前提条件](https://docs.aws.amazon.com/cdk/v2/guide/work-with.html#work-with-prerequisites) AWS CDK。
+ デプロイアカウントで既存の AWS Identity and Access Management (IAM) ロールを引き受けるアクセス許可。
+ ブートストラップに使用できる組織の管理アカウントで IAM ロールを引き受けるアクセス許可 AWS CDK。ロールには、CloudFormation リソースを変更およびデプロイする権限が必要です。詳細については、 AWS CDK ドキュメントの[「ブートストラップ](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto)」を参照してください。
+ 組織の管理アカウントで IAM ロールとポリシーを作成するアクセス権限。詳細については、IAM ドキュメントの「[IAM リソースにアクセスするために必要なアクセス権限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_permissions-required.html)」を参照してください。

**制限事項**
+ このパターンでは AWS アカウント、デプロイアカウントから組織の管理アカウントにこのソリューションをデプロイする手順を示します。テスト目的で、このソリューションを管理アカウントに直接デプロイすることもできますが、この設定の手順は明示されていません。
+  AWS Control Tower コントロールの場合、このパターンでは、次の形式の[グローバル識別子](https://docs.aws.amazon.com/controltower/latest/controlreference/all-global-identifiers.html)を使用する必要があります。

  ```
  arn:<PARTITION>:controlcatalog:::control/<CONTROL_CATALOG_OPAQUE_ID>
  ```

  このパターンの以前のバージョンでは、サポートされなくなった[リージョン識別子](https://docs.aws.amazon.com/controltower/latest/controlreference/control-metadata-tables.html)が使用されていました。リージョン識別子からグローバル識別子に移行することを推奨します。グローバル識別子は、コントロールを管理し、使用できるコントロールの数を増やすのに役立ちます。
**注記**  
ほとんどの場合、`<PARTITION>` の値は `aws` です。

**製品バージョン**
+ AWS Control Tower バージョン 3.2 以降
+ Python バージョン 3.9 以降
+ npm バージョン 2.9.0 以降

## アーキテクチャ
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-architecture"></a>

このセクションでは、このソリューションの概要と、サンプルコードによって確立されたアーキテクチャについて説明します。次の図は、OU 内のさまざまなアカウントに展開されるコントロールを示しています。

![組織単位のすべての AWS アカウントにデプロイされた制御のアーキテクチャ図。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7d0d5e37-58ac-4621-b6b0-cb8c1c767ab0/images/47264166-3294-4a53-b0a4-5911086d636f.png)


AWS Control Tower コントロールは、その*動作*と*ガイダンス*に従って分類されます。

コントロールの動作には、主に 3 つのタイプがあります。

1. *予防コントロール*は、アクションの発生を防ぐように設計されています。これらは、 [のサービスコントロールポリシー (SCPs](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)または[リソースコントロールポリシー (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) で実装されます AWS Organizations。予防コントロールのステータスは、**適用**または**無効**です。予防的コントロールはすべての でサポートされています AWS リージョン。

1. *検出コントロール*は、特定のイベントが発生したときにそれを検出し、アクションを AWS CloudTrailに記録するように設計されています。これらは [AWS Config ルール](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html)で実装されています。検出コントロールのステータスは、**クリア**、**違反**、または**無効**です。検出コントロールは、 で AWS リージョン サポートされているコントロールにのみ適用されます AWS Control Tower。

1. *プロアクティブコントロール*は、 によってプロビジョニングされるリソースをスキャンし AWS CloudFormation 、会社のポリシーと目標に準拠しているかどうかをチェックします。準拠していないリソースはプロビジョニングされません。これらは [AWS CloudFormation フック](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/hooks.html)で実装されます。プロアクティブコントロールのステータスは、**合格**、**不合格**、または **スキップ**です。

コントロール*ガイダンス*とは、各コントロールを OUs に適用する方法について推奨されるプラクティスを指します。 AWS Control Tower は、*必須*、*強く推奨*、*選択的*の 3 つのカテゴリのガイダンスを提供します。コントロールのガイダンスは、コントロールの動作とは無関係です。詳細については、「[コントロールの動作とガイダンス](https://docs.aws.amazon.com/controltower/latest/userguide/controls.html#control-behavior)」を参照してください。

## ツール
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-tools"></a>

**AWS のサービス**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。Toolkit [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)は、 AWS CDK アプリを操作するための主要なツールです。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および 全体のライフサイクルを通じてリソースを管理するのに役立ちます AWS リージョン。
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html) は、 のリソースの詳細ビュー AWS アカウント と設定方法を提供します。リソースがどのように相互に関連しているか、またそれらの構成が時間の経過とともにどのように変化したかを特定するのに役立ちます。
+ [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html) は、規範的なベストプラクティスに従って、 AWS マルチアカウント環境のセットアップと管理に役立ちます。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) は、作成して一元管理する AWS アカウント 組織に複数の を統合するのに役立つアカウント管理サービスです。

**その他のツール**
+ [cdk\_nag](https://github.com/cdklabs/cdk-nag#readme) は、ルールパックを組み合わせて AWS CDK アプリケーションがベストプラクティスに準拠しているかどうかをチェックするオープンソースツールです。
+ [npm](https://docs.npmjs.com/about-npm/) は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイの管理に使用されます。
+ 「[Python](https://www.python.org/)」は汎用のコンピュータープログラミング言語です。

**コードリポジトリ**

このパターンのコードは、 リポジトリを使用した GitHub Deploy コントロールで使用できます。 [AWS Control TowerAWS CDK](https://github.com/aws-samples/aws-control-tower-controls-cdk)**cdk.json** ファイルを使用して AWS CDK アプリを操作し、**package.json** ファイルを使用して npm パッケージをインストールします。

## ベストプラクティス
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-best-practices"></a>
+ [最小特権の原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) (IAM ドキュメント) に従ってください。このパターンで提供されるサンプル IAM ポリシーと信頼ポリシーには、最低限必要なアクセス許可が含まれており、管理アカウントで作成された AWS CDK スタックはこれらのアクセス許可によって制限されます。
+ [AWS Control Tower 管理者向けのベストプラクティス](https://docs.aws.amazon.com/controltower/latest/userguide/best-practices.html) (AWS Control Tower ドキュメント) に従ってください。
+ (AWS CDK ドキュメント) [を使用してクラウドインフラストラクチャを開発およびデプロイするためのベストプラクティスに従います AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)。
+ をブートストラップするときは AWS CDK、ブートストラップテンプレートをカスタマイズして、管理アカウントの任意のリソースを読み書きできるポリシーと信頼されたアカウントを定義します。詳細については、「[起動のカスタマイズ](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-customizing)」を参照してください。
+ [cfn\_nag](https://github.com/stelligent/cfn_nag) などのコード分析ツールを使用して、生成された CloudFormation テンプレートをスキャンします。cfn-nag ツールは、インフラストラクチャが安全ではないことを示す可能性のあるパターンを CloudFormation テンプレートから探します。cdk-nag を使用して CloudFormation テンプレートを確認することもできます。これには [cloudformation-include](https://docs.aws.amazon.com/cdk/v2/guide/use_cfn_template.html) モジュールを使用します。

## エピック
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-epics"></a>

### コントロールを有効にする準備をしてください。
<a name="prepare-to-enable-the-controls"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 管理アカウントで IAM ロールを作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps エンジニア、AWS 全般 | 
| ブートストラップ AWS CDK。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps エンジニア、AWS 全般、Python | 
| リポジトリのクローン作成 | bash シェルで、次のコマンドを入力します。これにより、GitHub のリポジトリ[を使用して Deploy AWS Control Tower コントロール AWS CDK](https://github.com/aws-samples/aws-control-tower-controls-cdk)がクローンされます。<pre>git clone https://github.com/aws-samples/aws-control-tower-controls-cdk.git</pre> | DevOps エンジニア、AWS 全般 | 
|  AWS CDK 設定ファイルを編集します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps エンジニア、AWS 全般 | 

### 管理アカウントのコンソールを有効にする
<a name="enable-controls-in-the-management-account"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイアカウントで IAM ロールを引き受けます。 | デプロイアカウントで、管理アカウントに AWS CDK スタックをデプロイするアクセス許可を持つ IAM ロールを引き受けます。で IAM ロールを引き受ける方法の詳細については AWS CLI、『』の[「IAM ロールを使用する AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)」を参照してください。 | DevOps エンジニア、AWS 全般 | 
| 環境をアクティブ化します。 | Linux または macOS を使用している場合:[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html)<br />Windows を使用している場合:[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps エンジニア、AWS 全般 | 
| 依存関係をインストールします。 | 仮想環境がアクティブになったら、次のコマンドを入力して **install\_deps.sh** スクリプトを実行します。このスクリプトは、必要な依存ファイルをインストールします。<pre>$ ./scripts/install_deps.sh</pre> | DevOps エンジニア、AWS 全般、Python | 
| スタックをデプロイします。 | 次のコマンドを入力して、CloudFormation スタックを統合してデプロイします。<pre>$ npx cdk synth<br />$ npx cdk deploy</pre> | DevOps エンジニア、AWS 全般、Python | 

## 関連リソース
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-resources"></a>

**AWS ドキュメント**
+ [コントロールについて](https://docs.aws.amazon.com/controltower/latest/controlreference/controls.html) (AWS Control Tower ドキュメント)
+ [コントロールライブラリ](https://docs.aws.amazon.com/controltower/latest/controlreference/controls-reference.html) (AWS Control Tower ドキュメント)
+ [AWS CDK Toolkit コマンド](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-commands) (AWS CDK ドキュメント)
+ [Terraform を使用した AWS Control Tower コントロールのデプロイと管理](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-terraform.html) (AWS 規範ガイダンス)

**その他のリソース**
+ [Python](https://www.python.org/)

## 追加情報
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-additional"></a>

**constants.py ファイルの例**

以下は、更新された **constants.py** ファイルの例です。このサンプルでは、**AWS-GR\_DISALLOW\_CROSS\_REGION\_NETWORKING** コントロール (グローバル ID: `dvuaav61i5cnfazfelmvn9m6k`) と **AWS-GR\_SUBNET\_AUTO\_ASSIGN\_PUBLIC\_IP\_DISABLED** コントロール (グローバル ID: `50z1ot237wl8u1lv5ufau6qqo`) を有効にします。グローバル IDs[「すべてのグローバル識別子](https://docs.aws.amazon.com/controltower/latest/controlreference/all-global-identifiers.html)」を参照してください。 AWS Control Tower 

```
ACCOUNT_ID = 111122223333
AWS_CONTROL_TOWER_REGION = us-east-2
ROLE_ARN = "arn:aws:iam::111122223333:role/CT-Controls-Role"
GUARDRAILS_CONFIGURATION = [
    {
        "Enable-Control": {
            "dvuaav61i5cnfazfelmvn9m6k": {  # AWS-GR_DISALLOW_CROSS_REGION_NETWORKING
                "Parameters": {
                    "ExemptedPrincipalArns": ["arn:aws:iam::111122223333:role/RoleName"]
                },
                "Tags": [{"key": "Environment", "value": "Production"}]
            },
            ...
        },
        "OrganizationalUnitIds": ["ou-1111-11111111", "ou-2222-22222222"...],
    },
    {
        "Enable-Control": {
            "50z1ot237wl8u1lv5ufau6qqo",  # AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED
            ...
        },
        "OrganizationalUnitIds": ["ou-2222-22222222"...],
    },
]
```

**IAM ポリシー**

次のサンプルポリシーでは、デプロイアカウントから管理アカウントに AWS CDK スタックをデプロイするときに AWS Control Tower コントロールを有効または無効にするために必要な最小限のアクションを許可します。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "controltower:EnableControl",
                "controltower:DisableControl",
                "controltower:GetControlOperation",
                "controltower:ListEnabledControls",
                "organizations:AttachPolicy",
                "organizations:CreatePolicy",
                "organizations:DeletePolicy",
                "organizations:DescribeOrganization",
                "organizations:DescribeOrganizationalUnit",
                "organizations:DetachPolicy",
                "organizations:ListAccounts",
                "organizations:ListAWSServiceAccessForOrganization",
                "organizations:ListChildren",
                "organizations:ListOrganizationalUnitsForParent",
                "organizations:ListParents",
                "organizations:ListPoliciesForTarget",
                "organizations:ListRoots",
                "organizations:UpdatePolicy",
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}
```

**信頼ポリシー**

以下のカスタム信頼ポリシーでは、デプロイアカウントの特定の IAM ロールが管理アカウントの IAM ロールを引き継ぐことを許可しています。以下に置き換えます:
+ `<DEPLOYMENT-ACCOUNT-ID>` は、デプロイアカウントの ID です
+ `<DEPLOYMENT-ROLE-NAME>` は、管理アカウントでロールを引き受けることが許可されているデプロイアカウント内のロールの名前です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME>"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}
```