我正在构建一个需要访问私有 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
首先也是最重要的:这很有效,而且效果很好。尽管如此,我很想使用 CloudFormation 对源访问的现有支持。具体来说,cfn-init
支持使用身份验证资源来获取受保护的数据,包括 S3 存储桶。无论如何可以从内部获取这些密钥cfn-init
,或者可能将 IAM 角色绑定到身份验证资源?
我想另一种选择是将我的来源放在其他经过身份验证的服务之后,但目前这不是一个可行的选择。
另一个有希望的线索是AWS::IAM::AccessKey 资源,但文档不建议它可以与角色一起使用。反正我要试试。