AWS Lambda 사용하여 S3 bucket에 데이터 업로드 자동화하기
이번 포스팅 주제는 AWS(Amazon Web Services) Lambda를 사용하여 주기적으로 S3 bucket에 데이터를 업로드하는 방법입니다.
제가 AWS 초보라서.. 틀린 점 있으면 댓글로 알려주세요.
방법은 크게 4가지로 구성됩니다.
1. S3 Bucket 생성
2. IAM 설정
3. Lambda 함수 생성
3-1. Lambda 함수 레이어 생성 및 추가
4. CloudWatch Events 생성
5. 동작 확인
1. S3 Bucket 생성
버킷 생성 방법은 다른 포스팅도 많아서 생략하겠습니다.
2. IAM 설정
람다 함수의 접근 권한을 지정해주기 위해 IAM 역할을 생성합니다.
AWS 콘솔에서 IAM에 들어가 액세스 관리 > 역할 > 역할 만들기를 선택합니다.
밑에 이미지와 같이 선택합니다.
이제 권한을 추가합니다.
제 람다 함수의 목적은 S3에 접근해야하고, CloudWatch Events를 사용하기 때문에
두 기능에 대한 FullAccess 정책들을 추가해줍니다.
IAM의 역할 이름과 설명을 추가합니다.
람다를 위한 IAM이 만들어진 것을 확인할 수 있습니다.
3. Lambda 함수 생성
이제 AWS Lambda 함수를 생성할 차례입니다.
AWS 콘솔에서 Lambda에 들어가 함수 > 함수 생성 을 선택합니다.
함수 이름을 작성하고 런타임, 아키텍처를 선택합니다.
저는 로컬 환경에 맞게 Python 3.8 버전을 선택하였습니다.
그리고 실행 역할은 기존 역할 사용을 선택하여 아까 만든 IAM을 선택합니다.
그럼 함수가 생성된 겁니다.
함수의 코드를 구성할 수 있고 배포 및 테스트가 가능합니다.
테스트 시 출력 이벤트 또한 선택할 수 있습니다.
가장 기본은 아래 이미지와 같은 ‘Hello-lambda’ 형태입니다.
이제 이 람다 함수를 S3와 연결시킬 것입니다.
함수 개요에서 트리거 추가를 선택합니다.
트리거 구성에서 S3를 선택하고 원하는 버킷을 선택합니다.
저는 코드 내에서 조건이 걸려있어 접두사 및 접미사는 따로 선택하지 않았습니다.
S3까지 연결이 되면 코드를 테스트 해 볼 시간입니다.
코드 테스트 시 테스트 이벤트를 구성할 수 있습니다. 이벤트의 JSON 형식을 지정할 수 있는데요.
저는 S3에 데이터를 업로드(put)하는 코드이기 때문에 AWS에서 제공해주는 템플릿 중 s3-put을 사용하였습니다.
작성된 코드를 Test 해봅니다.
에러가 발생했습니다. 'request' 모듈이 없다는 에런데요.
Lambda의 런타임 환경에 이렇게 라이브러리가 없는 경우가 있답니다.
이럴 때를 위해서 해당 함수를 위한 환경을 구성하는 ‘레이어(계층)’ 기능이 있습니다.
레이어에 원하는 라이브러리를 추가하여 함수와 함께 구성해주는 겁니다.
3-1. Labmda 함수 레이어 생성 및 추가
Lambda에서 계층 > 계층 생성을 선택합니다.
계층의 이름을 입력하고 라이브러리가 포함된 zip 파일을 업로드합니다.
이미지가 잘못됐는데, zip파일의 이름은 파이썬 런타임 기준 무조건 python이어야 합니다.
pip3 install {library} -t ./python
위의 명령어를 활용하여 필요한 패키지를 모두 설치한 뒤 zip파일로 압축합니다.
전 requests 패키지를 설치하였습니다.
그리고 런타임을 선택해주는데, 여기서 호환될 런타임 종류를 복수선택 해주는 게 좋습니다.
함수 중에서 계층을 선택하여 [Add a layer]를 선택하여 계층을 추가합니다.
계층 추가에서 사용자 지정 계층을 선택하여 만든 레이어를 추가합니다.
함수가 업데이트되고 코드 테스트를 해보니 성공한 것을 확인했습니다.
S3 버킷에 제대로 업데이트가 되었습니다.
이 함수를 자동으로 실행하기 위해 CloudWatch Events를 연동하겠습니다.
4. CloudWatch Events 생성
AWS 콘솔에서 CloudWatch Events에 접속하여 규칙 > 규칙 생성을 선택합니다.
저는 매일 동일한 시각에 람다 함수를 실행시킬 예정으로
이벤트 소스 중 일정을 선택하여 Cron 표현식으로 작성합니다.
대상은 만들어 둔 Lambda 함수를 선택합니다.
규칙이 생성됐습니다.
S3와 동일하게 Lambda 함수에서 트리거 추가로 CloudWatch Events 또한 추가해줍니다.
그럼 아래와 같이 S3와 CloudWatch Events가 연결된 것을 볼 수 있습니다.
5. 동작 확인
전 테스트를 위해 새벽 3시에 S3로 자동 업로드를 해놨는데 잘 동작했습니다.