실습

Github Actions-SQS-Lambda-S3를 사용하여, 주기적으로 이미지를 축소하여 저장하기

vcxz 2023. 6. 9. 17:01

 

서비스를 학습하기 위하여 간단한 파이프라인을 만들어 보았습니다.

 

  1. Github Actions에서 AWS SQS로 이미지 URL 전달
  2. SQS는 AWS Lambda 함수를 트리거하여 이미지 URL에서 이미지를 받고 축소한 후 S3에 저장

 

 

Github Actions ▶ SQS

주기적으로 작업을 실행할 수 있는 서비스인 Github Actions를 사용하여 매일 0시(UTC)에 이미지 URL 20개를 SQS 대기열에 보내도록 하였습니다.

 

SQS에 접근한 후 이미지 URL을 SQS 대기열에 보내는 파이썬 파일과, 이를 Actions로 실행하기 위해 워크플로 파일을 만들었습니다.

Github Actions 환경이기 때문에, SQS 클라이언트 객체를 생성할 때 공유 자격 증명 등 파일이 아닌 방법으로 자격 증명을 해야 합니다. 저는 다음 방법으로 수행하였습니다.

 

  1. Github Actions의 Secret으로 액세스 키를 저장하고,
  2. 파이썬 파일에서 sys.argv를 액세스 키로 받아 인수로 사용합니다.
  3. 그리고 워크플로 파일에서 Secret의 액세스 키를 환경 변수로 두고,
  4. 파이썬 파일을 실행할 때 해당 환경 변수를 인수로 사용하여 파이썬 파일에 액세스 키를 전달합니다.

 

 

SQS ▶ Lambda

Lambda를 트리거하기 쉽도록, 트리거 기능이 있고 사용이 간단한 SQS를 사용하였습니다.

이미지 URL을 SQS 대기열에 넣고 Lambda를 트리거합니다.

 

SQS는 FIFO 대기열로 생성하였습니다. 별다른 설정은 하지 않고 기본 값 위주로 구성하였습니다.

Lambda 트리거 기능을 통해 사용할 Lambda와 연결하였습니다.

 

 

Lambda ▶ S3

SQS 이벤트를 받아 이미지 URL에서 이미지를 다운로드한 후, 축소하고, S3의 미리 서명된 URL로 이미지를 POST하여 S3에 저장합니다.

 

URL에서 이미지를 다운로드하고 미리 서명된 URL로 POST하기 위하여 requests 라이브러리를,

이미지를 축소하기 위하여 PIL 라이브러리를 사용하기 위하여 계층을 추가하였습니다.

그런데 계층을 추가하였는데도 requests 라이브러리를 사용할 수 없었는데, 2.25.0 버전으로 계층을 생성하니 라이브러리를 사용할 수 있었습니다.

 

이미지를 저장할 때 uuid를 사용해 중복되지 않는 파일명을 만들어 주었습니다.

 

처음에는 S3에 그냥 업로드하는 방식을 사용하였으나 이 경우 서버를 통하기 때문에,

서버를 통하지 않고 URL을 통해 바로 POST하는 미리 서명된 URL 방식보다 느리다고 하여 방법을 바꿨습니다.

관련 권한을 가진 Lambda로 실행하는 것이기 때문에 미리 서명된 URL의 장점인 보안이 큰 의미가 없는 것 같긴 합니다.

 

 

결론

소요 시간은 Github Actions에서 액션을 실행할 때부터 S3에 파일이 저장될 때까지 1분 좀 안 되게 걸렸습니다.

 

  • Github Actions에서 액션이 실행되는 데 11초,
  • Lambda 함수가 점유하는 시간이 약 20초이므로,
  • SQS 대기열에서 10~20초 정도 소모되는 듯합니다.

코드가 간단하기 때문에 Github Actions에서 환경을 구성하는 시간이 더 걸리므로, 시간을 줄이려면 환경을 구성하지 않아도 되는 방법을 사용하는 게 좋을 것 같습니다.

그리고 이번에는 편의를 위해 SQS를 사용하였지만, 대기열에 오직 하나의 서비스만 연결되는 경우 대기열 방식이 비효율적일 수 있으므로 이를 사용하지 않는 게 빠를 듯합니다.