web-dev-qa-db-ja.com

IAMロールのboto問題

AWSの最近発表された「EC2のIAMロール」機能を使用しようとしています。これにより、セキュリティ認証情報がEC2インスタンスに自動的に配信されます。 ( http://aws.Amazon.com/about-aws/whats-new/2012/06/11/Announcing-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()
23
Nils

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

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

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

61
garnaat

この答えが誰かを助けるかどうかはわかりませんが、同じエラーが発生していました。問題を少し異なる方法で解決する必要がありました。まず、私のAmazonインスタンスにはIAMロールがありませんでした。アクセスキーとシークレットキーを使用できると思っていましたが、この2つのキーだけでこのエラーが発生し続けました。セキュリティトークンも必要だと読みましたが、IAMの役割がなかったため、セキュリティトークンがありませんでした。これは私が問題を修正するためにしたことです:

  1. AmazonS3FullAccess権限を持つIAMロールを作成します。
  2. 新しいインスタンスを起動して、新しく作成したロールをアタッチします。
  3. これを行った後でも、それはまだ機能しませんでした。以下のコードで適切なリージョンにも接続する必要がありました。

    インポートboto.s3.connection
    conn = boto.s3.connect_to_region( 'your-region')
    conn.get_all_buckets()

5
Gabriel