5

EC2 インスタンスをセットアップするためのブートストラップ スクリプトを作成しようとしています。インスタンスが起動時に S3 バケットからソースコードを自動的にダウンロードするようにしたいです。最近、EC2 インスタンスに IAM ロールを割り当てて、メタデータ サーバーから一時的な資格情報を取得できるようにすることについて読みました。この方法では、AWS 認証情報をイメージに保存したり、起動時に渡したりする必要がありません。

boto を使用して S3 に接続してダウンロードを実行する Python スクリプトを作成しました。そのスクリプトを init.d 構成に接続しました。私のスクリプトは、リモート SSH セッションで手動で実行すると正常に動作しますが、ブート中に実行すると何らかの理由で失敗します。

私のコードでは、次の方法で boto を使用しています。

import boto
try:
    conn = boto.connect_s3()
except:
    # log error
    exit(-1)

理論的には、boto 2.6 では、そのコードは AWS メタデータ サーバーに接続して、現在の EC2 インスタンスの IAM ロールに基づいて一時的なセキュリティ認証情報を取得する必要があります。

何らかの理由で、起動中にboto.connect_s3()が boto.exception.NoAuthHandlerFound を発生 させます。

get_auth_handler 関数 (この例外が発生する唯一の場所) で、エラーをboto.auth モジュールまで追跡しました。HmacAuthV1Handler オブジェクトが作成されるときに、アクセス キー ID または秘密キーが None の場合、HmacKeys 基本クラス コンストラクターは失敗します。実際、私のスクリプトで少し実験した後、name='aws' で資格情報を指定せずにboto.provider.Provider クラスのインスタンスを明示的に作成すると、Provider インスタンスの access_key/secret_key フィールドは両方とも None のままであることがわかりました (ただし、起動時のみ; 後でスクリプトを手動で実行すると、資格情報が初期化されます)。それでも、メタデータ サーバーが原因ではないことはわかっています (GET は、起動中であっても、期待される資格情報を実際に返します)。

だから...何が間違っている可能性がありますか? それはbotoの問題でしょうか?設定の問題?それとも、私は何か間違ったことをしていますか?一体、起動中のUbuntuがそのような操作に対して「適切な状態」にない可能性がありますか?

- - 編集 - -

以下の garnaat の回答のおかげで、ブート中とリモート SSH セッション中の python パス (sys.path) が完全に異なることが問題であることがわかりました。

起動中:

['/home/bitnami', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages']

SSH セッションから実行する場合:

['/home/bitnami', 
'/opt/bitnami/python/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/MySQL_python-1.2.3c1-py2.7-linux-i686.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/html5lib-0.90-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/boto-2.6.0-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/pip-1.2.1-py2.7.egg', 
'/opt/bitnami/apps/django/lib/python2.7/site-packages', 
'/home/bitnami/deploy', 
'/opt/bitnami/python/lib/python27.zip', 
'/opt/bitnami/python/lib/python2.7', 
'/opt/bitnami/python/lib/python2.7/plat-linux2', 
'/opt/bitnami/python/lib/python2.7/lib-tk', 
'/opt/bitnami/python/lib/python2.7/lib-old', 
'/opt/bitnami/python/lib/python2.7/lib-dynload', 
'/opt/bitnami/python/lib/python2.7/site-packages', 
'/opt/bitnami/python/lib/python2.7/site-packages/PIL']

(ベース イメージとして 32 ビットの BitNami DjangoStack 1.4.2-1 イメージを使用しました。)

4

1 に答える 1

9

あなたはUbuntuで実行していると述べています。多くの Ubuntu ディストリビューションには古いバージョンの boto がプリインストールされていることを知っています。起動プロセス中に、IAM ロールから資格情報を取得する方法を理解していない古いバージョンの boto を見つけて使用している可能性があると思います。

これをテストするには、スクリプトで boto.Version をログに記録して、2.6.0 かどうかを確認してください。

于 2012-11-21T04:29:16.613 に答える