

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

# CfCT カスタマイズガイド
<a name="cfct-customizations-dev-guide"></a>

 *AWS Control Tower のカスタマイズ* (CfCT) ガイドは、AWS Control Tower 環境を会社または顧客向けにカスタマイズおよび拡張することを希望する管理者、DevOps プロフェッショナル、独立系ソフトウェアベンダー、IT インフラストラクチャアーキテクト、システムインテグレーターを対象としています。このガイドでは、CfCT カスタマイズパッケージを使用して AWS Control Tower 環境をカスタマイズおよび拡張する際に役立つ情報を提供します。

**注記**  
 (CfCT) をデプロイして設定するには、設定パッケージをデプロイして処理する必要があります AWS CodePipeline。以下のセクションではこのプロセスを詳しく説明します。

# コードパイプラインの概要
<a name="cfct-codepipeline-overview"></a>

設定パッケージには、Amazon Simple Storage Service (Amazon S3) と が必要です AWS CodePipeline。設定パッケージには、次の項目が含まれています。
+ マニフェストファイル
+ 付随するテンプレートのセット
+ AWS Control Tower 環境のカスタマイズを記述および実装するためのその他の JSON ファイル

デフォルトでは、`_custom-control-tower-configuration.zip` 設定パッケージは、次の命名規則に従って Simple Storage Service (Amazon S3) バケットにロードされます。

`custom-control-tower-configuration-accountID-region`.

**注記**  
 デフォルトでは、CfCT はパイプラインソースを格納するために Amazon S3 バケットを作成します。ほとんどのお客様は、このデフォルトのままで構いません。既存の AWS CodeCommit リポジトリがある場合は、ソースの場所を AWS CodeCommit リポジトリに変更できます。詳細については、「AWS CodePipeline ユーザーガイド**」の「[CodePipeline でパイプラインを編集する](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-edit.html)」を参照してください。

マニフェストファイル**は、ランディングゾーンをカスタマイズするためにデプロイできる AWS リソースについて記述するテキストファイルです。CodePipeline は次のタスクを実行します。
+ マニフェストファイル、それに付随するテンプレートのセット、およびその他の JSON ファイルを抽出する
+ マニフェストとテンプレートの検証を実行する
+ CfCT マニフェストファイル内のセクションを呼び出して特定の[パイプラインステージ](#code-pipeline-stages)を実行する。

マニフェストファイルをカスタマイズし、設定パッケージのファイル名からアンダースコア (\$1) を削除して設定パッケージを更新すると、 AWS CodePipelineが自動的に開始されます。

**アンダースコアを覚えておく**  
設定パッケージのサンプルファイル名はアンダースコア (\$1) で始まるため、 AWS CodePipeline は自動的に開始されません。設定パッケージのカスタマイズが完了したら、 AWS CodePipelineでデプロイをトリガーするため、アンダースコア (\$1) を付けずにファイル `custom-control-tower-configuration.zip` をアップロードします。

## AWS CodePipeline ステージ
<a name="code-pipeline-stages"></a>

CfCT パイプラインでは、AWS Control Tower 環境を実装および更新するためにいくつかの AWS CodePipeline ステージが必要です。

1. **ソースステージ**

   ソースステージは最初のステージです。カスタマイズされた設定パッケージによって、このパイプラインステージが開始されます。のソースは、設定パッケージをホストできる Amazon S3 バケットまたは AWS CodeCommit リポジトリのいずれか AWS CodePipeline です。

1. **ビルドステージ**

   ビルドステージでは AWS CodeBuild 、設定パッケージの内容を検証する必要があります。これらのチェックには、 および を使用して、`manifest.yaml`ファイルの構文とスキーマ、パッケージに含まれるすべての CloudFormation テンプレート、またはリモートでホストされているすべてのテンプレートのテスト CloudFormation `validate-template`が含まれます`cfn_nag`。マニフェストファイルと CloudFormation テンプレートがテストに合格すると、パイプラインは次のステージに進みます。テストに不合格だった場合は、CodeBuild ログを確認して問題を特定し、必要に応じて設定ソースファイルを編集できます。

1. **手動承認ステージ (オプション)**

   手動承認ステージはオプションです。このステージを有効にすると、設定パイプラインをさらに制御できます。承認が得られるまで、デプロイ中のパイプラインは一時停止します。手動承認をオプトインするには、スタックを起動したときに、**[Pipeline Approval Stage]** (パイプライン承認ステージ) パラメータを **[Yes]** (はい) に変更します。

1. **ポリシーステージ**

   ポリシーステージは、サービスコントロールポリシー (SCP) またはリソースコントロールポリシー (RCP) ステートマシンを呼び出して、SCPsまたは RCP を作成する AWS Organizations APIs を呼び出します。 RCPs

1. **CloudFormation リソースステージ**

    CloudFormation リソースステージは、スタックセットステートマシンを呼び出して、マニフェストファイルで指定したアカウントまたは組織単位 (OUs) のリストで指定されたリソースをデプロイします。ステートマシンは、マニフェストファイルで指定された順序で CloudFormation リソースを作成します。リソースの依存関係を指定するには、マニフェストファイルでリソースが指定されている順序を調整します。マニフェストファイル内のリソースの順序は、依存関係を指定する唯一の方法です。

# カスタム設定の定義
<a name="cfct-custom-configuration"></a>

CfCT マニフェストファイル、付随するテンプレートのセット、およびその他の JSON ファイルを使用して、カスタム AWS Control Tower 設定を定義します。これらのファイルをフォルダ構造にパッケージ化し、次のコード例に示すように、Simple Storage Service (Amazon S3) バケット内に `.zip` ファイルとして配置します。

**カスタム設定フォルダ構造**

```
- manifest.yaml
- policies/                                                [optional]
   - service control policies files (*.json)
- templates/                                               [optional]
   - template files for AWS CloudFormation Resources (*.template)
```

前の例は、カスタム設定フォルダの構造を示しています。Amazon S3 または AWS CodeCommit リポジトリをソースストレージの場所として選択した場合でも、フォルダ構造は変わりません。Simple Storage Service (Amazon S3) をソースストレージとして選択した場合は、すべてのフォルダとファイルを `custom-control-tower-configuration.zip` ファイルをアップロードし、`.zip` ファイルのみを指定された Simple Storage Service (Amazon S3) バケットにアップロードします。

**注記**  
を使用している場合は AWS CodeCommit、ファイルを圧縮せずにリポジトリにファイルを配置します。

# CfCT マニフェストファイル
<a name="the-manifest-file"></a>

CfCT `manifest.yaml` ファイルは、 AWS リソースを記述するテキストファイルです。次の例は、CfCT マニフェストファイルの構造を示しています。

```
---
region: String
version: 2021-03-15

resources:
  #set of CloudFormation resources, SCP policies, or RCP policies
...
```

前のコード例で示したように、マニフェストファイルの最初の 2 行は、**region** と **version** キーワードの値を指定します。これらのキーワードの定義は次のとおりです。

**region** — AWS Control Tower のデフォルトリージョンのテキスト文字列。この値は、有効な AWS リージョン名 (`us-east-1`、、 `eu-west-1`など) である必要があります`ap-southeast-1`。AWS Control Tower のホームリージョンは、リソース固有のリージョンが指定されていない限り、カスタム AWS Control Tower リソース ( CloudFormation StackSets など) を作成するときのデフォルトです。

```
region:your-home-region
```

**version** — マニフェストスキーマのバージョン番号。サポートされている最新バージョンは 2021-03-15 です。

```
version: 2021-03-15
```

**注記**  
最新バージョンの使用をお勧めします。マニフェストプロパティを最新バージョンに更新するには、「[CfCT マニフェストのバージョンアップグレード](cfct-compatibility.md)」を参照してください。

前の例で示した次のキーワードは、**resource** キーワードです。マニフェストファイルの **[resources]** (リソース) セクションは高度に構造化されています。これには、CfCT パイプラインによって自動的にデプロイされる AWS リソースの詳細なリストが含まれています。次のセクションで、リソースとその使用可能なパラメータについて説明します。

# CfCT マニフェストファイルの [リソース] セクション
<a name="cfct-manifest-file-resources-section"></a>

 このトピックでは、CfCT マニフェストファイルの **[リソース]** セクションについて説明します。このセクションでは、カスタマイズに必要なリソースを定義します。CfCT マニフェストファイルのこのセクションは、キーワード **resources** から始まり、ファイルの末尾まで続きます。

 マニフェストファイルの**リソース**セクションでは、コードパイプラインを介して CfCT が自動的にデプロイする StackSets、または AWS Organizations SCPs と RCPs を指定します CloudFormation 。OU、アカウント、およびリージョンを一覧表示してスタックインスタンスをデプロイできます。

 スタックインスタンスは OU レベルではなくアカウントレベルでデプロイされます。SCP と RCP は OU レベルでデプロイされます。詳細については、「[独自のカスタマイズを構築する](https://docs.aws.amazon.com/controltower/latest/userguide/cfcn-byo-customizations.html)」を参照してください。

 次のサンプルテンプレートには、マニフェストファイルの **[リソース]** セクションで利用可能なエントリが説明されています。

```
resources: # List of resources
  - name: [String]
    resource_file: [String] [Local File Path, S3 URI, S3 URL] 
    deployment_targets: # account and/or organizational unit names
      accounts: # array of strings, [0-9]{12}
        - 012345678912
        - AccountName1
      organizational_units: #array of strings
        - OuName1
        - OuName2 
    deploy_method: scp | stack_set | rcp
    parameters: # List of parameters [SSM, Alfred, Values]
      - parameter_key: [String]
        parameter_value: [String]  
    export_outputs: # list of ssm parameters to store output values
      - name: /org/member/test-ssm/app-id
        value: $[output_ApplicationId]    
    regions: #list of strings
    - [String]
```

**このトピックの残りの部分では、前のコード例で示したキーワードの詳しい定義について説明します。**

**name** — CloudFormation StackSets に関連付けられた名前。指定する文字列は、スタックセットに対してよりわかりやすい名前を割り当てます。
+  **タイプ:** 文字列
+ **必須**: はい
+ **有効な値:** a～z、A～Z、0～9、およびハイフン (-)。名前はアルファベット文字で始まる必要があります。

**説明**: リソースの説明。
+ **タイプ:** 文字列
+ **必須:** いいえ

 **resource\$1file** – このファイルは、マニフェストファイルへの相対的な場所、 CloudFormation リソース、SCPs、または RCPs を作成するための JSON の CloudFormation テンプレートまたは AWS Organizations サービスコントロールポリシーを指す Amazon S3 URI または URL として指定できます。
+ **タイプ**: 文字列
+ **必須**: はい 

1. 次の例で示している `resource_file` は、設定パッケージ内のリソースファイルへの相対的な場所として指定されます。

   ```
   resources:
     - name: SecurityRoles
       resource_file: templates/custom-security.template
   ```

1. 次の例は、Amazon S3 URI として指定されているリソースファイルを示しています。

   ```
   resources:
     - name: SecurityRoles
       resource_file: s3://amzn-s3-demo-bucket/[key-name]
   ```

1. 次の例は、Simple Storage Service (Amazon S3) HTTPS URL として指定されているリソースファイルを示しています。

   ```
   resources:
     - name: SecurityRoles
       resource_file: https://bucket-name.s3.Region.amazonaws.com/key-name
   ```
**注記**  
Simple Storage Service (Amazon S3) URL を指定する場合は、バケットポリシーで、CfCT のデプロイ元となる AWS Control Tower 管理アカウントの読み取りアクセスが許可されていることを確認します。Simple Storage Service (Amazon S3) HTTPS URL を指定する場合は、パスがドット表記を使用していることを確認します。例えば、`S3.us-west-1`。CfCT は、S3 とリージョンの間にダッシュを含むエンドポイントをサポートしていません (`S3‐us-west-2` など)。

1. 次の例は、リソースを保存する Simple Storage Service (Amazon S3) バケットポリシーと ARN を示しています。

   ```
   {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
           "Effect": "Allow",
           "Principal": {"AWS": "arn:aws:iam::AccountId:root"},
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::my-bucket/*”
          }
      ]
   }  
   ```

   この例では、*AccountId* 変数を、CfCT をデプロイしている管理アカウントの AWS アカウント ID に置き換えます。その他の例については、「Amazon Simple Storage Service ユーザーガイド」の「[バケットポリシーの例](https://docs.aws.amazon.com//AmazonS3/latest/userguide/example-bucket-policies.html)」を参照してください。

**parameters** — CloudFormation パラメータの名前と値を指定します。
+ **タイプ**: MapList
+ **必須:** いいえ

[parameters] (パラメータ) セクションには、キー/値パラメータのペアが含まれます。次の疑似テンプレートは、**[parameters]** (パラメータ) セクションの概要を示します。

```
parameters:
  - parameter_key: [String]
    parameter_value: [String]
```
+ **parameter\$1key** — パラメータに関連付けられたキー。
  +  **タイプ:** 文字列
  + **必須**: はい (パラメータプロパティの下)
  + **有効な値**: a～z、A～Z、0～9 
+ **parameter\$1value** - パラメータに関連付けられた入力値。
  + **タイプ:** 文字列 
  +  **必須**: はい (パラメータプロパティの下) 

**deploy\$1method** — アカウントにリソースをデプロイするためのデプロイ方法。現在、**deploy\$1method** は、 CloudFormation StackSets を介したリソースデプロイ`stack_set`のオプション、SCP をデプロイする場合は `scp` オプション、RCPs をデプロイする場合は `rcp`オプションを使用してリソースのデプロイをサポートしています。 SCPs
+ **タイプ**: 文字列 
+ 有効な値: `stack_set` \$1 `scp` \$1 `rcp`****
+ **必須:** はい

**deployment\$1targets** – CfCT がアカウントまたは organization\$1units として指定された CloudFormation リソースをデプロイする**アカウント**または組織単位 (OUs) のリスト。 ****

**注記**  
 SCPまたは RCP をデプロイする場合、ターゲットはアカウントではなく OU である必要があります。
+ **タイプ**: このリソースが特定のアカウントリストにデプロイされることを示す文字列 `account name` または `account number`、あるいはこのリソースが指定された OU リストにデプロイされることを示す `OU names` のリスト。
+ **必須**: **accounts** または **organizational\$1units** のうち少なくとも 1 つ
  + **accounts**:

    **タイプ**: このリソースが特定のアカウントリストにデプロイされることを示す文字列 `account name` または `account number` のリスト。
  + **organizational\$1units**:

    **タイプ**: このリソースが特定の OU リストにデプロイされることを示す文字列 `OU names` のリスト。アカウントを含まない OU を指定し、**accounts** プロパティを追加していない場合、CfCT はスタックセットのみを作成します。
**注記**  
組織の管理アカウント ID が許可されている値ではありません。デフォルトでは、CfCT は、組織の管理アカウントへのスタックインスタンスのデプロイをサポートしていません。特別なユースケースがある場合は、「[ルート OU](https://docs.aws.amazon.com//controltower/latest/userguide/cfct-root-ou.html)」を参照してください。

**export\$1outps** — SSM パラメータキーを表す名前/値のペアのリスト。これらの SSM パラメータキーを使用すると、テンプレート出力を SSM パラメータストアに格納できます。出力は、先にマニフェストファイルで定義済みの他のリソースから参照されることになります。

```
export_outputs: # List of SSM parameters
  - name: [String]
    value: [String]
```
+ **タイプ:** **name** および **value** キーペアのリスト。**name** には SSM パラメータストアキーの `name` 文字列が含まれ、**value** にはパラメータの `value` 文字列が含まれています。
+ **有効な値**: 任意の文字列、または *CfnOutput-Logical-ID* がテンプレート出力変数に対応する `$[output_CfnOutput-Logical-ID]` 変数。 CloudFormation テンプレートの出力セクションの詳細については、*CloudFormation 「 ユーザーガイド*」の[https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/outputs-section-structure.html](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
+ **必須:** いいえ 

例えば、次のコードスニペットは、`/org/member/audit/vpc_id` という名前の SSM パラメータキーにテンプレート `VPCID` の出力変数を保存します。

```
export_outputs: # List of SSM parameters
  - name: /org/member/audit/VPC-ID
    value: $[output_VPCID]
```

**注記**  
**export\$1outps** キー名には、`output` 以外の値を含めることができます。例えば、**name** が `/org/environment-name` の場合、**value** は `production` とすることができます。

**regions** – CfCT が CloudFormation スタックインスタンスをデプロイするリージョンのリスト。
+ **タイプ:** AWS 商用リージョン名のリスト。このリソースが指定されたリージョンリストにデプロイされることを示します。このキーワードがマニフェストファイルに存在しない場合、リソースはホームリージョンにのみデプロイされます。
+ **必須:** いいえ 

# ルート OU
<a name="cfct-root-ou"></a>

 **マニフェスト V2 バージョン (2021-03-15)** では、CfCT は `organizational_units` の組織単位 (OU) の値としての**ルート**をサポートしています。
+ `scp` または `rcp` のデプロイ方法を選択した場合、`organizational_units` でルートを追加すると、AWS Control Tower はルートの下にあるすべての OU にポリシーを適用します。`stack_set` のデプロイ方法を選択した場合、`organizational_units` でルートを追加すると、CfCT は、管理アカウントを除き、AWS Control Tower に登録されているルートの下にあるすべてのアカウントにスタックセットをデプロイします。
+ AWS Control Tower のベストプラクティスに従って、管理アカウントはメンバーアカウントの管理と請求のみを目的としています。AWS Control Tower 管理アカウントで本番ワークロードを実行しないでください。

  ベストプラクティスのガイダンスに従って、AWS Control Tower のデプロイでは、管理アカウントはルート OU の下に置かれています。これにより、フルアクセス権を付与しながら、管理アカウントが追加のリソースを実行しないようにします。この理由のため、**AWSControlTowerExecution** ロールは管理アカウントにデプロイされません。
+ 管理アカウントについては、次のベストプラクティスに従うことをお勧めします。特定のユースケースで、管理アカウントにスタックセットをデプロイする必要がある場合は、**accounts** をデプロイターゲットとして含め、管理アカウントを指定します。それ以外の場合は、**accounts** をデプロイターゲットとして含めないでください。必要な IAM ロールなど、不足しているリソースを管理アカウントで作成する必要があります。

管理アカウントにスタックセットをデプロイするには、`accounts` をデプロイターゲットとして含め、管理アカウントを指定します。それ以外の場合は、accounts をデプロイターゲットとして含めないでください。

```
---
region: your-home-region
version: 2021-03-15

resources:

  …truncated…

    deployment_targets:
      organizational_units:
        - Root
```

**注記**  
ルート OU 機能は、V2 バージョンのマニフェストファイル (2021-03-15) でのみサポートされます。`organizational_units` の OU として **[Root]** (ルート) を追加する場合、他の OU は追加しないでください。

# ネストされた OU
<a name="cfct-nested-ou"></a>

CfCT では、1 つ以上のネストされた OU をマニフェスト V2 バージョン (2021-03-15) の `organizational_units` キーワードでリストすることができます。

OU 間の区切り文字としてコロンを使用した、ネストされた OU の完全なパス (ルートを除く) が必要です。`scp` または `rcp` のデプロイ方法では、AWS Control Tower は、ネストされた OU パスの最後の OU に SCP または RCP をデプロイします。デプロイ方法 `stack_set` では、AWS Control Tower は、ネストされた OU パスの最後の OU のすべてのアカウントに、スタックセットをデプロイします。

例えば、パス `OUName1:OUName2:OUName3` について考えてみましょう。パス内の最後の OU は `OUName3` です。CfCT は SCP または RCP を `OUName3` にデプロイし、スタックセットを `OUName3` の直下にあるすべてのアカウントにデプロイします。

```
---
region: your-home-region
version: 2021-03-15

resources:

  …truncated…

    deployment_targets:
      organizational_units:
        - OuName1:OUName2:OUName3
```

**注記**  
ネストされた OU 機能は、V2 バージョンのマニフェストファイル (2021-03-15) でのみサポートされます。

# 独自のカスタマイズを構築する
<a name="cfcn-byo-customizations"></a>

独自のカスタマイズを構築するには、サービスコントロールポリシー (SCPs)、リソースコントロールポリシー (RCPs)、および CloudFormation リソースを追加または更新することで、CfCT `manifest.yaml` ファイルを変更します。デプロイする必要があるリソースについては、アカウントと OU を追加または削除できます。パッケージフォルダ内のテンプレートを追加または変更したり、独自のフォルダを作成したり、テンプレートまたは `manifest.yaml` ファイル内のフォルダを参照したりできます。

このセクションでは、独自のカスタマイズを構築する際の 2 つの主要部分について説明します。
+ サービスコントロールポリシー用に独自の設定パッケージをセットアップする方法
+  AWS CloudFormation スタックセット用に独自の設定パッケージを設定する方法

# SCP または RCP の設定パッケージを設定する
<a name="cfcn-set-up-custom-scps"></a>

このセクションでは、サービスコントロールポリシー (SCP) または リソースコントロールポリシー (RCP) 用の設定パッケージを作成する方法を説明します。このプロセスの 2 つの主要部分は、(1) CfCT マニフェストファイルの準備、(2) フォルダ構造の準備です。

## ステップ 1: manifest.yaml ファイルを編集する
<a name="cfct-byo-scp-step-1"></a>

サンプル `manifest.yaml` ファイルを出発点として使用します。必要な設定をすべて入力します。`resource_file` および `deployment_targets` の詳細を追加します。

次のスニペットは、デフォルトマニフェストファイルを示しています。

```
---
region: us-east-1
version: 2021-03-15

resources: []
```

`region` の値は、デプロイ時に自動的に追加されます。これは CfCT をデプロイしたリージョンと一致する必要があります。このリージョンは AWS Control Tower リージョンと同じものにする必要があります。

Amazon S3 バケットに格納されている zip パッケージ内の `example-configuration` フォルダにカスタム SCP または RCP を追加するには、`example-manifest.yaml` ファイルを開き、編集を開始します。

```
---
region: your-home-region
version: 2021-03-15

resources:
  - name: test-preventive-controls
    description: To prevent from deleting or disabling resources in member accounts
    resource_file: policies/preventive-controls.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - OUName1
        - OUName2 

…truncated…
```

次のスニペットは、カスタマイズされたマニフェストファイルの例を示しています。1 回の変更で複数のポリシーを追加できます。

```
---
region: us-east-1
version: 2021-03-15

resources:
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - OUName1
        - OUName2
```

## ステップ 2: フォルダ構造を作成する
<a name="cfct-byo-scp-step-2"></a>

リソースファイルに Simple Storage Service (Amazon S3) URL を使用していて、キーと値のペアの **parameters** を使用している場合、このステップを省略できます。

マニフェストファイルは JSON ファイルを参照するため、マニフェストをサポートするには、SCP ポリシーまたは RCP ポリシーを JSON 形式で含める必要があります。マニフェストファイルに指定されたパス情報とファイルパスが一致していることを確認します。
+ *policy* JSON ファイルには、OU にデプロイされる SCP または RCP が含まれています。

次のスニペットは、サンプルマニフェストファイルのフォルダ構造を示しています。

```
- manifest.yaml
- policies/
   - block-s3-public.json
```

以下のスニペットは、`block-s3-public.json` ポリシーファイルの一例です。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"GuardPutAccountPublicAccessBlock",
         "Effect":"Deny",
         "Action":"s3:PutAccountPublicAccessBlock",
         "Resource":"arn:aws:s3:::*"
      }
   ]
}
```

------

# CloudFormation StackSets の設定パッケージを設定する
<a name="cfcn-byo-cfn-stacksets"></a>

このセクションでは、 CloudFormation StackSets の設定パッケージを設定する方法について説明します。このプロセスの 2 つの主要部分は、(1) マニフェストファイルの準備、(2) フォルダ構造の更新です。

## ステップ 1: 既存のマニフェストファイルを編集する
<a name="cfcn-byo-cfn-stacksets-step-1"></a>

以前に編集したマニフェストファイルに新しい CloudFormation StackSets 情報を追加します。

次のスニペットには、確認のため、SCP または RCP 用の設定パッケージをセットアップするために前述したものと同じカスタマイズされたマニフェストファイルが含まれています。このファイルをさらに編集して、リソースの詳細を含めることができるようになりました。

```
---
region: us-east-1
version: 2021-03-15

resources:
  
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
    organizational_units: #array of strings
    - OUName1
    - OUName2
```

次のスニペットは、`resources` の詳細を含む編集済みのサンプルマニフェストファイルを示します。`resources` の順序は、`resources` の依存関係を作成するための実行順序を決定します。次のサンプルマニフェストファイルをビジネス要件に応じて編集できます。

```
---
region: your-home-region
version: 2021-03-15

…truncated…

resources:
  - name: stackset-1
    resource_file: templates/create-ssm-parameter-keys-1.template
    parameters:
      - parameter_key: parameter-1
        parameter_value: value-1
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - account number or account name
        - 123456789123
      organizational_units: #array of strings, ou ids, ou-xxxx
        - OuName1
        - OUName2 
    export_outputs:
      - name: /org/member/test-ssm/app-id
        value: $[output_ApplicationId]
    regions:
      - region-name

  - name: stackset-2
    resource_file: s3://bucket-name/key-name
    parameters:
      - parameter_key: parameter-1
        parameter_value: value-1
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - account number or account name
        - 123456789123
      organizational_units: #array of strings
        - OuName1
        - OUName2 
regions:
  - region-name
```

次の例は、マニフェストファイルに複数の CloudFormation リソースを追加できることを示しています。

```
---
region: us-east-1
version: 2021-03-15

resources:
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - Custom
        - Sandbox

  - name: transit-network
    resource_file: templates/transit-gateway.template
    parameter_file: parameters/transit-gateway.json
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - Prod
        - 123456789123 #Network
      organizational_units: #array of strings
        - Custom
    export_outputs:
      - name: /org/network/transit-gateway-id
        value: $[output_TransitGatewayID]
    regions:
      - us-east-1
```

## ステップ 2: フォルダ構造を更新する
<a name="cfct-byo-cfn-stacksets-step-2"></a>

フォルダ構造を更新するときは、マニフェストファイルにあるすべてのサポート CloudFormation テンプレートファイルと SCP または RCP ポリシーファイルを含めることができます。ファイルパスがマニフェストファイルで指定したものと一致していることを確認します。
+ *テンプレート*ファイルには、OUs とアカウントにデプロイされる AWS リソースが含まれています。
+ *policy* ファイルには、テンプレートファイルで使用される入力パラメータが含まれます。

次の例は、[ステップ 1](#cfcn-byo-cfn-stacksets-step-1) で作成したサンプルマニフェストファイルのフォルダ構造を示しています。

```
- manifest.yaml
- policies/
   - block-s3-public.json
- templates/
   - transit-gateway.template
```

# 「alfred」ヘルパーと CloudFormation パラメータファイル
<a name="alfred-helper"></a>

 CfCT には、 CloudFormation テンプレートで定義されている [SSM パラメータストア](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html)キーの値を取得するための *alfred* ヘルパーと呼ばれるメカニズムが用意されています。*alfred* ヘルパーを使用すると、 CloudFormation テンプレートを更新せずに、SSM パラメータストアに保存されている値を使用できます。詳細については、「 *CloudFormation ユーザーガイド*[」の CloudFormation 「 テンプレートとは](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html#gettingstarted.templatebasics.what)」を参照してください。

**重要**  
 *alfred* ヘルパーには 2 つの制限があります。パラメータは、AWS Control Tower 管理アカウントのホームリージョンでのみ使用できます。ベストプラクティスとして、スタックインスタンスごとに変わらない値を使用することを検討してください。「alfred」ヘルパーがパラメーターを取得すると、変数をエクスポートするスタックセットからランダムなスタックインスタンスを選択します。

## 例
<a name="w2aac28c41c15c13b7"></a>

 CloudFormation スタックセットが 2 つあるとします。*スタックセット 1* には 1 つのスタックインスタンスがあり、1 つのリージョンの 1 つのアカウントにデプロイされます。アベイラビリティーゾーンに Amazon VPC とサブネットが作成されます。`VPC ID` と `subnet ID` をパラメータ値として*スタックセット 2* に渡す必要があります。`VPC ID` と `subnet ID` を*スタックセット 2* に渡す前に、`AWS:::SSM::Parameter` を使用して `VPC ID` と `subnet ID` を*スタックセット 1* に保存する必要があります。詳細については、CloudFormation  ユーザーガイドの [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html)を参照してください。

**CloudFormation スタックセット 1:**

 次のスニペットでは、*alfred* ヘルパーは、パラメータストアから `VPC ID` と `subnet ID` の値を取得し、それらの値を StackSet ステートマシンに入力として渡すことができます。

```
VpcIdParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: '/stack_1/vpc/id'
      Description: Contains the VPC id
      Type: String
      Value: !Ref MyVpc

SubnetIdParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: '/stack_1/subnet/id'
      Description: Contains the subnet id
      Type: String
      Value: !Ref MySubnet
```

**CloudFormation スタックセット 2:**

 スニペットには、 CloudFormation スタック 2 `manifest.yaml` ファイルで指定されたパラメータが表示されます。

```
parameters:
      - parameter_key: VpcId
        parameter_value: $[alfred_ssm_/stack_1/vpc/id]
      - parameter_key: SubnetId
        parameter_value: $[alfred_ssm_/stack_1/subnet/id]
```

**CloudFormation スタックセット 2.1:**

 このスニペットは、ユーザーが *CommaDelimitedList* 型のパラメータをサポートする `alfred_ssm` プロパティを一覧表示できることを示しています。詳細については、CloudFormation  ユーザーガイドの [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties-type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties-type)を参照してください。

```
parameters:
      - parameter_key: VpcId # Type: String
        parameter_value: $[alfred_ssm_/stack_1/vpc/id']
      - parameter_key: SubnetId # Type: String
        parameter_value: $[ alfred_ssm_/stack_1/subnet/id']
      - parameter_key: AvailablityZones # Type: CommaDelimitedList
        parameter_value:   - "$[alfred_ssm_/availability_zone_1]"  - "$[alfred_ssm_/availability_zone_2]"
```

**カスタマイズパッケージの JSON スキーマ**  
CfCT のカスタマイズパッケージの JSON スキーマは、[GitHub のソースコードリポジトリ](https://github.com/aws-solutions/aws-control-tower-customizations)にあります。このスキーマはほとんどの開発ツールで使用でき、独自の CfCT `manifest.yaml` ファイルを構築する際のエラーを減らすのに役立ちます。

# CfCT マニフェストのバージョンアップグレード
<a name="cfct-compatibility"></a>

*AWS Control Tower のカスタマイズ* (CfCT) の最新バージョンについては、GitHub リポジトリの [`CHANGELOG.md` ファイル](https://github.com/aws-solutions/aws-control-tower-customizations/blob/master/CHANGELOG.md)を参照してください。

**警告**  
*AWS Control Tower のカスタマイズ* (CfCT) のバージョン 2.2.0 では、関連する AWS サービス API に合わせて CfCT マニフェストスキーマ (バージョン *2021-03-15*) が導入されました。 APIs マニフェストスキーマを使用すると、単一の manifest.yaml ファイルで、分離された DevOps ワークフローを通じてサポートされているリソース (CloudFormation テンプレート、SCPs、RCPs) を管理できます。  
CfCT マニフェストスキーマのバージョン *2020-01-01* を、バージョン *2021-03-15* 以降に更新することを強くお勧めします。  
CfCT は、引き続き `manifest.yaml` ファイルのバージョン *2021-03-15* および *2020-01-01* をサポートします。既存の設定を変更する必要はありません。ただし、バージョン *2020-01-01* は**サポート終了**になります。バージョン *2020-01-01* に更新プログラムを提供したり、拡張機能を追加したりすることはありません。ルート OU およびネストされた OU 機能は、バージョン *2020-01-01* ではサポートされていません。

**CfCT マニフェストバージョン *2021-03-15* で廃止されたプロパティ:**

```
organization_policies
policy_file
apply_to_accounts_in_ou

cloudformation_resources
template_file
deploy_to_account
deploy_to_ou
ssm_parameters
```

## 必須の CfCT アップグレードステップ
<a name="mandatory-upgrade-steps"></a>

CfCT マニフェストのスキーマバージョンを *2021-03-15* にアップグレードするときに、ファイルを更新するために必要な変更は次のとおりです。次のセクションでは、移行時の必須の推奨および推奨される変更について概説します。

**組織ポリシー**

1. SCP または RCP を新しいプロパティ **resources** の下にある **organization\$1policies** に移動します。

1. **policy\$1file** プロパティを新しいプロパティ **resource\$1file** に変更します。

1. **apply\$1to\$1accounts\$1in\$1ou** を新しいプロパティ **deployment\$1targets** に変更します。OU リストは、サブプロパティ **[organizational\$1units]** で定義する必要があります。**accounts** サブプロパティは、組織ポリシーではサポートされていません。

1. 新しいプロパティ **deploy\$1method** を、値 **scp** または **rcp** を指定して追加します。

**CloudFormation リソース**

1. CloudFormation リソースを新しいプロパティ **resources** の下にある **cloudformation\$1resources** に移動します。

1. **template\$1file** プロパティを新しいプロパティ **resource\$1file** に変更します。

1. **deploy\$1to\$1ou** を新しいプロパティ **deployment\$1targets** に変更します。OU リストは、サブプロパティ **[organizational\$1units]** で定義する必要があります。

1. **deploy\$1to\$1accounts** を新しいプロパティ **deployment\$1targets** に変更します。アカウントリストは、サブプロパティ **accounts** で定義する必要があります。

1. **ssm\$1parameters** プロパティを新しいプロパティ **export\$1outputs** に変更します。

## 強く推奨される CfCT アップグレードステップ
<a name="highly-recommended-upgrade-steps"></a>

**CloudFormation パラメータ**

1. **parameter\$1file** プロパティを新しいプロパティ **parameters** に変更します。

1. **parameter\$1file** プロパティの値にあるファイルパスを削除します。

1. 既存のパラメータ JSON ファイルのパラメータキーとパラメータ値を、**parameters** プロパティの新しいフォーマットにコピーします。この操作により、マニフェストファイルでこれらの値を管理することができます。

**注記**  
**parameter\$1file** プロパティは CfCT マニフェストバージョン *2021-03-15* でサポートされています。