본문 바로가기

STUDY/AWS

AWS - 마이크로 서비스, API Gateway

- 마이크로 서비스란?

모든 요소를 하나의 애플리케이션에 구축하는 전통적인 모노리틱 접근 방식 대신 애플리케이션을 상호 독립적인 최소 구성 요소로 분할하고, 모든 요소가 독립적이며 동일한 작업을 수행하기 위해 함께 작동하는 방식이다.

 

- 마이크로 서비스 특징

1. 편리한 엑세스

하나의 큰 애플리케이션을 더 작은 조각으로 분할해서, 개발자들이 각 조각을 파악하고 업데이트하며 개선하기가 보다 편리해졌다.

이로 인해 애자일 방식과 결합할 경우 개발 주기를 더욱 가속화 할 수 있다.

 

2. 향상된 개방성

다중 언어 지원 API를 사용해서, 개발자들은 필요한 기능에 맞는 최적의 언어와 기술을 자유롭게 선택할 수 있다.

 

3. 간단한 배포

마이크로 서비스 기반 애플리케이션은 기존의 방식보다 더욱 모듈화되고 규모가 작아져서, 배포에 따르는 우려 사항들이 많이 사라졌다.

 

- API 게이트웨이란?

API 게이트웨이는 HTTP 프로토콜을 이용하여 API를 개발자가 손쉽게 구축할 수 있는 완전 관리형 서비스이다.

게이트웨이라는 단어의 의미에 맞게 외부 컴퓨터, IOT 디바이스등을 AWS 서비스들과 이어주는 역할을 주로 담당한다.

주로 람다와 결합되어 마이크로서비스 아키텍처로 유용하게 사용되는데 가장 일반적인 서비스로는

API 게이트웨이를 통헤 HTTP 통신의 헤더와 본문을 받고, 람다에서 데이터를 처리한 후 JSON으로 반환하여 다시 API 게이트웨이에서 HTTP 프로토콜에 맞게 응답 메시지를 보내줄 때 자주 사용된다.

 

API 게이트웨이를 사용하면, API를 다양한 언어로 작성할 수 있다.

또한 마이크로서비스이기 때문에 전체 소스코드를 변경하지 않고 모듈화된 개별 소스코드만 수정하면 되는 장점이 있다.

 

- 실습 (API 게이트웨이를 이용한 DynamoDB 연동)

 

API 게이트웨이 GET 파라미터를 이용해 요청 값 로그를 출력해보고 확인해보자

 

API 게이트웨이용 람다 함수 생성을 위해 AWS 콘솔에서 Lambda 대시보드로 이동해 함수 생성을 클릭한다.

함수의 이름은 lambda_for_apigateway_get 으로 설정하고 런타임은 Nodejs로 선택한다.

nodejs의 버전은 상관없다.

그 후 아래의 기본 실행 역할 변경 메뉴에서 AWS 정택 템플릿에서 새 역할 생성을 누른 후 

역할 이름은 role_for_apigateway_get으로 정책 템플릿은 Lambda@edge 권한을 설정한 후 함수 생성을 클릭한다.

 

함수가 생성되면 상단의 트리거 추가 버튼을 눌러 트리거 구성 페이지로 들어간다.

새 API 생성 버튼을 누른 후 보안은 열기로 설정한 뒤 추가를 클릭한다.

API 유형은 REST API를 선택한다.

트리거가 완성이 되면 구성 메뉴의 트리거를 통해 현재 구성하고있는 트리거를 볼 수 있다.

API 게이트웨이의 엔드포인트를 확인할 수 있다.

이제 다이나모 DB와의 연동을 위해 권한을 부여해야 하기때문에 구성 - 권한 - role_for_apigateway_get을 클릭한다.

역할 링크 클릭

정책 설정 페이지에서 정책 연결을 클릭한 후 DynamoDB에 관한 엑세스를 연결해 준다.

정책 연결 클릭
편한 실습을 위해 FullAccess를 연결하거나 본인이 직접 권한을 만들어도 좋다.

이제 연동될 다이나모 DB를 생성하기 위해 다이나모DB 대시보드로 이동해 테이블 만들기를 클릭한다.

위 사진처럼 설정 후 생성 버튼 클릭

DB가 생성이 완료되면 람다로 돌아가 함수의 코드를 수정해야한다.

//aws-sdk를 불러옵니다.
const AWS = require('aws-sdk')
//다이나모디비 클라이언트를 초기화합니다.
const dynamodb = new AWS.DynamoDB.DocumentClient()


exports.handler = async (event) => {

    //리턴할 값을 선언합니다.
    let response

    //queryStringParameters즉 GET값들이 들어오는지 들어온다면 id가 있는지 체크합니다.
    if (!event.queryStringParameters || !event.queryStringParameters.id) {
        response = {
            statusCode: 400,
            body: JSON.stringify("id가 없습니다."),
        }
        return response
    } else {
        let params = {
            Item:{
                id:event.queryStringParameters.id,
                data: event.queryStringParameters
            },
            TableName: "dynamo_apigateway_query",
        }
        await dynamodb.put(params).promise().catch(e => {
            response = {
                statusCode: 500,
                body: JSON.stringify("에러가 발생하였습니다:" + e),
            }
            return response
        })

        response = {
            statusCode: 200,
            body: JSON.stringify("데이터가 성공적으로 저장되었습니다.."),
        }
        return response

    }
}

다음과 같이 코드를 수정 및 저장한 후 API 게이트웨이의 엔드포인트로 접속한다.

파라메터를 입력하면 저장이 되는 것을 확인할 수 있다.
dynamoDB에 자동으로 저장된 모습