4

我正在使用 AWS IAM 角色,该角色允许实例使用临时 API 凭证(访问密钥、秘密密钥和安全令牌)访问某些资源。

当我使用这个 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-describe-stacks 我得到一个错误:

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=="

那么我在这里缺少什么?谢谢!

4

2 回答 2

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 模板并适当记录。它会像一个魅力一样工作。您可以使用具有 LaunchConfigs 和EC2 资源的实例配置文件没有问题。我对此有100%的信心。当他们的文档人员将这些引用添加到文档中时,它与 AWS 取得了联系。

于 2012-08-27T17:25:39.953 回答
1

我认为 CLI 工具不支持临时凭据。如果他们这样做了,您应该能够将您的“AWSToken”作为命令行参数传递。但根据文档,它只支持将访问密钥 id 和密钥作为参数传入。

-I, --access-key-id

指定 VALUE 作为要使用的 AWS 访问 ID。

-S, --secret-key

指定 VALUE 作为要使用的 AWS 密钥。

于 2012-08-24T16:25:23.273 回答