次のコードを実行すると、常にこのエラーが発生します。
s3 = boto3.resource('s3')
bucket_name = "python-sdk-sample-%s" % uuid.uuid4()
print("Creating new bucket with name:", bucket_name)
s3.create_bucket(Bucket=bucket_name)
資格情報ファイルを保存しました
C:\Users\myname\.aws\credentials
、ここからBotoは私の資格情報を読み取る必要があります。
私の設定は間違っていますか?
以下はboto3.set_stream_logger('botocore', level='DEBUG')
の出力です。
2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Skipping environment variable credential check because profile name was explicitly set.
2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Looking for credentials via: env
2015-10-24 14:22:28,773 botocore.credentials [DEBUG] Looking for credentials via: shared-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: config-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: ec2-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: boto-config
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: iam-role
キーを手動で指定してみてください
s3 = boto3.resource('s3',
aws_access_key_id=ACCESS_ID,
aws_secret_access_key= ACCESS_KEY)
セキュリティ上の問題のため、ACCESS_IDとACCESS_KEYをコードに直接含めないでください。 @Tiger_Mikeによって提案されているように、環境設定を使用してそれらをコードに挿入することを検討してください。
Prod環境では、回転アクセスキーの使用を検討してください。 https://docs.aws.Amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey
同じ問題があり、~/.aws/credentials
ファイルの形式が間違っていることがわかりました。
以下を含むファイルで動作しました:
[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY
プロファイル名は「[default]
」でなければならないことに注意してください。一部の公式ドキュメントでは、「[credentials]
」という名前のプロファイルを参照していますが、これは私にとっては機能しませんでした。
Unixの〜/ .aws/credentialsファイルが次のようになっていることを確認してください。
[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
Pythonスクリプトは次のようになり、機能します。
from __future__ import print_function
import boto3
import os
os.environ['AWS_PROFILE'] = "MyProfile1"
os.environ['AWS_DEFAULT_REGION'] = "us-east-1"
ec2 = boto3.client('ec2')
# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
print('Regions:', response['Regions'])
ソース: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration 。
これらの手順は、AWS用の単一のユーザープロファイルを持つWindowsマシン用です。 ~/.aws/credentials
ファイルが次のようになっていることを確認してください
[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
AWS_DEFAULT_PROFILE
environment変数を、資格情報にあるprofile_name
に設定する必要がありました。
その後、pythonが接続できました。例: here
import boto3
# Let's use Amazon S3
s3 = boto3.resource('s3')
# Print out bucket names
for bucket in s3.buckets.all():
print(bucket.name)
私は大企業で働いており、この同じエラーに遭遇しましたが、別の回避策が必要でした。私の問題はプロキシ設定に関連していました。プロキシをセットアップしたため、すべてを機能させる前にno_proxyをAWSをホワイトリストに登録する必要がありました。 OS設定でPythonコードを濁らせたくない場合は、bashスクリプトでも設定できます。
Python:
import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"
バッシュ:
no_proxy = "s3.amazonaws.com"
Awsを正しく設定していることが確実な場合は、プロジェクトのユーザーが./ awsから読み取れることを確認するか、プロジェクトをルートとして実行するだけです。
Boto3は、次のようなフォルダーで資格情報を探しています
C:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\botocore\.aws
このフォルダーcredentials
およびconfig
に2つのファイルを保存する必要があります。
Boto3が this link で資格情報を検索する一般的な順序を確認できます。 Configure Credentialsサブ見出しの下を見てください。
複数のAWSプロファイルが~/.aws/credentials
にある場合...
[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
2つのステップに従う:
ターミナルでexport AWS_DEFAULT_PROFILE=Profile 1
コマンドを使用して、デフォルトとして使用するものを作成します。
Boto3を使用する端末と同じ端末で上記のコマンドを必ず実行するか、エディターを開きます。[次のシナリオを理解する]
シナリオ:
t1
およびt2
という2つのターミナルを開いている場合。t1
でエクスポートコマンドを実行し、JupyterLabまたはその他をt2
から開くと、NoCredentialsError:資格情報を見つけることができませんエラーが発生します。解決策:
t1
でエクスポートコマンドを実行してから、同じ端末t1
からJupyterLabまたはその他を開きます。私も同じ問題を抱えていました。ホームディレクトリに設定ファイルと資格情報ファイルを作成することで解決できます。以下に、この問題を解決するために行った手順を示します。
構成ファイルを作成します。
touch ~/.aws/config
そしてそのファイルに私は地域に入った
[default]
region = us-west-2
次に、資格情報ファイルを作成します。
touch ~/.aws/credentials
次に、資格情報を入力します
[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
これらすべてを設定したら、pythonファイルでバケットを接続します。このファイルを実行すると、すべての内容がリストされます。
import boto3
import os
os.environ['AWS_PROFILE'] = "Profile1"
os.environ['AWS_DEFAULT_REGION'] = "us-west-2"
s3 = boto3.client('s3', region_name='us-west-2')
print("[INFO:] Connecting to cloud")
# Retrieves all regions/endpoints that work with S3
response = s3.list_buckets()
print('Regions:', response)
以下のリンクも参照できます。