AWS Lambda 를 처음으로 사용해 봤다. S3 에 업로드된 이미즈를 resize 하고 watermark 를 붙여서 thumbnail 이미지로 만드는 작업을 하고 싶었다. 기존에는 ec2 내 작업 중 하나였는데, 동작이 너무 느리고 간혹 서버가 죽는 문제가 발생했다. (내부적으로 multi processing 을 처리하는데 이게 좀 잘못된 것 같다.) 동시에 여러 job을 처리할 수 있는 aws lambda 를 사용해서 개선 작업을 하기로 했다.
lambda 의 Trigger 동작이 s3 put 동작으로 설정하고 이것 저것 작업 했다. 내부동작은 s3에 올라온 원본파일을 읽어 thumbnail 을 3가지로 만들고 다시 s3 에 업로드 하는 동작이다. 결과를 s3에 업로드하는 동작이 다시 3개의 Lambda 함수를 trigger 하는 recursive 동작이었다. 이 코드를 테스트 할 때 엄청나게 생성되는 파일을 보고 뭔가 잘못됨을 인지했다. 중지 시키는 것도 몰라서 그냥 에러를 발생시키는 코드를 배포했다.
한 1분 동안 작동한 것 같은데, 이게 3의 n 승번 동작이 발생해서 50만번 정도의 동작이 발생했다. 다행히 aws lambda 무료 사용횟수 내였다. 대신 S3 사용 비용이 $5 정도는 발생했다.
테스트 하는 중이었기 때문에 따로 방어 코드는 넣지 않았다. 그리고 boto3 의 put_object 만 put 인줄 알았다. 그래서 upload_file 을 thumbnail 을 업로드 하면 다시 lambda 함수가 trigger 되는 일이 없을 거라고 생각했다. 그런데 upload_file 도 PUT 으로 인식하고 있었다.
방어 코드로 meta 정보를 이용하기로 했다. S3에 파일(Object)를 업로드 할 때 x-amz-meta-* 를 붙여 부가적인 정보를 전달할 수 있다. x-amz-meta-type : orgin 을 가질 때만 파일을 thumbnail 을 만드는 작업을 진행하기로 했다. 물론 이렇게 하면 의미없는 lambda 호출이 추가적으로 3번(내 경우 thumbnail 종류를 3가지 만든다.) 발생할 수 있다.
여기에 추가적인 트리거자체가 발생하지 않도록 put 이 아닌 다른 방법으로 s3 를 업로드 시켰다. S3 에 PresignedUrl을 통해 thumbnail 파일을 업로드 시키는 방식이 있다. 내 테스트에서는 이것은 Put trigger 가 발생하지 않았다. 이 방법은 보통 웹브라우저에서 사용자 PC에서 바로 S3 로 업로드 할 때 사용하는 방식이다. 마치 웹브라우가 업로드 하듯이 python requests 라이브러리를 이용해서 파일을 업로드 시키면 이 방법이 먹힌다.
처음으로 새로운 것을 사용하다보니 좀 일이커지는 것 같다. 이 작업하면서 파이썬 library 를 설치하는 것도 꽤 큰일이었는데. 이것도 나중에 정리해서 올리도록 하겠다.