Amazon AWS Cognito и Python Boto3 для установления соединения с AWS и загрузки файла в Bucket

Я пытаюсь использовать сервис AWS cognito для аутентификации и загрузки файла. Мне были предоставлены мой regionType, identityPool, идентификатор учетной записи AWS и UnAuthRole. Я также знаю названия сегментов производства и разработки.

Я думаю, что устанавливаю ключ доступа AWS и секретный ключ AWS... Я хочу пройти аутентификацию с помощью cognito и использовать результаты, чтобы позволить мне сделать список сегментов, а затем загрузить файл.

Что я делаю неправильно? Как я могу использовать идентификатор cognito для установления соединения S3?

Вот мой код и полученная ошибка:

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

Ошибка:

   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>

Этот соответствующий код iOS работает нормально:

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]...

Спасибо за любую помощь!


person PhilBot    schedule 11.03.2015    source источник


Ответы (3)


Этот вопрос действительно недействителен, потому что аутентификация не удалась не при создании сеанса, а при попытке перечислить ведра.

Загрузка и скачивание из определенного сегмента отлично работает с приведенным выше кодом, но не со списком всех сегментов.

# 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)
person PhilBot    schedule 12.03.2015

PhilBot, я не знаю, почему ваш оригинальный пример кода подключается к s3 с помощью boto (в отличие от boto3). Код подключается к cognito с помощью boto3. На данный момент boto3 работает стабильно, и, вероятно, больше нет причин использовать boto. (Возможно, когда вы изначально разместили свой вопрос, boto3 не был таким стабильным, как сегодня.)

Когда я попытался использовать ваш код для подключения к kinesis с помощью boto3, это не сработало — мне пришлось передать response["Credentials"]["SessionToken"] в качестве aws_session_token функции client().

person Daniel Libicki    schedule 09.02.2017

Это ваша ошибка:

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

Это ваша часть кода, которая ссылается на ведро:

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

Вы уверены, что запускаете или вызываете правильный скрипт?

Лучший, -Юлиан

person Iulian    schedule 11.03.2015
comment
Привет, Лулиан, я забыл переименовать это в своем посте. Имена сегментов существуют и соответствуют моему коду, но я думаю, что ошибка 403 возникает из-за того, что я неправильно предоставляю учетные данные. Вы видите что-то не так с моим потоком авторизации? Где я должен использовать токен? - person PhilBot; 11.03.2015
comment
Я обновил свой пост - я получаю 403 при попытке перечислить все ведра. Таким образом, connect_s3 не увенчался успехом, хотя все вызовы до этого момента были успешными. - person PhilBot; 11.03.2015