2015-03-11 2 views
3

J'essaie d'utiliser le service AWS cognito pour authentifier et télécharger un fichier. On m'a fourni mon regionType, identitéPool, ID de compte AWS, et UnAuthRole. Je connais également les noms des baies de production et de développement.Amazon AWS Cognito et Python Boto3 pour établir la connexion AWS et télécharger le fichier dans le compartiment

Je pense que je définis la clé d'accès AWS et la clé secrète AWS ... Je veux m'authentifier avec cognito et utiliser les résultats pour me permettre de faire une liste de seau et plus tard un téléchargement de fichier.

Qu'est-ce que je fais mal? Comment puis-je utiliser l'identifiant cognito pour établir une connexion S3?

Voici mon code et l'erreur résultant:

#!/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 

Erreur:

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> 

Ce code iOS correspondant fonctionne très 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]... 

Merci pour toute aide!

Répondre

2

Cette question est vraiment invalide car l'authentification échouait pas sur la création d'une session, mais en essayant de la liste des seaux.

Le téléchargement et le téléchargement à partir d'un compartiment spécifique fonctionnent correctement avec le code ci-dessus, mais pas avec la liste de tous les compartiments.

# 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) 
0

Ceci est votre erreur:

File "./test.py", line 32, in <module> 
bucket = conn.get_bucket("elektradevbucket") 

Ceci est votre partie du code qui fait référence à la benne:

bucket = conn.get_bucket("testbucket") 
''' 
s3 = boto3.resource('s3') 
for bucket in s3.buckets.all(): 
    print(bucket.name) 
s3.Bucket('testbucket') 

Êtes-vous sûr que vous utilisez ou d'appeler le script correct?

Best, -Iulian

+0

Salut lulian, j'ai oublié de le renommer dans mon article. Les noms de compartiment existent et correspondent à mon code mais je pense que le 403 est parce que je fournis des qualifications incorrectement. Voyez-vous quelque chose de mal avec mon flux d'authentification? Où dois-je utiliser le jeton? – PhilBot

+0

J'ai mis à jour mon message - je reçois un 403 en essayant de lister tous les seaux. Donc, connect_s3 ne fonctionne pas bien que tous les appels aboutissent. – PhilBot

1

PhilBot, je ne sais pas pourquoi votre exemple de code d'origine se connecte à l'aide s3 Boto (par opposition à boto3). Le code se connecte à cognito en utilisant boto3. A partir de maintenant, boto3 est stable et il n'y a probablement plus de raison d'utiliser boto. (Peut-être que lorsque vous avez posté votre question, boto3 n'était pas aussi stable qu'aujourd'hui.)

Lorsque j'ai essayé d'utiliser votre code pour vous connecter à kinesis avec boto3, cela n'a pas fonctionné - j'ai dû passer la réponse [ "Credentials"] ["SessionToken"] comme aws_session_token à la fonction client().