Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AWS SDKがPythonのJupyter上でインストールできない

解決したいこと

「使ってわかったAWSのAI」という書籍を進めているのですがAWS SDKがインストールできません。
環境はpythonのJupyterです。
やりたいことはAWSのAIの学習をする前段階としてSDKをダウンロードしたいです。
IAMにて事前に対象のアクセス権を付与したアカウントを作成してIDとKEYをローカルの「Users/<ユーザー名>」に以下のフォーマットで「credentials」という名前で保存しろと指定されたので保存しました。
使用しているクライアントはmacbook pro 2020 M1です。
エラーを見ると「signature」が違うと言っているようなのでこの「credentials」のファイルが間違っているのかな?とも思いましたが、I DとKEYはコピペしているので間違っていないはずです。

そもそもこの「credentials」ファイルがどのように認証に使われているのかの説明がなかったのでそれがわかれば解決の手掛かりになるかもしれないのでそれだけでも教えていただけると助かります。
さらにAWSで対象ポリシーをアタッチしたユーザーの指定などもしていないようですが、どのように対象ユーザーを識別しているのかも教えていただけると助かります。
もし私の勘違いしており、ユーザーや「credentials」のファイルはまだここでは関係なければ教えてください。
解決策ではなく憶測などでも良いので助けていただけると助かります。

[default]
aws_access_key_id = AK**************************
aws_secret_access_key = UC0p******************************

発生している問題・エラー

---------------------------------------------------------------------------
ClientError                               Traceback (most recent call last)
<ipython-input-6-e72cca7ea9ce> in <module>
      2 
      3 client = boto3.client('s3', region_name='ap-northeast-1')
----> 4 client.list_buckets()

~/opt/anaconda3/lib/python3.8/site-packages/botocore/client.py in _api_call(self, *args, **kwargs)
    355                     "%s() only accepts keyword arguments." % py_operation_name)
    356             # The "self" in this scope is referring to the BaseClient.
--> 357             return self._make_api_call(operation_name, kwargs)
    358 
    359         _api_call.__name__ = str(py_operation_name)

~/opt/anaconda3/lib/python3.8/site-packages/botocore/client.py in _make_api_call(self, operation_name, api_params)
    674             error_code = parsed_response.get("Error", {}).get("Code")
    675             error_class = self.exceptions.from_code(error_code)
--> 676             raise error_class(parsed_response, operation_name)
    677         else:
    678             return parsed_response

ClientError: An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.

該当するソースコード

client = boto3.client('s3', region_name='ap-northeast-1')
client.list_buckets()

このコードの前には以下のコードを実行しましたが問題なく完了しました。

!pip install --upgrade boto3
0

1Answer

SignatureDoesNotMatch エラーの詳細はここにあります。 https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-v4-troubleshooting.html

原因はいくつか考えられますが、この場合は aws_access_key_id が正しく aws_secret_access_key が間違っている可能性が高いです。

boto3 はこれらの情報を ~/.aws/credentials から読み込む他、 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 環境変数も参照し、環境変数のほうが優先されます。ファイルの値か(設定してあれば)環境変数の値が間違っているかもしれません。

boto3.client() の引数で設定した値が最優先されるので、まずは以下のように実行して値のコピペミスがないか確認するといいと思います。

client = boto3.client(
    's3',
    region_name='ap-northeast-1',
    aws_access_key_id='AK(略)',
    aws_secret_access_key='UC0p(略)',
)
client.list_buckets()

ところで、エラーが出るのはともかく boto3 が使えていれば AWS SDK のインストールはできています。


IAMにて事前に対象のアクセス権を付与したアカウントを作成してIDとKEYをローカルの「Users/<ユーザー名>」に以下のフォーマットで「credentials」という名前で保存しろと指定されたので保存しました。

念のためですが、 /Users/<ユーザー名>/.aws/credentials が正しい置き場所です。

「credentials」ファイルがどのように認証に使われているのかの説明

boto3 は認証情報をいくつかの情報源から読み込みます。そのうちのひとつが ~/.aws/credentials です。情報源の一覧は https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#configuring-credentials に書いてあります。 aws コマンドや他の言語向けの AWS ライブラリもおおむね同様の情報源から読み込みます。

~/.aws/credentials の記法などはこちらが詳しいです。 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

どのように対象ユーザーを識別しているのか

アクセスキー ID とシークレットアクセスキーのペアはユーザーに紐付くので、それで識別しています。

0Like

Comments

  1. @Saki0506

    Questioner

    無事に使い始めることができました。本当に本当に何度もご回答いただいてありがとうございます( ; ; )
    ローカルにある「credentials 」から読み取るということは「credentials 」のファイルに書かれているユーザーが自動的に認識されるということでであっていますか?だとしたら認証情報の読み込み先を変更したりはできないのでしょうか?「credentials 」のユーザーの権限をIAMで用途ごとにアタッチを繰り返すと必要以上の権限を与えることになって教科書に書いてあったAWSの思想?に反するのかなとも思いました。もう解決しているので厚かましいのは分かっていますが疑問に思ったのでもし回答いただけると嬉しいです。
  2. 合っています。 credentials ファイルの default プロファイルに書かれたアクセスキーが自動的に認証に使われます。 credentials ファイルには複数のプロファイルを書くことができ、 AWS_PROFILE 環境変数にプロファイル名を与えれば切り替えられます。書き方はここを参照してください https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html

    権限については、おっしゃる通り必要な権限だけ与えるのがベターです。ローカルで AWS SDK を動かすときは用途ごとに必要な権限だけ持たせた IAM ユーザーを作ってプロファイルを使い分けるのがいいと思います。また、 EC2 インスタンス上で動かすときは credentials ファイルを作らずにおいてインスタンスにアタッチされた IAM ロールが使われるようにするといいです。
  3. 疑問に思ったことはなんでも聞いてくださって構いませんよ。ちょっとしたことならコメントで大丈夫です。まとまった分量であれば前回の質問のリンクをつけて新しい質問記事で投稿してもらえれば他の人の目にも止まりやくなります。
  4. @Saki0506

    Questioner

    本当にいつもご丁寧にありがとうございます。おかげさまでAWSのAIの勉強を始めることができました。今は、Amazon Lexでbotoの勉強をしています!エラーたくさん出て四苦八苦してますがまずはなんとか自分で頑張って解決に挑戦しているところです。また分からなかったらusaiさんや他の方々に頼ってしまうかもしれませんがその時はよろしくお願いします!

Your answer might help someone💌