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

이 폴더 credentials와 config.

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를 사용하거나 편집기를 여는 동일한 터미널에서 위의 명령을 실행해야합니다. [다음 시나리오 이해]

대본:

  • 두 개의 터미널이 열려 있으면 t1및 t2.
  • 그리고 당신이 수출 명령을 실행 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.