下でbotoを使用する(Apache sparkからの)CLIツールを使用しています。私はすでにそのことを確認しましたが、
AWS_ACCESS_KEY
AWS_SECRET_KEY
正しい(ec2-describe-regions
)承認はまだ失敗します:
ec2/spark-ec2 -k mykey --copy -s 5 -i ~/.ssh/mykey.pem -t c3.2xlarge
-z us-east-1a -r us-east-1 launch mycluster
スタックトレース後の最後のエラーに注意してください。
<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to
validate the provided access credentials</Message></Error></Errors>
ここに完全な出力があります:
Setting up security groups...
ERROR:boto:401 Unauthorized
ERROR:boto:<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to validate the provided access credentials</Message></Error></Errors><RequestID>f960cab0-bfe6-4939-913c-5fbc0bf8662f</RequestID></Response>
Traceback (most recent call last):
File "ec2/spark_ec2.py", line 1509, in <module>
main()
File "ec2/spark_ec2.py", line 1501, in main
real_main()
File "ec2/spark_ec2.py", line 1330, in real_main
(master_nodes, slave_nodes) = launch_cluster(conn, opts, cluster_name)
File "ec2/spark_ec2.py", line 482, in launch_cluster
master_group = get_or_make_group(conn, cluster_name + "-master", opts.vpc_id)
File "ec2/spark_ec2.py", line 343, in get_or_make_group
groups = conn.get_all_security_groups()
File "/shared/sparkup2/ec2/lib/boto-2.34.0/boto/ec2/connection.py", line 2969, in get_all_security_groups
[('item', SecurityGroup)], verb='POST')
File "/shared/sparkup2/ec2/lib/boto-2.34.0/boto/connection.py", line 1182, in get_list
raise self.ResponseError(response.status, response.reason, body)
boto.exception.EC2ResponseError: EC2ResponseError: 401 Unauthorized
<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to
validate the provided access credentials</Message></Error></Errors>
ああ男。古い認証値を保存する$ HOME/.botoファイルがあります。これにより一日のほとんどが失われました!!
cat ~/.boto
[Credentials]
aws_access_key_id=MY*OLD*ACCESS*KEY
aws_secret_access_key=MY*OLD_SECRET*ACCESS*KEY
同様の問題があり、これが他の人(ここからGoogleから来る)を助ける可能性があることを考慮して、回答として投稿することにしました。
マシンの時刻が正しく設定されていることを確認してください。
私のマシンの時間は、リアルタイムよりわずか8分早く実行されていたため、上記とまったく同じように401が発生していました。
Linuxを使用している場合は、以下を実行して同期できます。
Sudo ntpdate us.pool.ntp.org
私にとっては原因は異なりました。 AWS_ACCESS_KEY、AWS_SECRET_KEY、およびAWS_SESSION_TOKENで構成される一時的なAWS認証情報を使用しています。 boto debug boto.set_stream_logger('boto')
を有効にした後、AWS_ACCESS_KEYとAWS_SECRET_KEYのみがenvからロードされ、AWS_SESSION_TOKENはロードされないことに気付きました。コードの検査はこれを確認するようです:
https://github.com/clari/clari_dynamo/blob/master/boto/boto/provider.py#L307
私にとってうまくいったのは、ec2接続をセットアップするときに明示的にトークンを渡すことでした:
ec2.connect_to_region(region, security_token=os.environ.get('AWS_SESSION_TOKEN', None))