如何在 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 调用:RunInstancesCreateTagsRunInstances 创建实例, 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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?