

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

# Terraform を使用した AWS Control Tower コントロールのデプロイと管理
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform"></a>

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

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

このパターンでは、 AWS Control Tower コントロール、HashiCorp Terraform、Infrastructure as Code (IaC) を使用して、予防、検出、プロアクティブセキュリティコントロールを実装および管理する方法を説明します。[コントロール](https://docs.aws.amazon.com/controltower/latest/userguide/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 ランディングゾーンの強力なセキュリティ基盤を確立できます。このパターンを使用してコントロールを Terraform IaC としてデプロイすることで、ランディングゾーンでのコントロールを標準化し、より効率的にデプロイして管理できます。

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

**対象者**

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

## 前提条件と制限
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-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)済み。
+ このパターンをデプロイするアクセス許可を持つ管理アカウントの AWS Identity and Access Management (IAM) ロール。必要な権限とサンプルポリシーの詳細については、このパターンの「[追加情報](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-additional)」セクションにある「*IAM ロールの最小特権*」を参照してください。
+ 管理アカウントで IAM ロールを割り当てる権限。
+ Terraform CLI を[インストール済み](https://developer.hashicorp.com/terraform/cli) (Terraform のドキュメント)
+ Terraform AWS Provider、[設定](https://hashicorp.github.io/terraform-provider-aws/)済み (Terraform ドキュメント）。
+ Terraform バックエンドを[設定済み](https://developer.hashicorp.com/terraform/language/backend) (Terraform のドキュメント)

**制限事項**
+  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 以降
+ Terraform バージョン 1.5 以降
+ Terraform AWS プロバイダーバージョン 4.67 以降

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

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

![\[組織単位のすべての AWS アカウントにデプロイされた制御のアーキテクチャ図。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/6e0d6c30-a539-44b7-8415-e669fb2ad26a/images/60407c0e-852e-4d5f-9a7d-8510316063aa.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-terraform-tools"></a>

**AWS のサービス**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) は、 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 アカウント 組織に複数の を統合するのに役立つアカウント管理サービスです。

**その他のツール**
+ [HashiCorp Terraform](https://www.terraform.io/docs) は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのを支援する Infrastructure as Code (IaC) ツールです。

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

このパターンのコードは、GitHub [Deploy and manage AWS Control Tower controls by using Terraform repository ](https://github.com/aws-samples/aws-control-tower-controls-terraform)で入手できます。

## ベストプラクティス
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-best-practices"></a>
+ このソリューションのデプロイに使用する IAM ロールは、「[最小権限の原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)」 (IAM ドキュメント) に従う必要があります。
+ [AWS Control Tower 管理者向けのベストプラクティス](https://docs.aws.amazon.com/controltower/latest/userguide/best-practices.html) (AWS Control Tower ドキュメント) に従います。

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

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


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | bash シェルで、次のコマンドを入力します。これにより、GitHub の [Terraform リポジトリを使用して AWS Control Tower 、コントロールのデプロイと管理の](https://github.com/aws-samples/aws-control-tower-controls-terraform)クローンが作成されます。<pre>git clone https://github.com/aws-samples/aws-control-tower-controls-terraform.git</pre> | DevOps エンジニア | 
| Terraform バックエンド設定ファイルを編集します。 | [\[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-terraform.html) | DevOps エンジニア、Terraform | 
| Terraform プロバイダー設定ファイルを編集します。 | [\[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-terraform.html) | DevOps エンジニア、Terraform | 
| 設定ファイルを編集します。 | [\[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-terraform.html) | DevOps エンジニア、AWS 全般、Terraform | 
| 管理アカウントで IAM ロールを割り当てます。 | 管理アカウントでは、Terraform 設定ファイルをデプロイする権限のある IAM ロールを引き受けます。必要な権限とサンプルポリシーの詳細については、このパターンの「[追加情報](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-additional)」セクションにある「*IAM ロールの最小特権*」を参照してください。で IAM ロールを引き受ける方法の詳細については AWS CLI、『』の[「IAM ロールを使用する AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)」を参照してください。 | DevOps エンジニア、AWS 全般 | 
| 設定ファイルをデプロイします。 | [\[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-terraform.html) | DevOps エンジニア、AWS 全般、Terraform | 

### (オプション) AWS Control Tower 管理アカウントのコントロールを無効にする
<a name="optional-disable-controls-in-the-ctower-management-account"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| `destroy` コマンドを実行します。 | 以下のコマンドを入力して、このパターンでデプロイされたリソースを削除します。<pre>$ terraform destroy -var-file="variables.tfvars"</pre> | DevOps エンジニア、AWS 全般、Terraform | 

## トラブルシューティング
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| `Error: creating ControlTower Control ValidationException: Guardrail <control ID> is already enabled on organizational unit <OU ID>` エラー | 有効化しようとするコントロールは、ターゲット OU で有効になっています。このエラーは、ユーザーが を通じて、 を通じて AWS マネジメントコンソール、 AWS Control Tower または を通じてコントロールを手動で有効にした場合に発生する可能性があります AWS Organizations。Terraform 設定ファイルをデプロイするには、次のいずれかのオプションを使用できます。**オプション 1: Terraform の現在の状態ファイルを更新する**Terraform の現在の状態ファイルにリソースをインポートできます。`apply` コマンドを再実行すると、Terraform はこのリソースをスキップします。次の手順に従い、現在の Terraform 状態にリソースをインポートします。[\[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-terraform.html)**オプション 2: コントロールを無効にする**実稼働以外の環境で作業している場合は、コンソールでコントロールを無効にできます。「[エピック](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-epics)」セクションにある「*設定を展開する*」の手順を繰り返して、再度有効にします。コントロールが無効になる期間があるため、このアプローチは実稼働環境にはお勧めしません。このオプションを本番環境で使用する場合は、 AWS Organizationsに SCP を一時的に適用するなど、一時的な制御を実装できます。 | 

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

**AWS ドキュメント**
+ [コントロールについて](https://docs.aws.amazon.com/controltower/latest/userguide/controls.html) (AWS Control Tower ドキュメント)
+ [コントロールライブラリ](https://docs.aws.amazon.com/controltower/latest/userguide/controls-reference.html) (AWS Control Tower ドキュメント)
+ [AWS CDK と を使用して AWS Control Tower コントロールをデプロイおよび管理します AWS CloudFormation](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) (AWS 規範ガイダンス)

**その他のリソース**
+ [Terraform](https://www.terraform.io/)
+ [Terraform CLI のドキュメント](https://www.terraform.io/cli)

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

**variables.tfvars ファイルの例******

以下に、更新された **variables.tfvars** ファイルの例を示します。このサンプルでは、**AWS-GR\$1ENCRYPTED\$1VOLUMES** コントロール (グローバル ID: `503uicglhjkokaajywfpt6ros`) と **AWS-GR\$1SUBNET\$1AUTO\$1ASSIGN\$1PUBLIC\$1IP\$1DISABLED** コントロール (グローバル ID: `50z1ot237wl8u1lv5ufau6qqo`) を有効にします。グローバル IDs[「すべてのグローバル識別子](https://docs.aws.amazon.com/controltower/latest/controlreference/all-global-identifiers.html)」を参照してください。 AWS Control Tower 

次の例では、**CT.S3.PV.5** (グローバル ID: `7mo7a2h2ebsq71l8k6uzr96ou`) や **CT.SECRETSMANAGER.PV.1** (グローバル ID: `dvhe47fxg5o6lryqrq9g6sxg4`) などのパラメータを持つコントロールも有効にしています。パラメータを含むコントロールのリストについては、 AWS Control Tower ドキュメントの[「パラメータを含むコントロール](https://docs.aws.amazon.com/controltower/latest/controlreference/control-parameter-concepts.html)」を参照してください。

```
controls = [
    {
        control_names = [
            "503uicglhjkokaajywfpt6ros", # AWS-GR_ENCRYPTED_VOLUMES
            ...
        ],
        organizational_unit_ids = ["ou-1111-11111111", "ou-2222-22222222"...],
    },
    {
        control_names = [
            "50z1ot237wl8u1lv5ufau6qqo", # AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED
            ...
        ],
        organizational_unit_ids = ["ou-1111-11111111"...],
    },
]

controls_with_params = [
  {
    control_names = [
      { "7mo7a2h2ebsq71l8k6uzr96ou" = { # CT.S3.PV.5
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
          "ExemptedResourceArns" : [],
        }
      } },
      { "dvhe47fxg5o6lryqrq9g6sxg4" = { # CT.SECRETSMANAGER.PV.1
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      ...
    ],
    organizational_unit_ids = ["ou-1111-11111111"...]
  },
  {
    control_names = [
      { "dvuaav61i5cnfazfelmvn9m6k" = { # AWS-GR_DISALLOW_CROSS_REGION_NETWORKING
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      { "41ngl8m5c4eb1myoz0t707n7h" = { # AWS-GR_DISALLOW_VPC_INTERNET_ACCESS
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      ...
    ],
    organizational_unit_ids = ["ou-2222-22222222"...]
  }
]
```

**IAM ロールの最小特権**

このパターンでは、管理アカウントで IAM ロールを引き受ける必要があります。一時的な権限を持つロールを割り当て、最小特権の原則に従って権限を制限するのがベストプラクティスです。次のサンプルポリシーでは、 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:DetachPolicy",
                "organizations:ListAccounts",
                "organizations:ListAWSServiceAccessForOrganization",
                "organizations:ListChildren",
                "organizations:ListOrganizationalUnitsForParent",
                "organizations:ListParents",
                "organizations:ListPoliciesForTarget",
                "organizations:ListRoots",
                "organizations:UpdatePolicy"
            ],
            "Resource": "*"
        }
    ]
}
```