即使“aws s3 cp”有效,cfn-init也无法下载S3文件

时间:2017-09-23 14:56:24

标签: amazon-web-services amazon-cloudformation amazon-iam

我有一个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仍然失败。

2 个答案:

答案 0 :(得分:4)

我需要将AWS::CloudFormation::Authentication添加到Metadata的{​​{1}}。详情见:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html#cfn-cloudformation-authentication-rolename

例如:

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角色。

  • 您可以将 IAM 角色的标识放入cloudformation模板中,例如在您的UserData中。但是,这会对您的 IAM 造成一些保密问题。
  • 您可以将参数放在堆栈上,这样您就可以在每次创建堆栈时指定 IAM 角色。这对于测试堆栈来说并不是很愉快,需要经常创建一个新堆栈。
  • 最后一个是启动新实例并添加 IAM 角色,然后创建该实例的AMI。使用此AMI创建cloudformation堆栈实例。通过使用此选项,您可以确保您的s3命令首先在实例上运行,并且您不必处理参数和机密问题。