2012-08-24 25 views
3

我正在使用允许实例使用临时API凭证(访问密钥,密钥和安全令牌)访问特定资源的AWS IAM角色。如何使用IAM角色使用临时凭证访问资源?

当我测试使用这个Ruby脚本的临时凭证,它运行没有任何问题:

require 'rubygems' 
require 'aws-sdk' 
AWS.config(
    :access_key_id  => "MY ACCESS KEY GOES HERE", 
    :secret_access_key => "MY SECRET KEY GOES HERE", 
    :session_token  => "MY TOKEN GOES HERE") 
s3 = AWS::S3.new() 
myfile = s3.buckets['My-Config'].objects["file.sh"] 
File.open("/tmp/file.sh", "w") do |f| 
    f.write(myfile.read) 
end 

但是,使用命令行运行CFN-描述,堆,当我得到一个错误:

export AWS_CREDENTIAL_FILE=aws_credentials.cfg 
cfn-describe-stacks 
cfn-describe-stacks: Refused: The security token included in the request is invalid 

这里是我aws_credentials.cfg:

AWSAccessKeyId=MY ACCESS KEY 
AWSSecretKey=My SECRET KEY 
AWSToken="MY TOKEN==" 

那我在这里失踪?谢谢!

回答

1

我不认为CLI工具支持临时凭证。如果他们这样做了,你应该能够通过你的“AWSToken”作为命令行参数。但是根据documentation,它只支持传入访问密钥ID和密钥作为参数。

-I, --access-key-id VALUE

Specify VALUE as the AWS Access ID to use.

-S, --secret-key VALUE

Specify VALUE as the AWS Secret Key to use.

+0

我认为它还不被支持,因为服务IAM角色还是新的(大约一个月大)。 我看了文档,论坛,搜索了很多,但似乎目前没有支持。任何方式,谢谢你的答案。 – PapelPincel

3

使用用户数据脚本很容易。例如,这段代码将获取您的临时凭证并从S3下载资源。我使用它进行WAR部署。

# Install updates and dependencies 
yum -y install ruby-devel 
yum -y install rubygems 
yum install -y rubygem-nokogiri 
gem install --no-rdoc --no-ri aws-sdk 
gem install --no-rdoc --no-ri json 

# Grab credentials and parse them 
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'];") 

# Download myFile 
cat <<EOF> /etc/getFile.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["myFile"] 
File.open("myLocalFile", "w") do |f| 
    f.write(myfile.read) 
end 
EOF 

ruby /etc/getFile.rb 

把它塞进你的CloudFormation模板,并适当地记录它。它会像魅力一样工作。您可以使用instance profiles与LaunchConfigs和EC2 resources没有问题。我对此100%有信心。当他们的文档人员将这些引用添加到文档中时,它与AWS保持联系。

+1

不错。为了摆脱硬编码角色,你可以这样做:'ROLE == $(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)'然后'CREDENTIALS = $(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ {ROLE})' – GalacticJello

+0

此外,最新的AWS ruby​​ sdk不需要传入密钥,秘密密钥,和令牌。如果实例角色正在使用,它将在幕后使用它们。因此,最新的SDK中不再需要上面提到的“AWS.config”行和凭证。 – GalacticJello

+0

哦,那很壮观。我肯定会相应地更新我的脚本。那么我可以完全跳过证书规范? – Christopher