서버리스 사진첩
Bare Minimum Requirements
- 이미지가 업로드되면, 원본과 별도로 썸네일을 생성하고, 이를 별도의 버킷에 저장해야 합니다.
- 썸네일 이미지는 가로 200px의 크기를 가집니다.
- 썸네일을 저장할 별도의 버킷은 람다 함수의 환경 설정으로 구성되어야 합니다.
- 썸네일 생성이 완료되면, 메일로 해당 썸네일 URL과 함께 전송이 되어야 합니다.
- Amazon SNS를 활용합니다.
Advanced Challenge
- 과제를 달성하면, S3 이벤트가 SQS로 전송되게 만들고, SQS로부터 이벤트를 받아 람다가 실행하게 만들어봅시다.
- S3의 Pre-signed URL 기능을 이용하여, 업로드 전용 URL을 획득하고, 이를 통해 이미지를 S3 업로드할 수 있게 만들어봅시다.
우선 먼저 sam init으로 Quick Start Template으로부터 Standalone function을 하나 생성했다.

그 후 js파일을 이벤트형태의 확인을 위해 밑 그림처럼 변경하고 빌드 후 배포한다.

배포하는 동안에 트리거로 이어줄 s3도 하나 만든다. 만들 때 퍼블릭 엑세스를 다 해제하고 acl로 활성화해주고 배포된 람다함수에 s3를 트리거로 이어준다. 이때 모든 객체생성이벤트로 만들어주며 접미사는 .jpeg다.
즉, s3에 .jpeg로 객채가 업로드되면 이벤트가 실행되는 것이다. 한번 s3에 .jpeg 파일을 올려보자

잘 이어져서 로그가 뜨는 모습을 볼 수 있다.

이제 s3에 올린 이미지가 람다 함수를 거쳐서 다른 s3을 올라가고 여기에 200px로 수정된 썸네일 이미지가 올라가야한다. 코드는 유어클래스에 올려줬고 s3을 하나 더 만든 뒤 코드에 모듈을 추가하고 원본 버킷, 그리고 오브젝트, 올라갈 버킷을 수정해서 넣어주고 배포했다.


코드는 저렇게 짰고 패키지제이슨에 sharp 모듈을 설치하게 수정해줬다. s3에 사진을 넣어보니 오류가 떴다.

생각해보니 s3의 정책을 안 넣어줬다. 가서 정책을 넣어주자.

원본 s3와 썸네일s3에 동일하게 정책을 넣어주고 람다의 iam에도 s3에 풀엑세스를 줬더니 에러가 해결되고 잘 들어가는 걸 확인했다.

이제 sns를 대상으로 이을 차례이다.

sns를 만들고 구독 후 이벤트 성공 시 sns가 실행되고 메일이 가는 걸 구성했다.

하지만 url은 안 오고 로그가 왔다. url은 올 필요없이 메일이 오기만 하면 된다했지만 코드를 수정해서 url이 오게끔 해보겠다.
먼저, sns를 대상에서 삭제하고 코드를 수정해 sns을 가게끔 해보겠다.

해당 코드를 추가하고 람다와 sns에 권한을 설정하고 s3에 사진을 넣었더니 잘 오는 것을 확인할 수 있다.

지금 완성한 것은 s3-lambda-s3-sns 이런 식이다. 여기에 s3-sqs-lambda-s3-sns 로 바꿔보겠다.
먼저, sqs를 만들어준다. 여기서 정책을 https://www.enqdeq.net/283 이 글을 보고 설정한다.

이렇게 만든 후 sqs와 lambda를 이어준다. 여기서 권한문제가 뜰 수 있는데 람다에 sqs 풀 엑세스를 주면 된다.

위 처럼 이은 뒤 s3에 올려주면 에러가 난다.

이 에러는 s3에서가 아닌 sqs에서 받아오다보니 이벤트의 바디 안에 정보가 들어가져있어서 그렇기에 코드를 수정해준다.

그 후 s3에 사진을 넣으면 잘 작동하는 것을 볼 수 있다.
그럼 pre-signed를 해보겠다.
방법은 두가지가 있는데 .js을 하나 더 만들어 하는 방법과 람다 함수를 하나 더 만들어하는 방법이 있는데 전자는 해봐서 후자로 해보겠다.
위 아마존문서를 참고하여 하였다.
위 그림과 같이 하면 람다를 만들면서 생긴 버킷으로 들어가기 때문에 환경변수에 들어가 내 원본버킷으로 바꾼다. 그리고 코드에 jpg에 되있어 s3에 들어가도 람다함수가 실행 안 되기에 코드를 .jpeg로 바꾸면 jpg를 넣어도 알아서 jpeg로 변환해준다.



그럼 이제 마지막인 s3에 사진을 올리면 discord에 썸네일 이미지가 올라가게 해보겠다 discord.js를 써도 되지만 난 axios를 써보겠다.

위 그림처럼 코드를 넣고 위에 axios 모듈도 넣어주고 패키지제이슨에도 axios를 넣어준다. 그 후 포스트맨으로 사진을 쏘면 디스코드에 뜨는 모습을 확인할 수 있다.


'TIL' 카테고리의 다른 글
| 50~51일차 Infrastructure as Code 실습 (0) | 2022.06.28 |
|---|---|
| 49일차 Infrastructure as Code (0) | 2022.06.24 |
| 46일차 마이크로서비스 작성 실습 (0) | 2022.06.22 |
| 46일차 마이크로서비스 작성 (0) | 2022.06.21 |
| 45일차 마이크로서비스 (0) | 2022.06.20 |