AWS에서 DB에 있는 정보를 API로 수신 받고, 결과를 제공하는 서비스를 구현해야할 필요성이 생겼다. 찾아볼 수 있는 예제는 일부 있지만, 필자의 케이스에 정확히 맞는 것은 찾기 어려웠다. 이번 기회에 정리해두려고 한다.

 

 

AWS API 만들기

 


AWS에서 API 서비스를 하기 위해서 별도의 API서버를 만들 필요는 없다. AWS에서 제공하는 서비스로 충분히 구현이 가능하기 때문이다. AWS 람다와 API Gateway를 이용하면 된다. API 게이트웨이에서 AWS람다로 데이터를 전달하면, DB조회 후 결과를 반환하면 된다.

처음에는 S3에 데이터를 저장하고, boto3를 이용해서 쿼리를 날리려고 했다. 하지만, 이렇게 하니 연속되는 코드 상에서 쿼리 결과를 받지 못한 상태에서 다음 코드로 넘어가 에러가 발생했다.

그래서 AWS에서 제공하는 다이나모DB를 이용하기로 했다. 다이나모 DB를 만드는 법은 이곳저곳 찾아보면 내용이 잘 나와있다. 아래 페이지를 참조하는 것도 도움이 될 듯 하다.

( 참조: docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Introduction.html )

 

이제 람다로 다이나모DB를 조회하는 코드를 작성해야 한다. 작성 중에 헷갈렸던 건, 람다만 테스트했을 때는 결과가 잘 나왔는데 API Gateway를 연결하면 결과가 잘 안 나오는 것이다. 결국에는 람다 코드를 아래와 같이 수정하여 정상적으로 작동하는 것을 확인할 수 있었다.

 

import json
import time
import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):
    # Query result get
    try:
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table('test_table')
        cmdt_code = event["queryStringParameters"].get("test_code")
        response = table.query(KeyConditionExpression=Key('test_code').eq(test_code))
        res = response["Items"]
          
        result_code = "200"
        # result_msg = "정상처리"
        result_msg = [r["rec_cmdt_code"] for r in res]
        
    except Exception as e:
        result_code = "500"
        result_msg = str(e) + "|" + str(event["queryStringParameters"])
    
    return {
        'statusCode': result_code,
        'body': json.dumps(
            {"result_msg": result_msg},
        ),
        "headers":{ 'Access-Control-Allow-Origin' : '*' }
    }

 


여기서 결과코드는 AWS에서 정해준 코드로 넣어야 한다. 안 그러면 에러가 발생한다. API Gateway에 대한 설명은 아래 AWS페이지에서 찾아볼 수 있는데, 생각보다 읽기가 귀찮다.

( 참조: docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/getting-started.html )

 

 

오늘은 이렇게 AWS API 사용법 및 서비스 만드는 법에 대해서 알아보았다. 어렵지는 않았지만, 처음 하다보니 생각보다 시행착오가 많았다. 혹시 관련 내용이 필요한 분에게 시행착오를 덜 겪게 도움이 됐기를 바란다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">