我想通过 AWS CloudFormation 创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例。我的 RunInstances 的 AWS Identity and Access Management (IAM) 策略具有基于标签的限制。
解决方法
AWS::EC2::Instance 资源的 Tags 属性不会扩展到通过 CloudFormation 创建的卷中。如果与用户或角色关联的 IAM 策略具有针对卷标签的限制,则您会收到以下错误: “You are not authorized to perform this operation”(您无权执行此操作)。
要将标签通过 CloudFormation 传递给 ec2:CreateVolume,您必须在 CloudFormation 模板的 AWS::EC2::LaunchTemplate 资源中定义标签。
要设置此配置,请完成以下步骤:
-
在堆栈中定义启动模板资源,将 IAM 策略和 ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-tags)ResourceType](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-resourcetype) 所需的[标签[设置为 volume。
以下是您可以使用的代码示例:
RequiredTagsLaunchTemplate:
Type: 'AWS::EC2::LaunchTemplate'
Properties:
LaunchTemplateData:
TagSpecifications:
- ResourceType: volume
Tags:
- Key: Env
Value: Dev
-
将您的启动模板附加到 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: volume
Tags:
- Key: Env
Value: Dev
-
验证启动模板是否具有所需的全部标签,然后创建或更新您的堆栈。
**重要事项:**创建堆栈的角色或用户必须具有创建和使用启动模板的权限,不受标签限制。您可以使用 aws:CalledVia 条件键创建一个新语句,使 CloudFormation API 调用不受标记要求的约束。