Срок действия подписанного URL-адреса S3 истекает немедленно

#javascript #amazon-web-services #amazon-s3 #aws-lambda

#javascript #amazon-веб-сервисы #amazon-s3 #aws-lambda

Вопрос:

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

Я использую следующий код для создания подписанного URL-адреса S3:

 s3.getSignedUrl("putObject", {
        Bucket: bucketName,
        Key: itemId,
        Expires: expirationTime
    })
  

Когда я создаю подписанный URL-адрес с помощью лямбда-функции в eu-central-1 , он возвращает действительный URL-адрес, который работает нормально, и я могу загрузить файл, используя его.

Однако, если я сделаю это в той же лямбда-функции в us-east-1 , я получу URL-адрес, срок действия которого истекает немедленно, в ту же секунду, когда был сгенерирован подписанный URL-адрес. Когда я пытаюсь использовать URL-адрес из us-east-1 , я получаю следующую ошибку:

введите описание изображения здесь

Я также заметил, что подписанные URL-адреса из us-east-1 (которые не работают) и eu-central-1 (которые работают) содержат разные наборы параметров.

сша-восток-1

введите описание изображения здесь

eu-central-1

введите описание изображения здесь

Вот разрешения IAM для лямбда-функции в us-east-1 :

введите описание изображения здесь

Комментарии:

1. Вероятно, вам не хватает разрешения для вашей роли lambda IAM для конкретного региона, т. Е. us-east-1.

2. @devutkarsh Я обновил вопрос. Роль IAM, похоже, не является проблемой, и у нее есть (по-видимому) правильные разрешения для доступа к корзине S3.

3. Определенно не связано с разрешениями. Это ваш точный код? Я видел, что срок действия подписанных URL-адресов истекает немедленно, когда Expires это строка, которая выглядит как число вместо фактического числа. Должна быть возможность заставить SDK использовать алгоритм V4 для всех подписей, как в вашем примере eu-central-1, который также решал бы проблему и, вероятно, является очень хорошей идеей на данный момент, но я ненавижу скрывать / игнорировать плохое поведение и предпочел бы определить причину этой проблемы, прежде чем предлагать такой подход.

4. @Michael-время истечения срока действия sqlbot зависит от другой переменной, я обновил код, чтобы отразить это. Я дважды проверю тип и попытаюсь принудительно использовать SDK V4 в обоих случаях.

5. Может быть, попробовать Expires: Number(expirationTime) или Expires: parseInt(expirationTime)