본문 바로가기
CLOUD/AWS

CI/CD를 위한 serverless appllication - AWS SAM 생성

by Rainbound-IT 2021. 8. 23.
반응형

CI/CD를 위한 serverless application을 만들것입니다.

 

 

# 개요

제가 생각하는 이번 프로젝트의 아키텍처입니다.(맞는지 틀린지는 잘 모릅니다 ㅎ)

 

우선 SAM을 이용하여 API gateway와 lambda를 SAM을 통해 만들고 도커로 로컬에서 돌려봅니다.

그게 됐다면 AWS에 수동으로 코드를 올린뒤

pipeline을 만들어 CI/CD를 구성할 것입니다.
마지막으로 canary 배포 구성을 하여 롤백테스트를 할 것입니다.



AWS SAM은 명령줄 도구인 AWS SAM CLI를 제공하므로 서버리스 애플리케이션을 쉽게 생성하고 관리할 수 있습니다. 특히 Hello World 애플리케이션의 초기 골격을 생성하므로 새 프로젝트의 스캐폴딩을 쉽게 만들어 기본으로 사용하고 거기에서 프로젝트를 계속 빌드할 수 있습니다.





방금 만든 Hello World SAM 프로젝트는 배포 시 다음 아키텍처를 만듭니다. 여기에는 /hello 리소스를 노출하고 HTTP GET 요청과 함께 호출될 때 Lambda 함수를 호출하는 API 게이트웨이인 단일 Lambda 함수가 있습니다. Lambda 함수는 예를 들어 데이터베이스와 같은 다른 AWS 리소스와 상호 작용할 수 있는 권한을 가질 수 있는 IAM 역할을 맡습니다.




# 애플리케이션 아키텍처



# SAM tamplate 살펴보기



SAM 템플릿이 CloudFormation 템플릿의 확장이기 때문에 구문이 AWS CloudFormation과 정확히 비슷하다는 것을 알 수 있습니다. 즉, CloudFormation에서 선언할 수 있는 모든 리소스는 SAM 템플릿에서도 선언할 수 있습니다. 템플릿의 구성 요소를 자세히 살펴보겠습니다.
## Transform


오픈소스를 준수한다라는 뜻이라는..


## Globals


모든 서버리스 기능 및 API에 공통적인 속성 정의. 
여기서는 이 프로젝트의 모든 함수에 기본시간제한이 3초로 정해져있습니다.

## hello world function



다음 섹션에서는 IAM 실행 역할이 있는 Lambda 함수를 생성합니다. 또한 이 Lambda 함수의 코드가 hello-world라는 폴더 아래에 있고 진입점이 app.js라는 파일 내의 lambdaHandler라는 함수임을 지정합니다.
IAM 역할은 명시적으로 지정되지 않았습니다. 이는 SAM이 기본적으로 새 역할을 생성하기 때문입니다. Role 매개변수를 지정하여 이 동작을 재정의하고 고유한 역할을 전달할 수 있습니다.

## Event Triggers



이 섹션은 함수 정의의 일부이며 Lambda 함수를 트리거할 다양한 이벤트를 지정합니다. 이 경우 HTTP 메서드 GET에서 수신 대기하는 /hello의 엔드포인트가 있는 API 게이트웨이로 이벤트를 지정합니다.

## Output



출력 섹션은 선택 사항이며 다른 CloudFormation 스택으로 가져오거나(교차 스택 참조를 생성하기 위해) CloudFormation 콘솔에서 단순히 볼 수 있는 출력 값을 선언합니다. 이 경우 API Gateway 엔드포인트 URL, Lambda 함수 ARN 및 IAM 역할 ARN을 출력으로 사용하여 더 쉽게 찾을 수 있도록 합니다.


# Lambda code 살펴보기




핸들러는 이벤트를 처리하는 Lambda 함수의 메서드입니다. 함수를 호출하면 런타임에서 핸들러 메서드를 실행합니다. 핸들러가 종료되거나 응답을 반환하면 다른 이벤트를 처리하는 데 사용할 수 있게 됩니다. 이 경우 람다 핸들러는 SAM template.yaml에 지정된 람다 핸들러 함수입니다.

Lambda 핸들러는 모든 호출에서 실행되기 때문에 모범 사례는 핸들러 범위 외부의 호출에서 재사용할 수 있는 코드를 배치하는 것입니다. 일반적인 예는 핸들러 외부에서 데이터베이스 연결을 초기화하는 것입니다.
이벤트 개체

핸들러 함수에 전달된 첫 번째 인수는 호출자의 정보를 포함하는 이벤트 객체입니다. 이 경우 호출자는 HTTP 요청 정보를 JSON 형식의 문자열로 전달하는 API Gateway이고 Lambda 런타임은 이를 객체로 변환합니다. 

컨텍스트 개체

두 번째 인수는 호출, 기능 및 실행 환경에 대한 정보를 포함하는 컨텍스트 개체입니다. CloudWatch 로그 스트림 이름이나 함수의 남은 실행 시간과 같은 정보를 얻을 수 있습니다.

핸들러 응답

API Gateway는 핸들러가 statusCode 및 본문을 포함하는 응답 객체를 반환할 것으로 예상하지만 선택적 헤더를 포함할 수도 있습니다.


# Reference
lambda event payload 예시
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/lambda-services.html

 

다른 서비스와 함께 AWS Lambda 사용 - AWS Lambda

다른 서비스와 함께 AWS Lambda 사용 AWS Lambda는 함수를 호출하기 위해 다른 AWS 서비스와 통합됩니다. 리소스 수명 주기 이벤트에 대응하여 함수를 호출하거나, 수신 HTTP 요청에 응답하거나, 대기열

docs.aws.amazon.com

 

 

이 문서를 보고 실습을 하였습니다.

https://cicd.serverlessworkshops.io/javascript.html

 

Javascript/Node.js Workshop ::

CI/CD for NodeJS Serverless Applications Follow this workshop if you want to build a SAM application with Javascript (NodeJS).

cicd.serverlessworkshops.io

 

반응형

'CLOUD > AWS' 카테고리의 다른 글

AWS에 수동 배포(SAM)  (0) 2021.08.23
로컬에서 프로젝트 실행(SAM)  (0) 2021.08.23
AWS SAM(Serverless Application Model)  (0) 2021.08.23
AWS 지역(region)에 따라 속도가 다름  (0) 2021.08.20
AWS ELB(Elastic Load Balancing)  (0) 2021.08.18

댓글