我正在尝试调用多个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,但是,当我尝试在InstanceProfile1中以其名称-Ref: EC2RoleForSSM
引用该角色而不创建IAMRole时,它会出现一个错误,称为模板格式错误:模板的Resources块中的Unsolved resource dependencies[EC2RoleForSSM]
如何在脚本中使用预先存在的角色EC2RoleForSSM,而不必再次创建它?
您不应该包含Ref
函数,因为它用于从参数或资源中检索值。
相反,只需使用字符串EC2RoleForSSM
,如下所示。
InstanceProfile1:
Type: AWS::IAM::InstanceProfile
Properties:
Path: "/"
Roles:
- EC2RoleForSSM
然而,我看不到在脚本中使用现有角色的任何方法。我需要在脚本中重新创建角色
如何在脚本中使用预先存在的角色EC2RoleForSSM,而不必再次创建它?
如果角色存在,则不能在CloudFormation中创建相同的角色。相反,您应该导入它:
- 将现有资源纳入CloudFormation管理
AWS::IAM::Role
是可以导入CloudFormation的资源之一。
如果你只是想在模板中引用它,@ChrisWilliams已经解释了如何做到这一点。