Error de Boto3: botocore.exceptions.NoCredentialsError: No se pueden localizar las credenciales

112

Cuando simplemente ejecuto el siguiente código, siempre aparece este error.

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)

He guardado mi archivo de credenciales en

C:\Users\myname\.aws\credentials, desde donde Boto debería leer mis credenciales.

¿Está mal mi configuración?

Aquí está el resultado 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
fuente
1
¿Puede publicar la salida de depuración agregando boto3.set_stream_logger('botocore', level='DEBUG')antes de su código? Mostrará dónde está buscando las credenciales.
jamesls
parece que Boto busca bastantes ubicaciones para el archivo de configuración de credenciales, pero aparentemente no busca en mi directorio de inicio por alguna razón ...
d -_- b
2
Intente configurar la variable de entorno HOMEpara que apunte C:\Users\mynameo configure AWS_SHARED_CREDENTIALS_FILEpara que apunte directamente a su archivo de credenciales.
garnaat
Configuré la variable env HOME como lo describió, pero ahora aparece el siguiente error. botocore.exceptions.NoRegionError: You must specify a region. * mi archivo de configuración ↓ se encuentra en la misma carpeta que mis credentails. [default] ap-northeast-1
d -_- b
1
Pude solucionar el problema usando el comentario de garnaat .
LaundroMat

Respuestas:

94

intente especificar claves manualmente

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

Asegúrese de no incluir su ACCESS_ID y ACCESS_KEY en el código directamente por cuestiones de seguridad. Considere usar configuraciones de entorno e inyectarlas en el código como lo sugiere @Tiger_Mike.

Para entornos de producción, considere el uso de claves de acceso rotativas: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

SHASHANK MADHAV
fuente
De esta forma es útil cuando se maneja directamente en Django. Gracias.
Joepreludian
1
Esto es más peligroso ya que está poniendo sus secretos en su código que podrían terminar en control de versiones.
nu everest
4
@nueverest Esto es correcto, pero puede evitarlo moviendo la declaración a un archivo de configuración y luego inyectando a través de variables de entorno.
Tiger_Mike
Aunque esto funciona, diría que no sigue las mejores prácticas.
Ben Jarman
1
Gracias. Esto se puede usar como una solución temporal en la configuración del desarrollador. Cargar estas variables desde un .envarchivo (no confirmado) sería ideal y sería mejor que tener que elegir desde una ~/.aws/carpeta.
SuperNova
56

Tuve el mismo problema y descubrí que el formato de mi ~/.aws/credentialsarchivo era incorrecto.

Funcionó con un archivo que contiene:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Tenga en cuenta que el nombre del perfil debe ser " [default]". Alguna documentación oficial hace referencia a un perfil llamado " [credentials]", que no me funcionó.

Fernando Ciciliati
fuente
1
También funciona en Windows (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D
4
puede especificar qué perfil usar en boto3 usando session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna
El uso aws configuretambién funciona si tiene instalado aws-cli
radtek
2
Lo estaba ejecutando a través de ansible, por lo que otra cosa a buscar es si se convierte en un usuario diferente mientras ejecuta el comando. Asegúrese de no hacerlo con 'sudo', por ejemplo, o intentará acceder a las credenciales de root aws y fallará si no existen.
radtek
28

Si está buscando una forma alternativa, intente agregar sus credenciales usando AmazonCLI

del tipo de terminal: -

aws configure

luego complete sus claves y región.

Amri
fuente
17

Asegúrese de que su archivo ~ / .aws / credentials en Unix tenga este aspecto:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Su secuencia de comandos de Python debería verse así y 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'])

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

TheWalkingData
fuente
1
El output = jsonnormalmente se coloca en el ~/.aws/configen una [profile MyProfile1]sección. Es posible que no funcione si se especifica en el credentialsarchivo.
cjs
@Curt J. Sampson Sin comprobarlo, estoy seguro de que tiene razón. Gracias por la corrección.
TheWalkingData
Exporté AWS_PROFILE = myprofle y no funcionó, pero funcionó. Cualquier explicación de por qué podría estar sucediendo eso.
Adarsh ​​Trivedi
5

Estas instrucciones son para máquinas Windows con un perfil de usuario único para AWS. Asegúrese de que su ~/.aws/credentialsarchivo se vea así

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Tuve que configurar la AWS_DEFAULT_PROFILEvariable de entorno para profile_nameencontrarla en sus credenciales.
Entonces mi python pudo conectarse. por ejemplo, desde aquí

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
fuente
1
Si configura la variable de entorno en Win10 en la sección de la máquina, probablemente también tendrá que reiniciar.
Trevor
1
@Trevor, probé esto en una máquina con Windows 7 con un portátil Jupyter, tuve que reiniciar el servidor Jupyter y funcionó para mí, pero creo que reiniciar sería una buena idea.
Hrushikesh Dhumal
5

También tuve el mismo problema, se puede resolver creando un archivo de configuración y credenciales en el directorio de inicio. A continuación, se muestran los pasos que hice para resolver este problema.

Crea un archivo de configuración:

touch ~/.aws/config

Y en ese archivo entré a la región

[default]
region = us-west-2

Luego crea el archivo de credenciales:

touch ~/.aws/credentials

Luego ingrese sus credenciales

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Después de configurar todos estos, luego mi archivo de Python para conectar el depósito. Ejecutar este archivo mostrará una lista de todos los contenidos.

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)

También puede consultar los siguientes enlaces:

Nija I Pillai
fuente
4

del tipo de terminal: -

aws configure

luego complete sus claves y región.

después de esto, haga el siguiente paso, use cualquier entorno. Puede tener varias claves dependiendo de su cuenta. Puede gestionar varios entornos o claves

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

Trabajo para una gran corporación y encontré este mismo error, pero necesitaba una solución diferente. Mi problema estaba relacionado con la configuración del proxy. Tenía mi proxy configurado, por lo que necesitaba configurar mi no_proxy para incluir AWS en la lista blanca antes de poder hacer que todo funcionara. También puede configurarlo en su script bash si no desea enturbiar su código Python con la configuración del sistema operativo.

Pitón:

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

Intento:

export no_proxy = "s3.amazonaws.com"

Editar: Lo anterior asume una región S3 del este de EE. UU. Para otras regiones: use s3. [Region] .amazonaws.com donde region es algo como us-east-1 o us-west-2

JJFord3
fuente
2
Tuve un problema similar, pero tuve que decirlo no_proxypara 169.254.169.254que el cliente de AWS pudiera acceder al servicio de metadatos para encontrar el perfil de la instancia.
Ralph Bolton
0

El boto3 busca las credenciales en la carpeta como

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

Debería guardar dos archivos en esta carpeta credentialsy config.

Es posible que desee consultar el orden general en el que boto3 busca las credenciales en este enlace . Busque en el subtítulo Configuración de credenciales .

Samuel Nde
fuente
0

Si está seguro de haber configurado correctamente sus AWS, solo asegúrese de que el usuario del proyecto pueda leer desde ./aws o simplemente ejecute su proyecto como root

Mohamed Hamed
fuente
0

Si tiene varios perfiles de AWS en ~/.aws/credentialslike ...

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

Siga dos pasos:

  1. Haga uno que desee usar como predeterminado usando el export AWS_DEFAULT_PROFILE=Profile 1comando en la terminal.

  2. Asegúrese de ejecutar el comando anterior en la misma terminal desde donde usa boto3 o abre un editor. [Comprenda el siguiente escenario]

Guión:

  • Si tiene dos terminales abiertos llamados t1yt2 .
  • Y ejecuta el comando de exportación t1y abre JupyterLab o cualquier otro de t2, obtendrá NoCredentialsError: No se puede localizar el error de credenciales .

Solución:

  • Ejecute el comando de exportación t1y luego abra JupyterLab o cualquier otro desde la misma terminal t1.
Sanket Patel
fuente
0

Cree un objeto de cliente S3 con sus credenciales

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)

Siempre es bueno obtener credenciales del entorno del sistema operativo

kathir raja
fuente