AWS認証情報が見つからない時の対処法
冒頭まとめ AWS CLIやboto3で次のエラーが出たら、その処理が参照できる場所に認証情報が見つかっていません。 Unable to locate credentials. You can configure credentials by running "aws configure". まず、エラーが出た環境でaws configure listを実行します。プロファイルを指定しているなら、確認コマンドにも同じ--profileを付けてください。手元のターミナルでは成功しても、DockerやCI、別の実行ユーザーでは設定ファイルも環境変数も異なります。 開発環境では使用するプロファイルとログイン状態、EC2ではインスタンスプロファイル、ECSではタスクロールを確認します。認証情報が見つからない段階なので、S3の権限を増やしてもこのエラーは解消しません。 Unable to locate credentialsの意味 Pythonでは次のように表示されます。 botocore.exceptions.NoCredentialsError: Unable to locate credentials botocoreの例外定義では、NoCredentialsErrorの本文をUnable to locate credentialsとしています。要求に署名する処理は、認証情報がNoneならこの例外を送出します。 これはAWSサービスが返すAccessDeniedとは異なります。署名付きの要求を送るための認証情報を、クライアント側で取得できていない状態です。boto3のクライアントを作成できても、実際にAPIを呼ぶときに初めてエラーが出ることがあります。 AWS CLIに表示されるaws configureの案内は、設定方法の一例です。組織がIAM Identity Centerを使っている場合や、EC2・ECSのロールを利用する場合まで、アクセスキーを手入力する必要があるわけではありません。 最初に取得元とプロファイルを確認する 失敗したコマンドと同じユーザー、同じコンテナ、同じCIのステップで確認します。 aws configure list access_keyとsecret_keyが<not set>なら、その実行条件では取得できていません。値が表示される場合は、TypeとLocationで取得元を確認します。環境変数から取得していればenv、共有認証情報ファイルならshared-credentials-fileなどが表示されます。取得処理自体に問題がある場合は、この確認コマンドもエラーになることがあります。 プロファイルを指定している場合は、次のように同じ指定で調べます。devは実際のプロファイル名に置き換えてください。 aws configure list --profile dev aws sts get-caller-identity --profile dev 後者が成功したら、返されたAccountとArnが想定したアカウントとロールか確認します。成功しても、S3などの個別の操作が許可されているとは限りません。 CLIでは成功し、Pythonだけ失敗する場合は、Pythonが同じプロファイルを使っているか確認します。 import boto3 session = boto3.Session(profile_name="dev") identity = session.client("sts", region_name="ap-northeast-1").get_caller_identity() print(identity["Account"], identity["Arn"]) この例はローカルのdevプロファイルを使う場合の確認です。EC2やECSのロールを使うプログラムでは、プロファイル名を固定せずboto3.Session()で既定の取得経路を使います。 ...