可以在云信息模板中使用IAM角色临时凭证吗?

Chr*_*her 11 amazon-ec2 amazon-web-services cloud-init aws-cloudformation amazon-iam

我正在构建一个需要访问私有S3存储桶的堆栈,以下载我应用程序的最新版本.我正在使用IAM角色,这是一个相对较新的AWS功能,允许为EC2实例分配特定角色,然后将其与IAM策略结合使用.不幸的是,这些角色带有在实例化时生成的临时API凭证.它并没有瘫痪,但它迫使我做像这样的cloud-init脚本(简化为相关位):

#!/bin/sh

# Grab our credentials from the meta-data and parse the response
CREDENTIALS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access)
S3_ACCESS_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['AccessKeyId'];")
S3_SECRET_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['SecretAccessKey'];")
S3_TOKEN=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['Token'];")

# Create an executable script to pull the file
cat << EOF > /tmp/pullS3.rb
require 'rubygems'
require 'aws-sdk'
AWS.config(
    :access_key_id     => "$S3_ACCESS_KEY",
    :secret_access_key => "$S3_SECRET_KEY",
    :session_token     => "$S3_TOKEN")
s3 = AWS::S3.new()
myfile = s3.buckets['mybucket'].objects["path/to/my/file"]
File.open("/path/to/save/myfile", "w") do |f|
    f.write(myfile.read)
end
EOF

# Downloading the file
ruby /tmp/pullS3.rb
Run Code Online (Sandbox Code Playgroud)

首先:这很有效,效果很好.尽管如此,我还是喜欢使用CloudFormation现有的源访问支持.具体而言,cfn-init支持使用身份验证资源来获取受保护的数据,包括S3存储桶.无论如何从内部获取这些密钥cfn-init,或者可能将IAM角色绑定到身份验证资源?

我想一个替代方案是将我的源代码放在其他一些经过身份验证的服务上,但目前这不是一个可行的选择.

另一个有希望的领导是AWS :: IAM :: AccessKey资源,但文档并未建议它可以与角色一起使用.无论如何我还是会尝试的.

Pau*_*gan 11

我不知道加入支持的时候,但你可以同时用于认证S3下载一个IAM角色files,并sources在部分AWS :: CloudFormation ::初始化.

只需使用roleName而不是accessKeyId&secretKey(有关详细信息,请参阅AWS :: CloudFormation :: Authentication),例如:

"Metadata": {
    "AWS::CloudFormation::Init": {
        "download": {
            "files": {
                "/tmp/test.txt": {
                    "source": "http://myBucket.s3.amazonaws.com/test.txt"
                }
             }
        }
    },
    "AWS::CloudFormation::Authentication": {
        "default" : {
            "type": "s3",
            "buckets": [ "myBucket" ],
            "roleName": { "Ref": "myRole" }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

经过测试 aws-cfn-bootstrap-1.3-11