使用 IaC 生成器根据扫描的资源创建 CloudFormation 模板 - AWS CloudFormation

使用 IaC 生成器根据扫描的资源创建 CloudFormation 模板

本主题介绍了如何使用 IaC 生成器功能,根据扫描的资源创建模板。

根据扫描的资源创建模板(控制台)

根据扫描的资源创建堆栈模板
  1. 打开 CloudFormation 控制台的 IaC 生成器页面

  2. 在屏幕顶部的导航栏上,选择包含已扫描资源的 AWS 区域。

  3. 模板部分中,选择创建模板

  4. 选择从新模板开始

    1. 对于模板名称,请提供模板的名称。

    2. (可选)配置您的删除策略更新替换策略

    3. 选择下一步将扫描的资源添加到模板中。

  5. 对于添加扫描的资源,浏览扫描的资源列表,然后选择要添加到模板中的资源。您可以按资源标识符、资源类型或标签筛选资源。筛选器是互相包容的。

  6. 将所有需要的资源添加到模板后,选择下一步以退出添加扫描的资源页面,然后进入添加相关资源页面。

  7. 查看推荐的相关资源列表。诸如 Amazon EC2 实例和安全组之类的相关资源是相互依赖的,通常属于同一个工作负载。选择要包含在生成的模板中的相关资源。

    注意

    建议您将所有相关资源添加到此模板中。

  8. 查看模板详细信息、扫描的资源和相关资源。

  9. 选择创建模板退出查看并创建页面并创建模板。

根据扫描的资源创建模板(AWS CLI)

根据扫描的资源创建堆栈模板
  1. 使用 list-resource-scan-resources 命令来列出在扫描期间找到的资源,还可选择指定 --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

  2. 使用 cat 命令将资源类型和标识符存储到您主目录中名为 resources.json 的 JSON 文件中。以下是基于上一步中示例输出的示例 JSON。

    $ cat > resources.json [ { "ResourceType": "AWS::EKS::Cluster", "ResourceIdentifier": { "ClusterName": "MyAppClusterName" } }, { "ResourceType": "AWS::AutoScaling::AutoScalingGroup", "ResourceIdentifier": { "AutoScalingGroupName": "MyAppASGName" } } ]
  3. 使用 list-resource-scan-related-resources 命令以及您创建的 resources.json 文件来列出与您扫描的资源相关的资源。

    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

    注意

    资源输入列表的长度不能超过 100。如果要列出的资源数超过了 100 个,请按照一个批次 100 个资源的方式,来运行 list-resource-scan-related-resources 命令并合并结果。

    请注意,输出列表中可能包含重复的资源。

  4. 使用 create-generated-template 命令来创建新的堆栈模板,并进行下列修改:

    • 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" }