web-dev-qa-db-ja.com

Boto3エラー:指定したAWSアクセスキーIDがレコードに存在しません

私は現在、仮想マシン内でAmazon S3にアクセスし、次のようにファイルをダウンロードしようとしています。

s3 = boto3.resource('s3',
         aws_access_key_id="xxxxxxxxxxx",
         aws_secret_access_key="xxxxxxxxxxxxxxxxx")
s3client = boto3.client('s3')

bucket = s3.Bucket('bucketone')

for obj in bucket.objects.all():
    s3client.download_file(bucket_name, obj.key, filename)

しかし、エラーが発生します。

botocore.exceptions.ClientError:ListObjectsオペレーションの呼び出し時にエラーが発生しました(InvalidAccessKeyId):指定したAWSアクセスキーIDがレコードに存在しません。

何が悪いのでしょうか? aws_access_key_idaws_secret_access_keyを複数回確認しましたが、それでも同じエラーが発生します。同じコードがローカルにありますが、仮想マシン上ではなく、実際には別のコンピューターでも動作します。必要に応じて、キーにハードコーディングしているのには理由があります。

9
Jo Ko

Boto3セッションのアクセスを設定する必要があります。あなたは本当にあなたのコードにあなたのキーを入れたくありません。最初にお勧めすることは、「aws configure」を実行し、.credentialsファイルにaws_access_key_idとaws_secret_access_keyを設定することです。次に、コードで次のようにします。

session = boto3.Session(profile_name='name_of_your_profile')

デフォルトのプロファイルのみを使用している場合は、それを行う必要がないか、十分な対策として、次のように入力します。

session = boto3.Session(profile_name='default')

それをコードに含めたら、次のようにしてs3への接続を確立できます。

s3 = session.resource('s3')
bucket = s3.Bucket('bucketone')
for obj in bucket.objects.all():
   print(obj.key)

コードにも問題があります。 s3クライアントを作成しています。 S3クライアントにはBucketメソッドまたはプロパティがありません。 s3クライアントで同じことを行うには、次のようにします。

s3client = session.client('s3')
response = s3client.get_object(Bucket='bucketone', key='your key')

次に、返された応答を反復処理して、バケット内のオブジェクトのリストを確認できます。

これでエラーが解決します。

4
Alex Nelsone

最初の答え:EC2/Lambda/etcを使用している場合。 一時的なセキュリティ認証情報 を取得します。これは、AWS_SESSION_TOKEN環境変数を使用してboto3に渡す必要があることを意味します。

省略すると、InvalidAccessKeyIdエラーがスローされます。

更新:正確に思い出せませんが、当時の問題の原因はAWS_SESSION_TOKENによるものではなかったと思います独自のboto3 libをLambdaアプリにバンドルしました(Zappaを使用)。私がboto3を「削除」した後(したがってLambdaの組み込みboto3を使用)、問題はなくなりました。

1
Hendy Irawan