Когда запрашиваемый объект из источника CF не существует, s3 не следует правилам перенаправления (вместо этого доступ запрещен)

Я строю оптимизатор изображений на лету, используя CloudFront, S3, API Gateway и Lambda, но сейчас я все еще пытаюсь вернуть исходный код CloudFront на свой путь ошибки s3.

Вот поток, который я ищу:

  1. Запросить изображение из CloudFront
  2. Не существует / не существует? Проверьте происхождение S3.
  3. Не существует / не существует? Перенаправить на hellowrld.html
  4. Делайте что угодно (цель здесь, или даже третий шаг, заключается в том, чтобы редирект вызвал лямбду, которая изменяет размер изображения и возвращает его обратно по линии к S3, CF и браузеру)

Если я пытаюсь получить доступ к объекту, который не существует через CloudFront, он правильно следует предоставленному источнику, но если объект не существует в S3, мне дают классический Access Denied Ответ XML, как показано ниже. My Bucket определенно имеет правильные права на запись и имеет открытый доступ для чтения (на данный момент)

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

Вот мой CF Происхождение / Поведение. Первоначально у меня просто был источник по умолчанию, и одно поведение по умолчанию, которое на самом деле все, что мне нужно, в моей возни я добавил верхний уровень и глубокий resizer/* уровень.

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

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

А вот мой раздел s3 Static Website Hosting и правила перенаправления

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

Я чувствую, что мне не нужно даже правила перенаправления, потому что в случае ошибки следует перенаправить на hellowrld.html (не опечатка), которая в настоящее время является просто пустой тестовой HTML-страницей.

Любая помощь будет принята с благодарностью! Я знаю, что этот otf image resizer - очень распространенный вариант использования лямбды при не обнаружении объекта, но я не могу найти примеров, когда они помещают CloudFront перед S3 перед API Gateway / Lambda

1 ответ

Похоже, вы добавили неверные коды ошибок http в вышеприведенном правиле перенаправления. Это должно быть 404 и 307. Я добавил полное правило перенаправления, которое вы можете использовать:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals/>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <Protocol>https</Protocol>
      <HostName>'your_api_gateway_url'</HostName>
      <ReplaceKeyPrefixWith>prefix_name'?key=</ReplaceKeyPrefixWith>
      <HttpRedirectCode>307</HttpRedirectCode>
    </Redirect>
  </RoutingRule>
</RoutingRules>
Другие вопросы по тегам