AWS S3 - PUT на URL из getSignedUrl () возвращает ошибку 403 SignatureDoesNotMatch - PullRequest
0 голосов
/ 28 ноября 2018

Эта проблема сводит меня с ума уже два дня.

Цель: Загрузить изображение непосредственно из браузера в S3 через предварительно подписанный URL-адрес, предоставленный функцией getSignedUrlв AWS Javascript SDK.

У меня не было проблем с генерацией URL с помощью getSignedUrl.Следующий код ...

const params = {
  Key:         key,
  Bucket:      process.env.S3_BUCKET,
  ContentType: "image/jpeg"
};

S3.getSignedUrl("putObject", params, callback);

... дает что-то вроде:

https://s3.amazonaws.com/foobar-bucket/someImage.jpeg?AWSAccessKeyId=ACCESSKEY123&Content-Type=image%2Fjpeg&Expires=1543357053&Signature=3fgjyj7gpJiQvbIGhqWXSY40JUU%3D&x-amz-acl=private&x-amz-security-token=FQoGZXIvYXdzEDYaDPzeqKMbfgetCcZBaCL0AWftL%2BIT%2BP3tqTDVtNU1G8eC9sjl9unhwknrYvnEcrztfR9%2FO9AGD6VDiDDKfTQ9SmQpfXmiyTKDwAcevTwxeRnj6hGwnHgvzFVBzoslrB8MxrxjUpiI7NQW3oRMunbLskZ4LgvQYs8Rh%2FDjat4H%2F%2BvfPxDSQUSa41%2BFKcoySUHGh2xqfBFGCkHlIqVgk1KELDHmTaNckkvc9B4cgEXmAd3u1f1KC9mbobYcLLRPIzMj9bLJH%2BIlINylzubao1pCQ7m%2BWdX5xAZDhTSNwQfo4ywSWV7kUpbq2dgEriOiKAReEjmFQtuGqYBi3t2dhrasptOlXFXUozdz23wU%3D

Но загрузка изображения с помощью запроса PUT на предоставленный URL всегда возвращает403 SignatureDoesNotMatch ошибка от S3.

Что РАБОТАЕТ:

  • Вызов getSignedUrl () из локального экземпляра AWS Lambda (с помощью автономного сервера).

Что НЕ работает:

  • Установка переменных строки запроса в качестве заголовков (Content-Type, x-amz- * и т. Д..)
  • Удаление всех заголовков
  • Изменение ACL при получении URL-адреса (частный, публичный-чтение-запись, без ACL и т. Д.)
  • Изменение области aws-sdk в узле
  • Попытка POST вместо PUT (это стоит попробовать)

Любая помощь по этому вопросу будет принята с благодарностью.Я собираюсь выбросить мой компьютер из окна и выскочить за ним в отчаянии, если это продолжает оставаться проблемой, поскольку он просто НЕ хочет работать!

1 Ответ

0 голосов
/ 29 ноября 2018

Я понял это.Функция Lambda, вызывающая getSignedUrl (), не имела правильных разрешений роли IAM для доступа к рассматриваемому сегменту S3.В serverless.yml ...

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: "arn:aws:s3:::foobar-bucket/*"

Я бы на самом деле не использовал здесь подстановочный знак, но вы получите картину.Тот факт, что getSignedUrl () все еще успешно и возвращает URL, даже если URL обречен на неудачу из-за пропущенных разрешений, чрезвычайно вводит в заблуждение.

Я надеюсь, что этот ответ поможет некоторым запутанным душам вбудущее.

...