![](/img/trans.png)
[英]AWS Cloudformation template with EC2 instance that has IAM role to terminate that Cloudformation stack
[英]AWS Cloudformation template EC2 Role/Policy circular dependency
我正在編寫一個帶有單個 EC2 實例和一個 EBS 卷的 Cloudformation 模板。 我稍后會在使用 Powershell 腳本創建機器時附加卷。 當我在策略聲明資源中放置通配符 '*' 時它起作用,但是我想限制對一個實例和一個 ebs 卷的訪問。 使用 EBS 卷很容易,我可以在模板中引用它,它是在角色之前創建的,但對於實例,問題是實例需要首先創建角色,但也需要能夠創建我們需要創建角色的實例首先。 解決這種循環依賴的好方法是什么?
這是我的模板:
Resources:
InstanceRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: InstanceRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
Policies:
- PolicyName: AttachVolume
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 'ec2:AttachVolume'
Resource:
- !Join
- ''
- - 'arn:aws:ec2:'
- !Ref 'AWS::Region'
- ':'
- !Ref 'AWS::AccountId'
- ':instance/*'
- !Join
- ''
- - 'arn:aws:ec2:'
- !Ref 'AWS::Region'
- ':'
- !Ref 'AWS::AccountId'
- ':volume/'
- !Ref DataVolume
InstanceProfile:
Type: 'AWS::IAM::InstanceProfile'
Properties:
Roles:
- !Ref InstanceRole
InstanceProfileName: InstanceProfile
Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: !Ref AMI
InstanceType: !Ref InstanceType
IamInstanceProfile: !Ref InstanceProfile
KeyName: ec2key
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: 'true'
VolumeSize: '30'
Tags:
- Key: Name
Value: MyInstance
SubnetId: !Ref SubnetId
SecurityGroupIds:
- !Ref SGId
UserData: !Base64
'Fn::Join':
- ''
- - |
<script>
- 'cfn-init.exe -v -c config -s '
- !Ref 'AWS::StackId'
- ' -r Instance'
- ' --region '
- !Ref 'AWS::Region'
- |+
- |
</script>
DataVolume:
Type: "AWS::EC2::Volume"
Properties:
AvailabilityZone: !GetAtt
- Instance
- AvailabilityZone
Size: "100"
Tags:
- Key: Name
Value: InstanceExtraVolume
在您的特定示例中,您具有以下依賴項鏈: InstanceRole -> DataVolume -> Instance -> InstanceProfile -> InstanceRole
通常,當您的Role依賴於您的Resources而您的Resources依賴於您的Role 時,這就是AWS::IAM::Policy資源類型的用處。 這基本上將IAM 角色上的特定策略與IAM 策略本身解耦。
為此,您需要將InstanceRole拆分為一個InstanceRole和一個InstanceRolePolicy
Resources:
InstanceRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: InstanceRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
InstanceRolePolicy:
Type: 'AWS::IAM::Policy'
Properties:
Roles:
- !Ref InstanceRole
PolicyName: AttachVolume
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 'ec2:AttachVolume'
Resource:
- !Join
- ''
- - 'arn:aws:ec2:'
- !Ref 'AWS::Region'
- ':'
- !Ref 'AWS::AccountId'
- ':instance/*'
- !Join
- ''
- - 'arn:aws:ec2:'
- !Ref 'AWS::Region'
- ':'
- !Ref 'AWS::AccountId'
- ':volume/'
- !Ref DataVolume
這樣, InstanceRolePolicy取決於InstanceRole和DataVolume ,但InstanceRole不依賴任何東西,因此DataVolume -> Instance -> InstanceProfile -> InstanceRole
鏈可以解析。
循環依賴的一種常見解決方案是執行多個步驟:使用最少的資源創建堆棧,然后修改模板並更新堆棧。
因此,模板的 v1 僅創建基本依賴資源,而在 v2 中,您修改模板以添加依賴資源並同時修改原始依賴資源。 然后進行堆棧更新。
另外,請參閱更多想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.