首页 > 解决方案 > 如何在 CloudFormation 脚本中将 AmazonEC2RoleforSSM 附加到 ec2 实例

问题描述

我正在尝试调出多个 ec2 实例 cloudformation 脚本。我正在使用 shell 脚本循环aws cloudformation create-stack命令并成功启动多个实例。

现在我需要在附加了 SSM 角色的情况下启动这些实例。但是,我看不到在脚本中使用现有角色的任何方式。我需要在脚本中重新创建角色,因此:

AWSTemplateFormatVersion: 2010-09-09
Description: Compact template for creating an ec2 instance for SPT

Resources:
  IAMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: SPTvacmRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      Path: "/"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM

  InstanceProfile1:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
        - Ref: IAMRole

  ec2instance1:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId: subnet-0da86f65478f3d30a
      KeyName: spt-lab
      ImageId: ami-00344ae218e7aae62
      InstanceType: t2.nano
      IamInstanceProfile: !Ref InstanceProfile1
      SecurityGroupIds:
        - sg-0d3fae6860ce71c91

这只能执行一次,因为当循环第二次执行命令时,角色 SPTvacmRole 已经存在并且堆栈失败。

我已经从控制台手动创建了一个角色,使用 AmazonEC2RoleForSSM 策略并将其命名为 EC2RoleForSSM,但是当我尝试 -Ref: EC2RoleForSSM在 InstanceProfile1 中通过其名称引用该角色而不创建 IAMRole 时,它​​给出了一个错误,提示模板格式错误:未解决的资源依赖项模板资源块中的 [EC2RoleForSSM]

如何在脚本中使用预先存在的角色 EC2RoleForSSM 而无需再次创建它?

标签: amazon-web-servicesamazon-ec2amazon-cloudformationamazon-iam

解决方案


您不应包含Ref函数,因为它用于从参数或资源中检索值。

相反,只需使用下面的字符串EC2RoleForSSM

  InstanceProfile1:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
        - EC2RoleForSSM

推荐阅读