【问题标题】:How to use IAM role to access resources using temporary credentials?如何使用 IAM 角色使用临时凭证访问资源?
【发布时间】:2012-08-20 00:06:00
【问题描述】:

我正在使用 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=="

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

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    这很容易使用用户数据脚本。例如,这个 sn-p 将获取您的临时凭证并从 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 取得了联系。

    【讨论】:

    • 不错。要摆脱硬编码的角色,你可以这样做: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})
    • 另外,最新的 AWS ruby​​ sdk 不需要传入密钥、秘密和令牌。如果正在使用实例角色,它将在幕后使用它们。因此,在最新的 SDK 中不再需要上面的 AWS.config 行和凭证抓取。
    • 哦,太壮观了。我肯定会相应地更新我的脚本。所以我可以完全跳过凭证规范吗?
    【解决方案2】:

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

    -I, --access-key-id 值

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

    -S, --secret-key 值

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

    【讨论】:

    • 我认为它还不支持,因为服务 IAM Roles 仍然是新的(大约一个月前)。我查看了文档,论坛,google了很多,但目前似乎没有支持。无论如何,谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2019-05-11
    • 2020-05-30
    • 2018-07-15
    • 2016-08-17
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多