목차
2019-09-26
|
해당 실습 아키텍처는 Cloud9을 이용하여 Lambda 함수 코드와 SAM Template을 만들어 API를 하나 배포하는 실습을 진행합니다. |
문서 URL: https://cdk.awsdemo.kr/devops301lab1
소스코드를 만들고 CodeCommit에 반영하면, CodePipeline에 의해서 CodeBuild로 코드를 가져와서 빌드하여 아티팩트를 생성합니다.
해당 아티팩트는 Cloudformation을 이용하여 배포를 하고, SAM Template에 기술되어져 있는 배포 방법으로 배포합니다.
이 과정을 CodeDeploy를 통해서 확인하고 롤백하는 방법을 살펴 봅니다.
개발통합환경은 AWS Cloud9을 이용합니다. 개발을 위해서 별도의 개발 서버를 할당 받거나 서버에 런타임 설정을 할 필요가 없습니다.
해당 실습은 Node.js 언어를 이용해서 Lambda 함수를 개발하며, 인프라는 SAM Template을 활용합니다.
아래와 같은 이름을 가지는 버킷을 생성합니다. 숫자가 들어가는 부분은 본인 전화 번호로 대체 해서 입력합니다. 해당 버킷은 Seoul (ap-northeast-2) Region에 만들어져야 합니다. 설정이 완료되면 우측 하단의 Create Bucket 버튼을 클릭합니다.
aws301-devops- 01012345678 |
Cloud9에서 CodeCommit 접근을 하기 위해서 Cloud9 하단의 Terminal에서 다음과 같은 설정을 수행하고 체크인 한 후 해당 디렉토리로 이동합니다.
git config --global credential.helper '!aws codecommit credential-helper $@' git config --global credential.UseHttpPath true git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/AWS301Repo cd ./AWS301Repo/ |
해당 폴더로 이동한 다음 index.js Lambda 소스 코드를 만들겠습니다. Terminal에서 vim으로 만드셔도 되고, Cloud 9의 IDE를 이용하여 만들 수도 있습니다. 여기서는 Cloud 9의 IDE를 이용해 보겠습니다. 좌측 상단에서 작업을 위한 폴더로 이동하여 파일을 생성합니다.
파일 이름은 index.js 로 생성합니다. 그리고 더블 클릭을 통해서 파일을 열어 줍니다. 우측 탭에 해당 파일이 표시가 됩니다. (아무것도 없는 상태로 열립니다.)
→
Cloud 9 편집창에서 다음의 코드를 복사하여 붙여 줍니다. (vim 에디터를 이용해서 소스코드를 붙이고 저장하셔도 됩니다.) 그리고 Mac의 경우 Command + S, Windows의 경우 Ctrl + S 단축키로 해당 파일을 저장합니다.
"use strict"; exports.handler = async (event) => { console.log("request: " + JSON.stringify(event)); let message = { message: "Hello, AWS!" }; let response = { statusCode: 200, body: JSON.stringify(message) }; return response; }; |
1. vim이 실행되고, 최초 키보드에서 i 키를 클릭하면, 커서 위치에서 "Insert" 가능한 모드가 됩니다. 만약 실수를 했을 경우, esc 키를 누르고 편집 모드를 빠져나와서 :q! 명령을 통해서 빠져 나온 다음 위 과정을 다시 실행하세요. |
Lambda 함수와 매핑될 API Gateway를 포함한 template.yml SAM 템플릿을 생성합니다. 파일의 편집이 끝나면, 항상 파일을 저장합니다.
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS DevOps 301 Demo Application Resources: ApiAppFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs14.x Timeout: 5 Events: RootHandler: Type: Api Properties: Path: / Method: GET |
Lambda 함수가 정상 동작하는지 테스트를 해 보겠습니다. Cloud 9에서 하단의 터미널 창에서 AWS301Repo 폴더로 이동하고, 다음과 같이 테스트 합니다.
ec2-user:~/environment $ cd AWS301Repo/ ec2-user:~/environment/AWS301Repo (master) $ sam local invoke |
창 하단에 정상적인 Response 가 나오는 것을 확인할 수 있습니다.
Lambda 함수 파일과, SAM template 2개의 파일을 직접 만들었습니다. 해당 파일을 CodeCommit 리포지토리에 체크인 합니다.
git add . git commit -am "Initial commit" git push origin master |
Build를 위한 project를 생성합니다. Project name은 AWS301Build, Environment image는 Managed image 를 선택하고, OS는 Ubuntu 를 선택합니다. 나머지는 동일하게 선택하고, Additional configuration에서 Timeout을 5분으로 변경합니다. Buildspec 은 Insert build commands를 선택하고 Switch to editor를 클릭하여 아래의 buildspec 코드를 추가합니다.
반드시 아래 버킷 이름은 시작할 때 생성한 S3 버킷 이름과 동일하게 변경하세요. |
version: 0.2 phases: install: runtime-versions: nodejs: 14 post_build: commands: - aws cloudformation package --template-file template.yml --s3-bucket aws301-devops-이부분을바꾸셔야합니다 --output-template-file api-output.yml --region $AWS_DEFAULT_REGION artifacts: type: zip files: - template.yml - api-output.yml |
이 Role은 CloudFormation이 사용할 것이므로 아래와 같이 AWS service 를 선택하고, CloudFormation 을 선택하고 Next: Permissions 버튼을 클릭합니다.
실습의 효율을 위해 AdministratorAccess 정책을 부여합니다. (실습을 위함입니다) Next: Tags 버튼을 클릭합니다. 다음 화면에서 Next: Review 를 클릭합니다.
Role Name에는 AWS301-DevOps-CloudFormation-Role 을 입력하고 Create role 버튼을 클릭합니다.
아래와 같이 Canary 배포를 위한 코드를 넣고 Ctrl +s 를 눌러 저장합니다. 5분간 10퍼센트의 트래픽만 변경된 버전으로 흐릅니다.
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS DevOps 301 Demo Application Resources: ApiAppFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs14.x Timeout: 5 AutoPublishAlias: live DeploymentPreference: Enabled: true Type: Canary10Percent5Minutes Events: RootHandler: Type: Api Properties: Path: / Method: GET |
아래와 같이 변경된 코드를 체크인 합니다.
git add . git commit -am "Canary deploy" git push origin master |
코드가 체크인 되면 CodePipeline은 자동으로 CI/CD 작업을 수행합니다. 배포가 진행되는 동안 ExecuteChangeSet은 대기를 하게 됩니다.
Canary 배포가 정상적으로 되는지 확인합니다. 배포가 진행중이면 클릭합니다.
배포가 진행중인 것을 확인할 수 있습니다.
Cloud9에서 정상적으로 API가 동작하는지 살펴 봅니다. 아래와 같은 명령을 수행합니다. API 주소는 본인이 배포된 URL로 변경합니다.
for ((i=1;i<=100;i++)); do curl "https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod"; echo ; sleep 0.1; done |
5분이 지나면, 배포가 모두 완료되고 트래픽은 새로운 버전으로 100% 전환됩니다.
CodeDeploy가 배포되는 중에 Stop and roll back deployment 버튼을 클릭하여 배포가 중단되도록 테스트 해 보세요.
Code 서비스를 이용한 서버리스 서비스 CICD 배포 프로세스를 만들 수 있게 되었습니다.
이제 추가 비용 방지를 위해서 스택을 정리합니다.