24

AWS が最近発表した「EC2 の IAM ロール」機能を使用しようとしています。これにより、セキュリティ資格情報が EC2 インスタンスに自動的に配信されます。( http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announce-IAM-Roles-for-EC2-instances/を参照)。

説明されているように、IAM ロールを持つインスタンスをセットアップしました。curl を使用して (一見) 適切なアクセス キー/資格情報を取得することもできます。

ただし、役割に対してすべての S3 権限を有効にしても、boto は「get_all_buckets」のような単純な呼び出しを実行できません。

表示されるエラーは、「指定された AWS アクセス キー ID は当社の記録に存在しません」です。

ただし、エラーにリストされているアクセス キーは、curl から取得したものと一致します。

すべての S3 権限を付与する IAM ロールがアタッチされた EC2 インスタンスで実行される失敗したスクリプトを次に示します。

import urllib2
import ast
from boto.s3.connection import S3Connection

resp=urllib2.urlopen('http://169.254.169.254/latest/meta-data/iam/security-credentials/DatabaseApp').read()
resp=ast.literal_eval(resp)
print "access:" + resp['AccessKeyId']
print "secret:" + resp['SecretAccessKey']
conn = S3Connection(resp['AccessKeyId'], resp['SecretAccessKey'])
rs= conn.get_all_buckets()
4

2 に答える 2

61

boto 2.5.1 以降を使用している場合は、実際にはこれよりもはるかに簡単です。環境変数または boto 構成ファイルで他の資格情報が見つからない限り、Boto はインスタンス メタデータで資格情報を自動的に検索し、それらを使用します。したがって、EC2 インスタンスでこれを簡単に実行できるはずです。

>>> import boto
>>> c = boto.connect_s3()
>>> rs = c.get_all_buckets()

手動のアプローチが失敗する理由は、IAM ロールに関連付けられた資格情報が一時的なセッション資格情報であり、access_key、 a 、secret_keyおよび aで構成されており、これら 3 つの値すべてをコンストラクターsecurity_tokenに提供する必要があるためです。S3Connection

于 2012-06-21T02:17:28.563 に答える
5

I don't know if this answer will help anyone but I was getting the same error, I had to solve my problem a little differently. First, my amazon instance did not have any IAM roles. I thought I could just use the access key and the secret key but I kept getting this error with only those two keys. I read I needed a security token as well, but I didn't have one because I didn't have any IAM roles. This is what I did to correct the issue:

  1. Create an IAM role with AmazonS3FullAccess permissions.
  2. Start a new instance and attach my newly created role.
  3. Even after doing this it still didn't work. I had to also connect to the proper region with the code below:

    import boto.s3.connection
    conn = boto.s3.connect_to_region('your-region')
    conn.get_all_buckets()

于 2015-06-27T22:28:39.123 に答える