create - boto3 python upload to s3
Amazon AWS Cognito y Python Boto3 para establecer la conexión de AWS y subir el archivo a Bucket (3)
Intento usar el servicio cognito de AWS para autenticar y cargar un archivo. Se me ha proporcionado mi regionType, identityPool, AWS account ID y UnAuthRole. También sé los nombres del cubo de producción y desarrollo.
Creo que estoy configurando la clave de acceso de AWS y la clave secreta de AWS ... Quiero autenticarme con cognito y usar los resultados para permitirme hacer una lista de depósitos y luego subir un archivo.
¿Qué estoy haciendo mal? ¿Cómo puedo usar el ID cognito para establecer una conexión S3?
Aquí está mi código y el error resultante:
#!/usr/bin/python
import boto3
import boto
#boto.set_stream_logger(''foo'')
import json
client = boto3.client(''cognito-identity'',''us-east-1'')
resp = client.get_id(AccountId=''<ACCNTID>'',IdentityPoolId=''<IDPOOLID>'')
print "/nIdentity ID: %s"%(resp[''IdentityId''])
print "/nRequest ID: %s"%(resp[''ResponseMetadata''][''RequestId''])
resp = client.get_open_id_token(IdentityId=resp[''IdentityId''])
token = resp[''Token'']
print "/nToken: %s"%(token)
print "/nIdentity ID: %s"%(resp[''IdentityId''])
resp = client.get_credentials_for_identity(IdentityId=resp[''IdentityId''])
secretKey = resp[''Credentials''][''SecretKey'']
accessKey = resp[''Credentials''][''AccessKeyId'']
print "/nSecretKey: %s"%(secretKey)
print "/nAccessKey ID: %s"%(accessKey)
print resp
conn = boto.connect_s3(aws_access_key_id=accessKey,aws_secret_access_key=secretKey,debug=0)
print "/nConnection: %s"%(conn)
for bucket in conn.get_all_buckets():
print bucket.name
Error:
Traceback (most recent call last):
File "./test.py", line 32, in <module>
for bucket in conn.get_all_buckets():
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 440, in get_all_buckets
response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><AWSAccessKeyId>ASIAILXMPZEMJAVZN7TQ</AWSAccessKeyId><RequestId>10631ACFF95610DD</RequestId><HostId>PGWDRBmhLjjv8Ast8v6kVHOG3xR8erJRV2ob3/2RmqHXwrg8HCZV578YsNLaoL24Hknr+nh033U=</HostId></Error>
Este código iOS correspondiente funciona bien:
AWSCognitoCredentialsProvider *credentialsProvider =
[AWSCognitoCredentialsProvider credentialsWithRegionType:awsCognitoRegionType
accountId:awsAccountId
identityPoolId:awsCognitoIdentityPool
unauthRoleArn:unauthRoleArn
authRoleArn:nil];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:awsCognitoRegionType
credentialsProvider:credentialsProvider];
....
AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = [ELEEnvironment currentEnvironment].userDataS3Bucket;
uploadRequest.key = key;
uploadRequest.body = uploadFileURL;
[[self uploadTask:uploadRequest] continueWithExecutor:[BFExecutor mainThreadExecutor]...
¡Gracias por cualquier ayuda!
Esta pregunta es realmente inválida porque la autenticación falló no al crear una sesión sino al intentar enumerar los segmentos.
Cargar y descargar desde un segmento específico funciona bien con el código anterior, pero no la lista de todos los segmentos.
# Upload a new file
data = open(''test.jpg'', ''rb'')
s3.Bucket(''mybucket'').put_object(Key=''test.jpg'', Body=data)
# S3 Object
obj = s3.Object(bucket_name=''mybucket'', key=''test.jpg'')
response = obj.get()
data = response[''Body''].read()
print len(data)
Este es tu error:
File "./test.py", line 32, in <module>
bucket = conn.get_bucket("elektradevbucket")
Esta es su parte del código que hace referencia al depósito:
bucket = conn.get_bucket("testbucket")
''''''
s3 = boto3.resource(''s3'')
for bucket in s3.buckets.all():
print(bucket.name)
s3.Bucket(''testbucket'')
¿Estás seguro de que estás ejecutando o llamando al script correcto?
Mejor, -italiano
PhilBot, no sé por qué tu muestra de código original se conecta a s3 usando boto (a diferencia de boto3). El código se conecta a cognito usando boto3. A partir de ahora, boto3 es estable y probablemente ya no haya muchas razones para usar boto. (Tal vez cuando originalmente publicaste tu pregunta, boto3 no era tan estable como lo es hoy).
Cuando traté de usar tu código para conectarte a kinesis con boto3, no funcionó; tuve que pasar la respuesta ["Credentials"] ["SessionToken"] como aws_session_token a la función client ().