

# IaC ジェネレーターを使用してスキャンされたリソースから CloudFormation テンプレートを作成する
<a name="iac-generator-create-template-from-scanned-resources"></a>

このトピックでは、IaC ジェネレーター機能を使用してスキャンされたリソースからテンプレートを作成する方法について説明します。

## スキャンしたリソースからテンプレートを作成する (コンソール)
<a name="create-template-from-scanned-resources-console"></a>

**スキャンしたリソースからスタックテンプレートを作成するには**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部のナビゲーションバーで、スキャンしたリソースが含まれる AWS リージョンを選択します。

1. **[テンプレート]** セクションから **[テンプレートを作成]** を選択します。

1. **[新しいテンプレートから開始]** を選択します。

   1. **[テンプレート名]** に、テンプレートの名前を入力します。

   1. (オプション) **[削除ポリシー]** を **[置換ポリシーを更新]** に設定します。

   1. **[次へ]** をクリックし、スキャンしたリソースをテンプレートに追加します。

1. **[スキャンしたリソースを追加]** で、スキャンしたリソースのリストを参照し、テンプレートに追加するリソースを選択します。リソースは、リソース識別子、リソースタイプ、タグのいずれかでフィルターできます。フィルターは相互に包括的です。

1. 必要なリソースすべてをテンプレートに追加したときに、**[次へ]** を選択し、**[スキャンしたリソースを追加]** ページを閉じて **[関連リソースを追加]** ページに進みます。

1. 関連リソースの推奨リストを確認します。Amazon EC2 インスタンスやセキュリティグループなどの関連リソースは、相互に依存しており、通常は同じワークロードに属しています。生成されたテンプレートに含める関連リソースを選択します。
**注記**  
このテンプレートには、関連リソースをすべて追加することが推奨されます。

1. テンプレートの詳細、スキャンしたリソース、関連リソースを確認します。

1. **[テンプレートを作成]** をクリックし、**[確認して作成]** ページを閉じてテンプレートを作成します。

## スキャンしたリソースからテンプレートを作成する (AWS CLI)
<a name="create-template-from-scanned-resources-cli"></a>

**スキャンしたリソースからスタックテンプレートを作成するには**

1. スキャン中に見つかったリソースを一覧表示するには、[list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) コマンドを使用し、オプションで出力を制限する `--resource-identifier` オプションを指定します。`--resource-scan-id` オプションでは、サンプル ARN を実際の ARN に置き換えます。

   ```
   aws cloudformation list-resource-scan-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resource-identifier MyApp
   ```

   以下はレスポンスの例です。`ManagedByStack` は CloudFormation がリソースを既に管理しているかどうかを示します。出力をコピーします。これは次のステップで必要になります。

   ```
   {
       "Resources": [
           {
               "ResourceType": "AWS::EKS::Cluster",
               "ResourceIdentifier": {
                   "ClusterName": "MyAppClusterName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
               "ResourceIdentifier": {
                   "AutoScalingGroupName": "MyAppASGName"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   出力の各フィールドについては、「AWS CloudFormation API リファレンス」の「[ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)」を参照してください。

1. `cat` コマンドを使用して、リソースタイプと識別子をホームディレクトリの `resources.json` という名前の JSON ファイルに保存します。前のステップの出力例に基づいた JSON の例を次に示します。

   ```
   $ cat > resources.json
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       }
   ]
   ```

1. 作成した `resources.json` ファイルとともに [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) コマンドを使用して、スキャンしたリソースに関連するリソースを一覧表示します。

   ```
   aws cloudformation list-resource-scan-related-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resources file://resources.json
   ```

   以下はレスポンスの例です。`ManagedByStack` は CloudFormation がリソースを既に管理しているかどうかを示します。これらのリソースを、前のステップで作成した JSON ファイルに追加します。テンプレートを作成するには、これが必要です。

   ```
   {
       "RelatedResources": [
           {
               "ResourceType": "AWS::EKS::Nodegroup",
               "ResourceIdentifier": {
                   "NodegroupName": "MyAppNodegroupName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::IAM::Role",
               "ResourceIdentifier": {
                   "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   出力の各フィールドについては、「AWS CloudFormation API リファレンス」の「[ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)」を参照してください。
**注記**  
リソースの入力リストの長さは 100 を超えることはできません。100 を超えるリソースの関連リソースを一覧表示するには、100 のバッチで **list-resource-scan-related-resources** を実行した後、結果を統合します。  
一覧に、重複したリソースが出力される場合があるため注意が必要です。

1. これらの変更とともに、次のように [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) コマンドを使用して新しいスタックテンプレートを作成します。
   + `us-east-1` を、スキャンされたリソースが含まれる AWS リージョンに置き換えます。
   + `MyTemplate` を、作成するテンプレートの名前に置き換えます。

   ```
   aws cloudformation create-generated-template --region us-east-1 \
    --generated-template-name MyTemplate \
     --resources file://resources.json
   ```

   次は、`resources.json` ファイルの例です。

   ```
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "LogicalResourceId":"MyCluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "LogicalResourceId":"MyASG",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       },
       {
           "ResourceType": "AWS::EKS::Nodegroup",
           "LogicalResourceId":"MyNodegroup",
           "ResourceIdentifier": {
               "NodegroupName": "MyAppNodegroupName"
           }
       },
       {
           "ResourceType": "AWS::IAM::Role",
           "LogicalResourceId":"MyRole",
           "ResourceIdentifier": {
               "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
           }
       }
   ]
   ```

   成功すると、このコマンドは以下を返します。

   ```
   {
     "Arn":
       "arn:aws:cloudformation:region:account-id:generatedtemplate/7fc8512c-d8cb-4e02-b266-d39c48344e48",
     "Name": "MyTemplate"
   }
   ```