因此从理论上讲,如果某人需要 Amazon 服务器的有效凭证,则可以调用 169.254.169.254 获取凭证来访问某些资源,而不是在其访问密钥/密码中进行硬编码,如下所示:
js = ''
open('http://169.254.169.254/latest/meta-data/iam/security-credentials/<role>') { |f|
f.each_line {|line| js += line}
}
credentials = JSON.load(js)
ndnode[:s3_access_key_id] = credentials['AccessKeyId']
ndnode[:s3_secret_access_key] = credentials['SecretAccessKey']
然后使用这里的访问权限:
conn = AWS::EC2::Base.new(:access_key_id => ndnode[:s3_access_key_id],
:secret_access_key => ndnode[:s3_secret_access_key])
# THIS ALWAYS FAILS
result = conn.describe_instances(:instance_id => instance_id)
我不喜欢将我的访问密钥和密码硬编码到源中的想法,我想要一种解决方法。
1) 我和我的老板是否正确认为这是一种解决方法? 2) 如果 1 的答案是肯定的,那么正确的做法是什么? 如果 1 的答案是否定的,那么有没有办法避免将凭据检查到源中(无论是在这里还是在配置文件中),它是什么? 3) 回应 @Edwin 的回复,我应该将安全令牌放在 AWS gem API 的哪个位置? 据报道,Boto 允许我使用我提供的凭据进行连接,这意味着要分叉一个进程并设置一些环境变量,以便 Ruby 可以使用 Boto 连接来请求信息。
答案1
许多 AWS SDK 都内置了对 EC2 配置文件中 IAM 角色的支持。使用 .Net,您可以使用无参数构造函数来使用它们。确保您使用的是最新版本的 SDK。