Когда запрашиваемый объект из источника CF не существует, s3 не следует правилам перенаправления (вместо этого доступ запрещен)
Я строю оптимизатор изображений на лету, используя CloudFront, S3, API Gateway и Lambda, но сейчас я все еще пытаюсь вернуть исходный код CloudFront на свой путь ошибки s3.
Вот поток, который я ищу:
- Запросить изображение из CloudFront
- Не существует / не существует? Проверьте происхождение S3.
- Не существует / не существует? Перенаправить на hellowrld.html
- Делайте что угодно (цель здесь, или даже третий шаг, заключается в том, чтобы редирект вызвал лямбду, которая изменяет размер изображения и возвращает его обратно по линии к 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>