Как увеличить время истечения срока действия токена для загрузки boto3.s3.transfer?

Я использую boto3 s3.transfer для загрузки нескольких файлов размером 4 ГБ + с s3. Все, кроме одного, смогли загрузить, но тот, который не удался, дал следующую ошибку:

ERROR: An error occurred (ExpiredToken) when calling the GetObject operation: The provided token has expired.

Я использую его так же, как документ по адресу http://boto3.readthedocs.org/en/latest/_modules/boto3/s3/transfer.html

s3_client = session.client('s3')
transfer = S3Transfer(s3_client)
# Download s3://bucket/key to /tmp/myfile
transfer.download_file('bucket', 'key', '/tmp/myfile')

Есть ли способ увеличить время истечения срока действия подписанного URL-адреса, используемого внутри boto3?

Если это актуально, я использую Cognito для получения учетных данных и сеанса с ними.

    client = boto3.client('cognito-identity', AWS_REGION)

    # credentials[] contains the IdentityId and Token I get from my server
    # which I get using client.get_open_id_token_for_developer_identity 
    # with TokenDuration=86400
    resp = client.get_credentials_for_identity(IdentityId=credentials['IdentityId'],
                                               Logins={'cognito-identity.amazonaws.com': credentials['Token']})

    # The resp contains the actual temporary AWS secret/access codes and a session token, to be
    # used with the rest of the AWS APIs
    secretKey = resp['Credentials']['SecretKey']
    accessKey = resp['Credentials']['AccessKeyId']
    sessionToken = resp['Credentials']['SessionToken']

    session = Session(aws_access_key_id=accessKey,
                      aws_secret_access_key=secretKey,
                      aws_session_token=sessionToken,
                      region_name=AWS_REGION)

    s3_client = session.client('s3')

person dkarchmer    schedule 20.04.2016    source источник
comment
Как ваш код получает ключ доступа / секретный ключ? Из вашего вопроса я предполагаю, что код работает на экземпляре EC2 с прикрепленной к нему ролью IAM. Это верно ? Или вы АК / СК передаете с конфигурационным файлом? Переменная ENV?   -  person Sébastien Stormacq    schedule 21.04.2016
comment
Забыл упомянуть, что я использую когнито для получения секретного ключа, ключа доступа и токена сеанса.   -  person dkarchmer    schedule 21.04.2016
comment
Обновленный OP с кодом, показывающим, как я действительно получаю сеанс и клиент s3   -  person dkarchmer    schedule 21.04.2016
comment
Спасибо - это актуально, поскольку учетные данные, возвращаемые Cognito, являются временными, в отличие от жестко заданных / файлов конфигурации. Позвольте мне взглянуть на это.   -  person Sébastien Stormacq    schedule 21.04.2016
comment
Я вернулся, чтобы взглянуть на серверную часть, и вижу, что он использует продолжительность токена, которая установлена ​​на 86400. Я также подтвердил, что код должен получать новый токен перед загрузкой каждого файла, но, возможно, период становится кешируется и не обновляется?   -  person dkarchmer    schedule 21.04.2016
comment
Я не уверен, что Boto3 автоматически обновит учетные данные Cognito. Boto3 обновляет временные учетные данные, когда они предоставляются службой STS. Предоставьте ссылку на документацию, чтобы подтвердить, что Boto3 автоматически обновляет предоставленные Cognito учетные данные.   -  person Sébastien Stormacq    schedule 21.04.2016
comment
Я также интересуюсь вашим вариантом использования Cognito. Cognito обычно используется с веб-сайта мобильного приложения (отсюда и все примеры документов об Android, iOS, Javascript, Xamarin и т. Д.). Поскольку вы используете код Python, мне интересно, откуда этот код запускается и почему вы выбрали Cognito   -  person Sébastien Stormacq    schedule 21.04.2016
comment
Это автономный клиентский скрипт, который используется не только разработчиками DevOps, но вместо того, чтобы постоянно управлять IAM, скрипт аутентифицируется на моем сервере, а затем получает учетные данные когнитивного доступа, чтобы позволить клиенту использовать некоторые выбранные функции bito3, включая s3.transfer. В этом конкретном случае клиент работает в Azure.   -  person dkarchmer    schedule 21.04.2016


Ответы (1)


Проблема, с которой вы столкнулись, не связана с URL-адресом, подписанным S3, как вы предполагаете.

Cognito построен на основе службы IAM под названием Security Token Service (STS). Эта служба позволяет генерировать временные учетные данные (ключ доступа и секретный ключ), принимая роль (пользователь IAM, экземпляр EC2, функция Lambda и т. Д.) Или предоставляя токен Web Identity для сценариев федеративной идентификации, используя Google, Facebook, Amazon. .

Эти учетные данные ограничены по объему (любой роли IAM, которую вы определили) и по времени, от 15 секунд до нескольких часов, в зависимости от варианта использования.

Учетные данные, которые вы получаете через Cognito, генерируются службой STS. На низком уровне STS API позволяет указать, как долго вы хотите, чтобы эти учетные данные оставались действительными (см. http://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html). Однако я не могу найти эквивалент в Cognito API (https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html). Я бы хотел, чтобы меня доказали, что я ошибаюсь в этом вопросе.

Почему вы видите ошибку?

Я предполагаю, основываясь на предоставленных вами элементах, что ваш код загрузки работает дольше, чем срок действия временных учетных данных, которые вы получили. Сначала загрузка работает, а потом - нет.

Как это обойти?

  • На низком уровне чистым решением было бы использовать STS вместо Cognito, но это потребует огромного объема работы, и вы потеряете все преимущества использования Cognito (стабильный идентификатор пользователя между поставщиками входа, несколькими поставщиками входа, неаутентифицированными пользователями ... .)
  • Другое решение, предполагающее, что у вас есть несколько передач файлов в цикле, - это проверка срока действия учетных данных и их обновление между передачами файлов. Проверьте resp['Credentials']['Expiration'] срок действия. Вы можете обновить учетные данные, предоставленные Cognito, снова позвонив get_credentials_for_identity.
  • Вы также можете рассмотреть возможность загрузки файла через одно из 50+ периферийных местоположений, предоставляемых AWS. Это новая возможность S3, выпущенная только на этой неделе, которая значительно ускоряет загрузку или загрузку больших файлов. См. http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html для получения дополнительных сведений. С таким использованием связан ценник, см. http://aws.amazon.com/s3/pricing/
person Sébastien Stormacq    schedule 21.04.2016
comment
Я забыл, что когнито генерировало временные токены, но теперь я вижу, что проблема в этом. Что-то все еще происходит, поскольку токен должен длиться 24 часа, но с этим я знаю, что отлаживать - person dkarchmer; 21.04.2016