본문 바로가기
[AWS]/Lambda

[AWS] S3에서 Lambda를 트리거 및 DynamoDB 테이블로 적재 -1

by METAVERSE STORY 2022. 10. 12.
반응형
728x170

 

 

S3에 파일이 업로드 되었을때 Lambda를 트리거하여 Dynamo DB에 적재하는 과정을 실습해보도록 하자.

해당 실습을 진행하기 위해서는 위와 같은 서비스가 필요하다.

 

 

 

[실습1] Lambda와 DynamoDB 연동

우선 Lambda와 DynamoDB 테이블과 데이터를 주고 받는 방법에 대해서 알아 보도록 하자.

우선 Dynamo DB를 생성해보도록 하자.

Create Table 버튼을 클릭하여 생성한다.

해당 실습은 새에 대한 데이터를 적재하는 실습이라 테이블 이름은 awesome-birds로 지정했지만, 원하는 테이블 이름으로 생성하면 된다.

Partition key는 해당 테이블에서 Primary Key와 같은 역할을 설정하는것인데, 해당 PK는 ID로 지정하고

Default Setting으로 생성한다.

테이블이 생성중이며,

 

 

다음으로 Lambda 함수를 생성한다.

Lambda도 대체로 기본적인 설정으로 생성한다.
IAM Role에는 DynamoDB Full Access, SQS Full Access, API Gateway invoke 등 이전에 실습했던 Role인데 필요한 Role이 거의 모두 추가 되어 있어 해당 Role을 재활용 하려고 한다.

Lambda를 생성하고 아래와 같이 코드를 편집한다.

import boto3 #boto3는 Python에서 AWS와 통신하기 위한 모든 SDK를 포함하고 있는 SDK이다.

TABLE_NAME = "awesome_birds" #DynamoDB의 Table명을 변수로 선언한다.
REGION = "ap-northeast-2" #현재 작업하고 있는 Region을 변수로 선언한다.

def lambda_handler(event, context):
    
    dynamodb = boto3.resource('dynamodb', region_name=REGION) #boto3에서의 리소스중에 DynamoDB를 받아서 dynamodb로 선언한다.
    table = dynamodb.Table(TABLE_NAME) #table은 위에서 선언한 dynamodb의 table 값을 가져온다.
    
    table.put_item(Item=event) #해당 table에 put item event로 받아서 한다.
    
    table.get_item(Key={'id':event['id']}) #해당 table에서 event에서 입력한 id를 키로 데이터를 조회한다.
    
    return response['Item']

 

코드를 모두 입력하고 Deploy를 진행한다.

 

 

 

 

다음으로 IAM Role에 대해서 편집을 진행하는데, 필자는 Lambda를 생성할때 이미 할당을 했기 때문에, Role에 Dynamo DB Access가 있는지만 확인하려고 한다

chatapp-lambda-role에서 

이미 Dynamo DB Full Access를 할당했기 때문에, 추가 작업을 진행하지는 않는다.

 

다음으로 Lambda에서 Test 환경을 구성해보자.

이렇게 해서 Test를 진행하면 되지만, 아쉽게도 에러가 발생했다.

리소스를 찾지 못하는 에러가 발생했는데,

여기서 Dynamo DB로 접속할수 있도록 Role에 정책을 더해주어야 한다.

우선 IAM으로 이동하여 사용하는 Role로 이동하도록 한다.

우측에 Create policy를 클릭하여 정책을 새로 만들도록 하자.

정책에서 Dynamo DB Table로 접속하고 읽을수 있도록 추가한다.

Dynamo DB를 선택하고 

Get Item과 PutItem을 선택한다.

 

다음으로는 리소스에서 ARN으로 특정 리소스를 선택하여 지정한다.

우선 Dynamo DB의 ARN을 먼저 확인해보자.

해당 ARN을 입력하면, 자동으로 Dynamo DB에 해당하는 정보가 입력된다.

Next를 눌러서 다음으로 넘어간다.

 

정책이 만들어졌으면, 이전에 IAM Role에 정책을 추가한다.

 

다음 다시 Lambda에서 Test를 시도해보자.

또 에러가 발생해서 한참 들여다 보니, 코드가 잘못 되었다...... 하이픈인데... 언더바를....

import boto3 #boto3는 Python에서 AWS와 통신하기 위한 모든 SDK를 포함하고 있는 SDK이다.

TABLE_NAME = "awesome-birds" #DynamoDB의 Table명을 변수로 선언한다.
REGION = "ap-northeast-2" #현재 작업하고 있는 Region을 변수로 선언한다.

def lambda_handler(event, context):
    
    dynamodb = boto3.resource('dynamodb', region_name=REGION) #boto3에서의 리소스중에 DynamoDB를 받아서 dynamodb로 선언한다.
    table = dynamodb.Table(TABLE_NAME) #table은 위에서 선언한 dynamodb의 table 값을 가져온다.
    
    table.put_item(Item=event) #해당 table에 put item event로 받아서 한다.
    
    response = table.get_item(Key={'id':event['id']}) #해당 table에서 event에서 입력한 id를 키로 데이터를 조회한다.
    
    return response['Item']

위와 같이 성공했다는 결과를 확인할수 있고,

DynamoDB Table에서 

우측 상단에 Explore table items를 클릭하면 

방금 내가 입력한 item이 정상적으로 적재되어 있는것을 확인할 수 있다.

 

 

 

 

 

 

[실습2] S3에서 Lambda로 DynamoDB에 데이터 적재

우선 S3를 만들도록 한다.

S3이름은 글로벌하게 유니크해야 하니 다른 이름으로 입력하길 바란다.

나머지 설정은 Default 세팅으로 하고 Create를 눌러서 생성하도록 한다.

생성이 완료 되었으면 Lambda로 이동해서 새로운 함수를 생성하도록 한다.

모든 설정은 default로 세팅하여 생성한다.

 

IAM Role에는 이전에 생성했던것을 이용했지만, 추가적으로 S3 Full Access도 부여하도록 하겠다.

다음으로는 이제 Lambda에 S3 Trigger를 달아서 S3로 데이터를 올리면 Lambda를 통해서 DynamoDB로 적재하도록 하겠다.

Lambda에서 Trigger로 이동하여

Trigger에 S3를 달도록 한다.

다음은 S3에 파일이 업로드 되었을때, Lambda에서 처리될 로직 코드를 작성하자.

import json
import boto3

def lambda_handler(event, context):
    filename = event['Records'][0]['s3']['object']['key'] #발생한 event의 첫번째 Object를 가져온다.
    
    s3 = boto3.resource('s3') #s3를 선언한다.
    file = s3.Object('awesome-birds-bucket-test-peter', filename).get() #s3에 내 버킷을 작성하고 그 데이터를 가져온다.
    
    file_content = json.load(file["Body"]) #해당 파일의 Body를 가져온다.
    
    dynamodb = boto3.resource('dynamodb') #DynamoDB를 선언
    table = dynamodb.Table('awesome-birds') #DynamoDB의 테이블을 선언
    
    for bird in file_content:
        table.put_item(Item=bird) #for문 루프를 돌면서 data를 put

여기서 정말 사소한 오류 때문에 시간을 많이 보냈다...
file = s3.Object <- Object로 작성해야 하는데 필자는 object로 작성해서.... 오류가 발생했었다.

 

다음으로는 아래 text를 txt 파일로 생성한다.

[
  {
    "id": "53cc4d34-155e-4283-a16f-0a0d2a28dde0",
    "canFly": true,
    "name": "eagle",
    "colors": [
      "brown",
      "white",
      "yellow"
    ]
  },
  {
    "id": "079b42b8-a1ab-11eb-bcbc-0242ac130002",
    "canFly": true,
    "name": "parrot",
    "colors": [
      "red",
      "yellow",
      "green",
      "blue",
      "white"
    ]
  },
  {
    "id": "fgji85sd-a1ab-11eb-bcbc-gdrgs4t3t34",
    "canFly": true,
    "name": "albatross",
    "colors": [
      "yellow",
      "black",
      "white"
    ]
  }
]

 

 

다음으로 S3에서 Upload 버튼을 클릭하고

 

드래그앤 드랍으로 파일을 업로드 한다.

파일이 업로드가 되었고 Lambda는 작업을 수행했을것이다.

CloudWatch에서 LogGroup으로 이동하면 내가 생성한 Lambda의 Log Group이 있을것이고,
해당 Log Group을 클릭하여 최근 로그로 들어가면

작업이 잘 수행 되었다는것을 확인할 수 있다.

다음으로 Dynamo DB로 이동해서 확인해보자.

데이터가 잘 적재되었음을 확인할 수 있다.
특정 id를 클릭하면

해당 데이터의 상세까지 확인할 수 있다.

 

출처 : 

https://www.youtube.com/watch?v=lgXtoCiPfdk 

https://www.youtube.com/watch?v=-x3A4DG0Kjw 

 

반응형
그리드형

'[AWS] > Lambda' 카테고리의 다른 글

[AWS] REST API Gateway와 Cognito & Lambda 연동  (0) 2022.11.14
[AWS] Lambda Request body validation  (0) 2022.10.12
[AWS] Lambda와 API Gateway 연동  (0) 2022.10.12

댓글