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