我有一个CloudFormation脚本,该脚本使用AWS::CloudFormation::Init
部分从S3存储桶下载文件,该文件因访问被拒绝而失败(403)。
我已使用s3access
向计算机添加了名为AWS::IAM::InstanceProfile
的IAM角色。使用aws s3
下载文件有效:
[ec2-user@ip-172-31-26-26 ~]$ aws s3 cp s3://my-bucket/test-file
.download: s3://my-bucket/test-file to ./test-file
但是cfn-init
失败了:
[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2 Error occurred during build: Failed to retrieve https://s3.us-east-2.amazonaws.com/my-bucket/test-file: HTTP Error 403 :
我尝试明确设置IAM角色,但也失败了:
[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2 --role=s3access AccessDenied: User: arn:aws:sts::196375698259:assumed-role/s3access/i-044499612c92b50f5 is not authorized to perform: cloudformation:DescribeStackResource on resource: arn:aws:cloudformation:us-east-2:196375698259:stack/test/*
我正在考虑直接从用户数据中使用aws s3 cp s3://my-bucket/test-file ./
,但我想知道为什么AWS::CloudFormation::Init
无法承担分配给EC2实例的角色。
我发现只有一个类似的问题 - How can I access protected S3 files in a CFN script?,但解决方法是应用IAM角色,我已经完成了cfn-init
仍然失败。
答案 0 :(得分:4)
我需要将AWS::CloudFormation::Authentication
添加到Metadata
的{{1}}。详情见:
例如:
EC2Instance
角色可以访问相关的EC2Instance:
Type: 'AWS::EC2::Instance'
Metadata:
AWS::CloudFormation::Authentication:
rolebased:
type: S3
roleName: !Ref EC2InstanceIAMRole
buckets:
- !Ref TemplateBucket
...
。
角色也分配给TemplateBucket
。
有关角色的一些细节如下:
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
在添加此内容之前,我可以通过aws cli从s3下载文件,但EC2 instance
无法解决此错误:
cfn-init
答案 1 :(得分:0)
有一些方法可以为云形态实例提供您的IAM角色。