Boto3 오류 : botocore.exceptions.NoCredentialsError : 자격 증명을 찾을 수 없습니다.


113

다음 코드를 실행하면 항상이 오류가 발생합니다.

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

1
boto3.set_stream_logger('botocore', level='DEBUG')코드 앞에 추가하여 디버그 출력을 게시 할 수 있습니까 ? 자격 증명을 찾는 위치가 표시됩니다.
jamesls

BOTO은 ... 어떤 이유로 내 홈 디렉토리에 보이지 않는 분명히 자격 증명 설정 파일에 대한 아주 약간의 위치를 찾지 만 보인다
D를 -_- b를

2
자격 증명 파일 HOME을 가리 키도록 환경 변수 를 C:\Users\myname설정 AWS_SHARED_CREDENTIALS_FILE하거나 자격 증명 파일을 직접 가리 키도록 설정 하십시오.
garnaat

설명대로 env 변수 HOME을 설정했지만 이제 다음 오류가 발생합니다. botocore.exceptions.NoRegionError: You must specify a region. * 내 구성 파일 ↓은 내 credentails와 같은 폴더에 있습니다. [default] ap-northeast-1
d -_- b

1
garnaat의 의견을 사용하여 문제를 해결할 수있었습니다 .
LaundroMat 2017 년

답변:


94

수동으로 키 지정 시도

    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


이 방법은 Django에서 직접 처리 할 때 유용합니다. 감사합니다.
Joepreludian

1
코드에 비밀을 넣어서 버전 관리로 이어질 수 있으므로 이것은 더 위험합니다.
nu everest

4
@nueverest 이것은 정확하지만 선언을 설정 파일로 이동 한 다음 환경 변수를 통해 삽입하여이를 방지 할 수 있습니다.
Tiger_Mike

이것이 효과가 있지만 모범 사례를 따르지 않는다고 말할 수 있습니다.
ben jarman

1
감사. 이것은 개발 설정에서 임시 수정으로 사용할 수 있습니다. .env파일 (커밋되지 않음) 에서 이러한 변수를로드하는 것이 이상적이며 ~/.aws/폴더 에서 선택하는 것보다 낫습니다 .
SuperNova

56

나는 같은 문제가 있었고 내 ~/.aws/credentials파일 의 형식 이 잘못 되었음을 알았습니다 .

다음을 포함하는 파일로 작업했습니다.

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

프로필 이름은 " [default]" 이어야합니다 . 일부 공식 문서는 " [credentials]" 라는 이름의 프로필을 참조하는데 , 이는 저에게 적합하지 않습니다.


1
너무 창에 작품 (C : \ 사용자 \ 사용자 \ .aws \ 자격 증명)
Mr_and_Mrs_D

4
당신은 (<your_profile> = PROFILE_NAME) 세션 = boto3.Session를 사용 boto3에서 사용할 프로파일을 지정할 수 있습니다
마티아 테르

aws configureaws-cli가 설치된 경우에도 사용 가능
radtek

2
나는 ansible을 통해 그것을 실행하고 있었기 때문에 찾아야 할 또 다른 것은 명령을 실행하는 동안 다른 사용자가되는 경우입니다. 예를 들어 'sudo'를 사용하여 수행하고 있지 않은지 확인하십시오. 그렇지 않으면 대신 roots aws 자격 증명에 액세스하려고 시도하고 존재하지 않으면 실패합니다.
radtek

28

다른 방법을 찾고 있다면 다음을 사용하여 자격 증명을 추가해보십시오. AmazonCLI를 추가해보십시오.

터미널 유형에서 :-

aws configure

그런 다음 키와 지역을 입력하십시오.


17

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 .


1
output = json일반적으로 섹션 ~/.aws/config에 배치됩니다 [profile MyProfile1]. credentials대신 파일에 지정하면 작동하지 않을 수 있습니다 .
cjs

@Curt J. Sampson 확인하지 않고, 나는 당신이 옳다고 확신합니다. 수정 해 주셔서 감사합니다.
TheWalkingData

AWS_PROFILE = myprofle을 내보냈지만 작동하지 않았지만 작동했습니다. 왜 그런 일이 발생하는지에 대한 설명.
Adarsh ​​Trivedi

5

이 지침은 AWS 용 단일 사용자 프로필이있는 Windows 시스템 용입니다. ~/.aws/credentials파일이 다음과 같은지 확인하십시오.

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

자격 증명에서 찾을 수 있도록 AWS_DEFAULT_PROFILE환경 변수 를 설정해야했습니다 profile_name.
그런 다음 내 파이썬이 연결할 수있었습니다. 예 : 여기에서

import boto3

# Let's use Amazon S3
s3 = boto3.resource('s3')

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)

1
컴퓨터 섹션에서 Win10의 환경 변수를 설정 한 경우 재부팅해야 할 수도 있습니다.
Trevor

1
@Trevor, 나는 이것을 Jupyter 노트북이있는 Windows 7 컴퓨터에서 테스트했고, Jupyter 서버를 다시 시작해야했고 그것은 나를 위해 작동했지만 재부팅이 좋은 생각이라고 생각합니다.
Hrushikesh Dhumal

5

나는 또한 동일한 문제가 있었는데, 홈 디렉토리에 구성 및 자격 증명 파일을 생성하여 해결할 수 있습니다. 아래는이 문제를 해결하기 위해 수행 한 단계를 보여줍니다.

구성 파일 만들기 :

touch ~/.aws/config

그리고 그 파일에서 나는 지역에 들어갔다

[default]
region = us-west-2

그런 다음 자격 증명 파일을 만듭니다.

touch ~/.aws/credentials

그런 다음 자격 증명을 입력하십시오

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

이 모든 것을 설정 한 후 내 파이썬 파일을 버킷에 연결합니다. 이 파일을 실행하면 모든 내용이 나열됩니다.

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)

아래 링크를 참조 할 수도 있습니다.


4

터미널 유형에서 :-

aws configure

그런 다음 키와 지역을 입력하십시오.

이 후 다음 단계를 수행하여 모든 환경을 사용하십시오. 계정에 따라 여러 키를 가질 수 있습니다. 여러 환경 또는 키 관리 가능

import boto3
aws_session = boto3.Session(profile_name="prod")
# Create an S3 client
s3 = aws_session.client('s3')

2

저는 대기업에서 일하면서 이와 동일한 오류가 발생했지만 다른 해결 방법이 필요했습니다. 내 문제는 프록시 설정과 관련이 있습니다. 프록시를 설정 했으므로 모든 작업을 수행하기 전에 AWS를 화이트리스트에 추가하도록 no_proxy를 설정해야했습니다. os 설정으로 Python 코드를 엉망으로 만들고 싶지 않은 경우 bash 스크립트에서도 설정할 수 있습니다.

파이썬 :

import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"

세게 때리다:

export no_proxy = "s3.amazonaws.com"

편집 : 위는 미국 동부 S3 지역을 가정합니다. 다른 리전의 경우 : s3. [region] .amazonaws.com을 사용합니다. 여기서 region은 us-east-1 또는 us-west-2와 같습니다.


2
나는 비슷한 문제가 있었다 -하지만 말을했다 no_proxy위해 169.254.169.254AWS 클라이언트 인스턴스 프로파일을 찾기 위해 메타 데이터 서비스에 얻을 수 있도록.
Ralph Bolton

0

boto3는 다음과 같은 폴더에서 자격 증명을 찾고 있습니다.

C:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\botocore\.aws

이 폴더 credentialsconfig.

boto3 가이 링크 에서 자격 증명을 검색하는 일반적인 순서를 확인할 수 있습니다 . 자격 증명 구성 하위 제목 아래를보십시오 .


0

AWS를 올바르게 구성 했다고 확신하는 경우 프로젝트 사용자가 ./aws 에서 읽을 수 있는지 확인 하거나 프로젝트를 루트로 실행할 수 있는지 확인하십시오.


0

당신은이 있으면 여러 AWS 프로파일~/.aws/credentials같은 ...

[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************

다음 두 단계를 따르십시오.

  1. export AWS_DEFAULT_PROFILE=Profile 1터미널에서 명령을 사용하여 기본으로 사용할 것을 만드십시오 .

  2. boto3를 사용하거나 편집기를 여는 동일한 터미널에서 위의 명령을 실행해야합니다. [다음 시나리오 이해]

대본:

  • 두 개의 터미널이 열려 있으면 t1t2.
  • 그리고 당신이 수출 명령을 실행 t1하고 JupyterLab 또는에서 기타를 열고 t2, 당신은 얻을 것이다 NoCredentialsError을 : 자격 증명 찾을 수 없습니다 오류가 발생했습니다.

해결책:

  • 에서 내보내기 명령을 실행 한 t1다음 동일한 터미널에서 JupyterLab 또는 다른 항목을 엽니 다 t1.

0

자격 증명으로 S3 클라이언트 객체 생성

AWS_S3_CREDS = {
    "aws_access_key_id":"your access key", # os.getenv("AWS_ACCESS_KEY")
    "aws_secret_access_key":"your aws secret key" # os.getenv("AWS_SECRET_KEY")
}
s3_client = boto3.client('s3',**AWS_S3_CREDS)

OS 환경에서 자격 증명을 얻는 것이 항상 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.