Erro Boto3: botocore.exceptions.NoCredentialsError: Não é possível localizar credenciais

112

Quando eu simplesmente executo o código a seguir, sempre recebo esse erro.

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)

Salvei meu arquivo de credencial em

C:\Users\myname\.aws\credentials, de onde Boto deve ler minhas credenciais.

Minha configuração está errada?

Aqui está a saída de 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
d -_- b
fonte
1
Você pode postar a saída de depuração adicionando boto3.set_stream_logger('botocore', level='DEBUG')antes de seu código? Ele mostrará onde está procurando as credenciais.
Jamesls
parece que o Boto procura alguns locais para o arquivo de configuração de credencial, mas aparentemente não procura em meu diretório inicial por algum motivo ...
d -_- b
2
Tente definir a variável de ambiente HOMEpara apontar C:\Users\mynameou definir AWS_SHARED_CREDENTIALS_FILEpara apontar diretamente para seu arquivo de credenciais.
garnaat
Defino a variável env HOME conforme você descreveu, mas agora estou recebendo o seguinte erro. botocore.exceptions.NoRegionError: You must specify a region. * meu arquivo de configuração ↓ está localizado na mesma pasta que meus credentails. [default] ap-northeast-1
d -_- b
1
Consegui corrigir o problema usando o comentário de garnaat .
LaundroMat

Respostas:

94

tente especificar as chaves manualmente

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

Certifique-se de não incluir seu ACCESS_ID e ACCESS_KEY no código diretamente por questões de segurança. Considere usar configurações de ambiente e injetá-las no código, conforme sugerido por @Tiger_Mike.

Para ambientes Prod, considere o uso de chaves de acesso rotativas: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

SHASHANK MADHAV
fonte
Esta forma é útil ao lidar diretamente no Django. Obrigado.
Joepreludian
1
Isso é mais perigoso porque você está colocando seus segredos em seu código que podem acabar no controle de versão.
nu everest
4
@nueverest Isso está correto, mas você pode evitar isso movendo a declaração para um arquivo de configurações e injetando através de variáveis ​​de ambiente.
Tiger_Mike
Embora isso funcione, eu diria que não está seguindo as práticas recomendadas.
ben jarman
1
Obrigado. Isso pode ser usado como uma correção temporária na configuração do desenvolvedor. Carregar essas variáveis ​​de um .envarquivo (não confirmado) seria ideal e seria melhor do que ter que escolher de uma ~/.aws/pasta.
SuperNova
56

Eu tive o mesmo problema e descobri que o formato do meu ~/.aws/credentialsarquivo estava errado.

Funcionou com um arquivo contendo:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Observe que o nome do perfil deve ser " [default]". Algumas documentações oficiais fazem referência a um perfil chamado " [credentials]", que não funcionou para mim.

Fernando Ciciliati
fonte
1
Funciona no Windows também (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D
4
você pode especificar qual perfil usar no boto3 usando session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna
Usar aws configuretambém funciona se você tiver o aws-cli instalado
radtek
2
Eu estava executando-o via ansible, então outra coisa a verificar é se você se tornou um usuário diferente ao executar o comando. Certifique-se de que você não está fazendo isso com 'sudo', por exemplo, ou ele tentará acessar as credenciais do aws do root e falhará se elas não existirem.
radtek
28

Se você está procurando uma maneira alternativa, tente adicionar suas credenciais usando AmazonCLI

do tipo de terminal: -

aws configure

em seguida, preencha suas chaves e região.

Amri
fonte
17

Certifique-se de que seu arquivo ~ / .aws / credentials no Unix se pareça com este:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Seu script Python deve ser parecido com isto e funcionará:

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'])

Fonte: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration .

TheWalkingData
fonte
1
O output = jsonnormalmente é colocado ~/.aws/configem uma [profile MyProfile1]seção. Ele pode não funcionar se especificado no credentialsarquivo.
cjs
@Curt J. Sampson Sem verificar, tenho certeza de que você está certo. Obrigado pela correção.
TheWalkingData
Eu exportei AWS_PROFILE = myprofle e não funcionou, mas funcionou. Qualquer explicação sobre por que isso pode estar acontecendo.
Adarsh ​​Trivedi
5

Estas instruções são para máquinas Windows com um único perfil de usuário para AWS. Certifique-se de que seu ~/.aws/credentialsarquivo se pareça com este

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Tive que definir a AWS_DEFAULT_PROFILEvariável de ambiente a ser profile_nameencontrada em suas credenciais.
Então meu python foi capaz de se conectar. por exemplo, daqui

import boto3

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

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)
Hrushikesh Dhumal
fonte
1
Se você definir a variável de ambiente no Win10 na seção da máquina, provavelmente também precisará reinicializar.
Trevor de
1
@Trevor, testei isso em uma máquina windows 7 com notebook Jupyter, tive que reiniciar o servidor Jupyter e funcionou para mim, mas acho que reiniciar seria uma boa ideia.
Hrushikesh Dhumal
5

Eu também tive o mesmo problema, ele pode ser resolvido criando um arquivo de configuração e credencial no diretório inicial. Abaixo, mostro as etapas que fiz para resolver esse problema.

Crie um arquivo de configuração:

touch ~/.aws/config

E nesse arquivo entrei na região

[default]
region = us-west-2

Em seguida, crie o arquivo de credencial:

touch ~/.aws/credentials

Em seguida, insira suas credenciais

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Depois de definir tudo isso, então meu arquivo python para conectar o balde. Executar este arquivo listará todo o conteúdo.

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)

Você também pode consultar os links abaixo:

Nija I Pillai
fonte
4

do tipo de terminal: -

aws configure

em seguida, preencha suas chaves e região.

depois disso, execute a próxima etapa, use qualquer ambiente. Você pode ter várias chaves, dependendo da sua conta. Pode gerenciar vários ambientes ou chaves

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

Eu trabalho para uma grande empresa e encontrei o mesmo erro, mas precisava de uma solução alternativa. Meu problema estava relacionado às configurações de proxy. Eu tinha meu proxy configurado, então precisei definir meu no_proxy para lista de permissões da AWS antes de fazer tudo funcionar. Você também pode defini-lo em seu script bash se não quiser confundir seu código Python com configurações de sistema operacional.

Pitão:

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

Bash:

export no_proxy = "s3.amazonaws.com"

Edit: O acima assume uma região US East S3. Para outras regiões: use s3. [Region] .amazonaws.com onde region é algo como us-east-1 ou us-west-2

JJFord3
fonte
2
Eu tive um problema semelhante - mas tinha que dizer no_proxypara 169.254.169.254que o cliente AWS pudesse acessar o serviço de metadados para encontrar o perfil da instância.
Ralph Bolton de
0

O boto3 está procurando as credenciais na pasta como

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

Você deve salvar dois arquivos nesta pasta credentialseconfig .

Você pode querer verificar a ordem geral em que o boto3 procura por credenciais neste link . Observe o subtítulo Configurando Credenciais .

Samuel Nde
fonte
0

Se você tiver certeza de que configurou seu aws corretamente, certifique-se de que o usuário do projeto pode ler de ./aws ou apenas execute seu projeto como root

Mohamed Hamed
fonte
0

Se você tiver vários perfis da AWS em ~/.aws/credentialscomo ...

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

Siga duas etapas:

  1. Faça um que deseja usar como padrão usando o export AWS_DEFAULT_PROFILE=Profile 1comando no terminal.

  2. Certifique-se de executar o comando acima no mesmo terminal de onde você usa boto3 ou abra um editor. [Entenda o seguinte cenário]

Cenário:

  • Se você tiver dois terminais abertos chamados t1e t2.
  • E você executa o comando de exportação t1e abre o JupyterLab ou qualquer outro t2, você obterá NoCredentialsError: Incapaz de localizar o erro de credenciais .

Solução:

  • Execute o comando de exportação t1e abra o JupyterLab ou qualquer outro no mesmo terminal t1.
Sanket Patel
fonte