2017-09-23 88 views
0

我有一个CloudFormation脚本,它使用AWS::CloudFormation::Init部分从S3拒绝访问(403)失败的S3桶中下载文件。即使“aws s3 cp”能够正常工作,cfn-init仍然无法下载S3文件

我已经使用AWS::IAM::InstanceProfile向机器添加了名为s3access的IAM角色。与aws s3作品下载文件:

[[email protected] ~]$ aws s3 cp s3://my-bucket/test-file 
.download: s3://my-bucket/test-file to ./test-file   

cfn-init失败:

[[email protected] ~]$ 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作用,但仍失败:

[[email protected] ~]$ 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

如果您向我们展示您的模板会更容易 – Raniz

+1

我发现使用cfn-init几乎没有什么优势。您可以轻松地将您的aws s3复制逻辑放入CloudFormation的userData中,并为您的EC2实例提供与s3读取权限关联的角色/策略权限,这样可以很好地工作。 –

回答

0

有一些方法可以为云信息实例提供IAM角色。

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