S3, cloudfront, lambda 조합에서 자주하는 실수


(이종은(Jong Lee)) #1

오늘은 예전에 했던 실수인데 오늘 같은 실수를 또 해서 정리 차원에서 공유해봅니다.

상황

간단히 정리하자면 상황은 이렇습니다.

  1. parse-server에서 파일을 s3에 저장하도록 했습니다. (예: s3.aws.com/myBucket/apple.jpg)

  2. cloudfront로 CDN적용 시킵니다.(예: cloudfront.aws.com/myBucket/apple.jpg)

  3. 이미지 파일일 경우 동적으로 thumbnail을 생성하도록 하는 lambda를 만듭니다.

  4. S3는 hosting 설정에서 redirect rule을 이용하여 존재하지 않는 파일(404)에 접근할 경우 위에서 만든 lambda를 호출합니다.

문제

이렇게 설정 했는데 4번에서 처럼 아직 만들어지지 않은 썸네일 파일을 호출하면 lambda 호출하는 apigateway 주소로 redirect되어야 하는데 access denied 에러 페이지가 나옴…

해결방법

cloudfront에서 origin 설정할 때 자동완성되는 s3의 bucket host name대신에 static website 설정하면서 생성된 url의 hostname을 적으면 됩니다.

전에도 아래 댓글 보고 해결했는데 오늘도 역시 아래 댓글 덕에 해결했습니다.

I ran into this problem recently and I found a workaround that seemed to work.

I created a Cloudfront distribution with a custom origin pointing to the S3 static website hostname instead of the bucket hostname. In the OP’s case, the desired origin would be.

mysite.s3-website-us-east-1.amazonaws.com
Hitting a Cloudfront distribution just using the bucket as the origin does not work because the bucket does not actually serve redirects. It only serves files and stores metadata.

Hope that helps.