AWS lambda 로 S3에 주기적으로 데이터 업로드하기

AWS CLI 설치

Lambda에 코드를 배포할 용도로 AWS CLI를 설치해주자

pip3 install awscli --upgrade --user

AWS CLI에 사용할 사용자 권한 설정

Lambda에 코드를 배포하기 위한 권한으로 AWSCodeDeployRoleForLambda가 필요하다.

옵션으로 AWSLambdaFullAccess 가 있는데, 향후 람다 외의 서비스에 접근할 경우에 추가해뒀다.

“IAM 서비스 -> 사용자 -> 사용자 추가 -> 권한 추가” 순서를 따르면 권한 설정 페이지를 찾을 수 있다.

# ~/.aws/credentials
[default]
aws_access_key_id =  KEY_ID
aws_secret_access_key = SECRET_KEY

# ~/.aws/config
[default]
region = ap-northeast-2

KEY_IDSECRET_KEY 에 사용자 생성 시 제공하는 키 값을 넣어주자.

ap-northeast-2는 서울 리전을 가리킨다.

Lambda 및 버킷 생성하기

  1. 생성시 AWSLambdaExecute 권한을 선택하고 적절한 권한 이름을 만든다(예시: lambda-s3-role).

  2. 데이터를 저장할 버킷을 생성해둔다.

람다로 생성한 정보를 버킷에 저장하기

import boto3

Bucket = boto3.resource('s3').Bucket('Bucket')

def lambda_handler(event, context):
    Bucket.put_object(
        Key='hello.txt', Body='hello, world!')

boto3는 파이썬 전용 AWS SDK 모듈이다.

외부 패키지와 함께 배포하기

배포 패키지는 함수 코드 및 종속성이 포함되어 있는 ZIP 아카이브 파일입니다. (중략..) 코드에서 AWS SDK 이외의 라이브러리와 종속성을 포함하려면 배포 패키지를 생성해야 합니다. - AWS Lambda 배포 패키지(Python) - AWS Lambda

AWS lambda에서는 다른 서버리스 서비스과 달리 외부 패키지 설치 기능이 없다. 그래서 수동으로 압축 파일을 만들어 두고 aws-cli를 통해 올려둬야 한다.

pip install --target ./package jejunuMeals
zip -r9 ./function.zip ./package
zip -g function.zip lambda_function.py

위 코드 블럭에선 람다에 올리고 싶은 외부 패키지를 편의상 별도의 디렉터리 안에서 관리하도록 했다.

만든 압축 파일에 lambda_function.py를 추가하면 배포할 준비가 완료된다.

aws lambda update-function-code --function-name jejunu-meals --zip-file fileb://function.zip

혹시라도 이 부분에서 막혔다면 권한 설정을 다시 확인하기 바란다.

CloudWatch Events 설정

트리거 추가 -> CloudWatch Events -> cron(0 10 ? * MON *) (매주 월요일 GMT 10시)

cron 표기식은 유닉스 시스템의 그것과는 조금 다르다. ?, * 모두 와일드카드인데, ‘일’ 또는 ‘요일’ 필드 중 반드시 하나에 ?를 사용해야 된다.

무슨 말이냐면 요일 필드에 MON을 입력하고, 날짜 필드가 와일드 카드를 사용할 경우 * 대신 ?를 입력해야 된다는 말이다.

자세한 사항은 규칙에 대한 예약 표현식 - Amazon CloudWatch Events 문서를 참고 바란다

구현 예시

구현 예시는 BetaF1sh/aws-lambda-s3 저장소를 참고 바란다.

참고한 자료