如何在 RunInstances 的 IAM 策略有基于标签的限制时通过 AWS CloudFormation 创建 Amazon EC2 实例?
上次更新时间:2020 年 10 月 15 日
我想通过 AWS CloudFormation 创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例,但是我的 RunInstances 的 AWS Identity and Access Management (IAM) 策略具有基于标签的限制。
简短描述
您可以使用启动模板通过 AWS CloudFormation 创建 EC2 实例。
当您使用资源 AWS::EC2::Instance 通过 AWS CloudFormation 创建 EC2 实例时,AWS CloudFormation 会发起两个 API 调用:RunInstances 和 CreateTags。RunInstances 创建实例, CreateTags 在创建实例后应用必要的标签。AWS CloudFormation 发出的 RunInstances 请求不支持标签,但 API 可支持标签。由于 RunInstances 请求中未包含标签,因此未满足基于 IAM 标签的限制,您将收到一条错误消息。错误消息是“You are not authorized to perform this operation”(您未被授权执行此操作)。
注意:AWS CloudFormation 不支持在单独请求中创建带标签的实例(例如,对于 RunInstances API 调用)。
要通过 AWS CloudFormation 将标签传递给 ec2:RunInstances,您必须在 AWS CloudFormation 模板中的 AWS::EC2::LaunchTemplate 资源中定义标签。避免在 AWS::EC2::Instance 资源中定义标签。
解决方法
1. 使用 IAM 策略要求的必要标签在堆栈中定义启动模板。例如:
RequiredTagsLaunchTemplate:
Type: 'AWS::EC2::LaunchTemplate'
Properties:
LaunchTemplateData:
TagSpecifications:
- ResourceType: instance
Tags:
- Key: Env
Value: Dev
2. 将启动模板附加到 EC2 实例资源。例如:
Instance:
Type: 'AWS::EC2::Instance'
Properties:
LaunchTemplate:
LaunchTemplateId: !Ref RequiredTagsLaunchTemplate
Version: 1
InstanceType: r4.xlarge
.
.
RequiredTagsLaunchTemplate:
Type: 'AWS::EC2::LaunchTemplate'
Properties:
LaunchTemplateData:
TagSpecifications:
- ResourceType: instance
Tags:
- Key: Env
Value: Dev
3. 确认启动模板具有 IAM 策略要求的所有必要标签。
如果您的 IAM 策略对卷标签有限制,请在启动模板的 Type: AWS::EC2::LaunchTemplate 部分包含该限制。然后,将 ResourceType 设置为 volume。例如:
TagSpecifications:
- ResourceType: volume
Tags:
- Key: Env
Value: Dev
重要提示:您必须确认创建堆栈的角色或用户具有创建和使用启动模板的权限,而没有标记限制。您可以使用 aws:CalledVia 条件键创建一个新语句,以使 AWS CloudFormation 发出的 API 调用免受标记要求的限制。</p