[AWS] Lambda 이용하여 S3 데이터 읽어오기

Serin Yoon·2021년 7월 29일
1

Backend

목록 보기
3/5
post-thumbnail

1. AWS S3 bucket 생성

Amazon S3 - 버킷 - 버킷 만들기 를 통해 버킷을 생성한다.
버킷 이름을 작성하고, AWS 리전을 설정하고(서울), 모든 퍼블릭 액세스 차단 설정을 해두었다.
버킷 버전 관리, 태그, 기본 암호화, 고급 설정은 건드리지 않았다.

버킷 내에 carData 폴더를 생성했다. (선택사항!)

  1. carData에 PNG 파일이나 JSON 파일이 들어오면
  2. Lambda 함수를 통해 데이터를 읽어오고,
  3. DynamoDB에 저장하고자 한다.

(DynamoDB에 저장하는 작업은 아직 하지 않았다 🙂)

테스트를 위해 미리 PNG 파일과 JSON 파일을 넣어두었다.

2. AWS Lambda 생성

AWS Lambda - 함수 생성 - 블루프린트 사용 - s3-get-object-python 을 통해 Lambda를 생성하였다.

블루프린트를 사용하게 되면 AWS에서 제공하는 기본 템플릿 코드를 사용할 수 있다.
(물론 나는 코드를 거의 다 수정했다 😅)

S3 트리거 부분에서 아까 생성한 S3 버킷을 선택한다. 이벤트 유형은 '모든 객체 생성 이벤트'로 하였고, 이외의 설정은 건드리지 않았다.

Lambda가 성공적으로 생성되면 이렇게 된다. 만약 상단에 에러 문구가 뜬다면 동일한 이름의 Lambda를 이전에 생성했기 때문이거나, 이미 S3에 연결된 Lambda가 있기 때문이다. 따라서 S3에 걸린 Lambda가 있다면 삭제하고, 겹치는 Lambda가 있다면 삭제한다.

3. 코드 작성

코드 소스 부분으로 이동해서 lambda_function 코드를 수정했다.
코드 안에 lambda_handler 함수가 없으면 에러가 발생한다.
Test를 하기 위해 테스트 이벤트를 구성했다.

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "ap-northeast-2",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "example-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::example-bucket"
        },
        "object": {
          "key": "test/key",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

코드

import boto3

ACCESS_KEY = {IAM Access Key 입력}
SECRET_KEY = {IAM Secret Access Key 입력}
BUCKET_NAME = {S3 Bucket 이름 입력}
URI = {S3 uri 입력}

resource = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY
)

bucket = resource.Bucket(BUCKET_NAME)

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY
)

bucket = s3.Bucket(BUCKET_NAME)

def lambda_handler(event, context):
    print("< 파일 목록 >")
    for obj in bucket.objects.filter(Prefix = "carData/"):
        key = obj.key
        print(key)
        
        if key.endswith('.png'):
            imgName = key
            imgURL = URI + imgName
        elif key.endswith('.json'):
            jsonName = key
            jsonURL = URI + jsonName
            jsonData = bucket.Object(jsonName).get()['Body'].read().decode('utf-8')
    
    print("< IMG 정보 >")
    print("파일명:", imgName)
    print("파일경로:", imgURL)
    
    print("< JSON 정보 >")
    print('파일명:', jsonName)
    print("파일경로:", jsonURL)
    print("세부정보:", jsonData)

코드를 실행해보려면 Deploy 버튼을 눌러 먼저 저장한 후, Test 버튼을 누르면 된다.
만약 타임에러가 난다면, 구성 - 일반 구성 - 편집 을 통해 제한 시간을 적당히 늘리면 된다.

결과

📌 앞서 언급한 문제 외의 문제들은 IAM 계정의 Lambda 혹은 S3 관련 권한과 관련한 문제일 가능성이 높다!

profile
티스토리로 이사했습니다 🏠

0개의 댓글