$ AWS_ACCESS_KEY_IDおよび$ AWS_SECRET_ACCESS_KEY環境変数を適切に設定し、次のコードを実行します。
import boto
conn = boto.connect_s3()
このエラーが発生します:
boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
何が起こっていますか?どこからデバッグを開始すればよいかわかりません。
Botoは私の環境変数から値を取得していないようです。接続コンストラクターの引数としてキーIDと秘密キーを渡すと、これは正常に機能します。
Boto will環境変数から資格情報を取得します。これをV2.0b3でテストしましたが、正常に動作します。コンストラクターで明示的に指定された資格情報を優先しますが、環境変数からも資格情報を取得します。
これを行う最も簡単な方法は、資格情報をテキストファイルに入れ、環境内でそのファイルの場所を指定することです。
たとえば(Windowsの場合:Linuxでも同じように動作することを期待していますが、個人的には試していません)
「mycred.txt」というファイルを作成し、C:\ tempに配置します。このファイルには2行が含まれています。
AWSAccessKeyId=<your access id>
AWSSecretKey=<your secret key>
環境変数AWS_CREDENTIAL_FILEを定義して、C:\ temp\mycred.txtを指すようにします
C:\>SET AWS_CREDENTIAL_FILE=C:\temp\mycred.txt
上記のコードの断片:
import boto
conn = boto.connect_s3()
正常に動作します。
私はpythonとbotoの両方の初心者ですが、エラー(または少なくともエラーの最後の行)を再現できました。)
ほとんどの場合、bashで変数をエクスポートできません。次に定義するだけであれば、それらは現在のシェルでのみ有効であり、エクスポートしてpythonは値を継承します。したがって、
$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
以下も追加しない限り機能しません:
$ export AWS_ACCESS_KEY_ID
または、同じ行ですべてを実行できます。
$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
他の値についても同様です。これを.bashrcに入れることもできます(bashがシェルであり、エクスポートを忘れないことを前提としています)
IAMの役割に関するnealmcbの回答をフォローアップします。 IAMロールを使用してEMRクラスターをデプロイしているときに、botoをs3に接続しているときに(毎回ではなく)このエラーが発生するという同様の問題がありました。
_boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
_
メタデータサービスは、資格情報の取得中にタイムアウトする可能性があります。したがって、ドキュメントが示唆するように、構成にBotoセクションを追加し、資格情報を取得するための再試行回数を増やしました。デフォルトは1回の試行であることに注意してください。
_import boto, ConfigParser
try:
boto.config.add_section("Boto")
except ConfigParser.DuplicateSectionError:
pass
boto.config.set("Boto", "metadata_service_num_attempts", "20")
_
http://boto.readthedocs.org/en/latest/boto_config_tut.html?highlight=retries#boto
下にスクロールして:You can control the timeouts and number of retries used when retrieving information from the Metadata Service (this is used for retrieving credentials for IAM roles on EC2 instances)
LinuxとSESを使用しているときにこの問題に遭遇しましたが、同様の問題を抱えている他の人にも役立つと思います。私はawscliをインストールし、キーを実行するように設定しました:
Sudo apt-get install awscli
aws configure
これは、@ huythangが言ったように〜/ .aws/configで資格情報をセットアップするために使用されます。 ただし、botoは〜/ .aws/credentialsで資格情報を検索します コピーします
cp ~/.aws/config ~/.aws/credentials
これらの資格情報を使用してユーザーに適切なポリシーが設定されていると想定します-環境変数を設定する必要はありません。
私は答えを見つけました こちら 。
Unixの場合:最初のセットアップaws config:
#vim ~/.aws/config
[default]
region = Tokyo
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxx
環境変数を設定します
export AWS_ACCESS_KEY_ID="aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="aws_secret_access_key"
最新の boto s3の紹介 を参照してください。
from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
私の場合、問題はIAMで「デフォルトでユーザーにアクセス許可がない」ことでした。現在「ルート」認証情報と呼ばれるものが唯一の方法であった元のAWS認証モデル(pre-iam)に慣れていたため、それを追跡するのに1日かかりました。
ユーザーの作成に関する多くのAWSドキュメントがありますが、ユーザーが何かを実行するためのアクセス許可を与える必要があることに気付く場所はごくわずかです。 1つは Amazon S3バケットの操作-Amazon Simple Storage Service ですが、それでも[ポリシー]タブに移動して適切な開始ポリシーを提案し、それを適用する方法を説明するだけではありません。
並べ替えウィザードは、単に「IAMユーザーの使用を開始する」ことを奨励しているだけで、まだまだやるべきことがあることを明確にしていません。少し突っ込んでも、例えば "管理ポリシーこのユーザーに添付された管理ポリシーはありません。"これは、何かをするためにポリシーが必要であることを示唆していません。
ルートのようなユーザーを確立するには、以下を参照してください。 コンソールを使用した管理者グループの作成-AWS Identity and Access Management
すべてのS3(自分のバケットと他のバケットが所有するパブリックバケット)への読み取り専用アクセスを単に許可する特定のポリシーは表示されません。
これらを接続関数呼び出しで引数として設定できるようになりました。
s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
私がやったように他の誰かが検索した場合に備えて、それを追加すると思いました。
以前に使用したs3-parallel-put
は成功しましたが、どういうわけか動作が停止し、上記のエラーが発生しました。これは、AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYをエクスポートしたにもかかわらずです。
解決策は、boto configファイルで 資格情報を指定 にすることでした。
$ nano ~/.boto
次のように資格情報を入力します。
[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
Ec2のflaskアプリケーションでこの問題が発生していました。アプリケーションに資格情報を配置したくありませんでしたが、IAMロールを介してアクセス許可を管理しました。 。その後、AWSコンソールでポリシーを設定しました(コーディングしませんでした。ポリシージェネレーターを使用しました)。
私のコードは、OPのコードとまったく同じです。ここでの他の解決策は良いですが、権限を大幅に許可する方法がありますwithoutアクセスキーをハードコーディングする。
boto.connect_s3()
のみを使用して接続する#キーは不要Macでは、キーをエクスポートするには次のようにする必要があります:key=value
。たとえば、エクスポートAWS_ACCESS_KEY_ID
環境変数は次のようになります:AWS_ACCESS_KEY_ID=yourkey
。上記の回答で述べたように、値を引用している場合、botoは上記のエラーをスローします。