...
펼치기 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||
|
펼치기 | ||
---|---|---|
| ||
2021-04-12
2019-09-26
|
...
Lambda 함수 파일과, SAM template 2개의 파일을 직접 만들었습니다. 해당 파일을 CodeCommit 리포지토리에 체크인 합니다.
코드 블럭 language bash theme DJango title 코드 체크인 git add . git commit -am "Initial commit" git push origin master
- CodeCommit 서비스의 AWS301Repo에 해당 코드가 코드 체크인 여부를 확인합니다.
...
CodePipeline 생성
- 배포 파이프라인을 생성합니다. AWS 관리콘솔에서 CodePipeline 서비스로 이동하고 Create pipeline 버튼을 클릭합니다.
...
- Step 1에서 Pipeline name은 AWS301-Pipeline 을 Service role은 New service role 을 체크하고 Next 버튼을 클릭합니다.
- Step 2에서 Source provider는 AWS CodeCommit , Repository name은 AWS301Repo , Branch name은 master 로 선택하고 Next 버튼을 클릭합니다.
...
- Step 3에서 Build 환경을 구성합니다. Build provider는 AWS CodeBuild 를 선택하고, 하단의 Create project 버튼을 클릭합니다.
...
Build를 위한 project를 생성합니다. Project name은 AWS301Build, Environment image는 Managed
...
image 를 선택하고, OS는
...
Ubuntu 를 선택합니다. 나머지는 동일하게 선택하고, Additional configuration에서 Timeout을 5분으로 변경합니다.
...
Buildspec 은 Insert build commands를 선택하고 Switch to editor를 클릭하여 아래의 buildspec 코드를 추가합니다.
경고 반드시 아래 버킷 이름은 시작할 때 생성한 S3 버킷 이름과 동일하게 변경하세요.
코드 블럭 language yml theme RDark title buildspec yaml 파일 linenumbers true 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
...
- 성공적으로 Build project가 생성되면 자동으로 아래와 같이 구성됩니다. Next 버튼을 클릭합니다.
...
- Step 4의 배포 파이프라인은 추후 생성할 예정이므로 Skip deploy stage 버튼을 클릭합니다. 팝업 출력시 Skip 버튼을 클릭합니다.
...
- Step 5의 Review 화면에서 확인 후, Create pipeline 버튼을 클릭합니다.
...
CodePipeline 동작 확인
- CodePipeline이 Source에서 코드를 받아서 Build로 넘어가는 과정을 확인할 수 있습니다. 좌측 녹색은 완료, 파란색은 진행중, 붉은 색은 에러를 의미합니다.
...
- 기다리면, Build 과정에서 에러가 발생하게 됩니다. 해당 에러가 발생하는 원인을 찾기 위해서 Details 를 클릭합니다.
...
- 좀 더 상세한 확인이 필요하기 때문에 Link to execution details 를 클릭합니다.
- Build logs를 확인한 결과 Code Build에서 만들어진 아티팩트를 S3 버킷에 업로드(PutObject) 수행하려는 순간 권한이 없어서 AccessDenied 에러가 발생한 것을 확인할 수 있습니다.
즉, CodeBuild에게 부여되어 있는 Role에 S3로 접근할 수 있는 권한을 추가하면 됩니다.
...
- 정책을 추가하기 위해 AWS 관리 콘솔의 IAM 서비스로 이동하고, CodeBuild에 부여된 Role을 찾고, 기존 Policy에서 Edit policy 버튼을 클릭합니다.
...
- 아래와 같이 Add ARN을 통해 해당 버킷에 대한 정보를 입력합니다.
...
- ARN 정보는 다음과 같이 입력합니다. arn:aws:s3:::aws301-devops-
...
- 01012345678/* 여기서 계정번호에 따라서 다르게 입력하셔야 합니다. Add 버튼을 클릭합니다.
...
- 다음과 같이 설정이 되었으면 Review policy 버튼을 클릭합니다.
...
- Save changes 버튼을 클릭하여 저장합니다.
...
- 다시 CodePipeline 재가동합니다. Pipeline에서 Build Stage의 우측 상단의 Retry 버튼을 클릭합니다.
...
- 아래와 같이 재기동 되는 걸 볼 수 있습니다.
...
- 정상적으로 구동되는 모습을 볼 수 있습니다.
...
배포를 위한 Role 생성
- CloudFormation을 통해서 배포를 하기 위해서는 Role이 필요합니다. IAM 서비스로 이동한 다음 Create Role 버튼을 클릭합니다.
이 Role은 CloudFormation이 사용할 것이므로 아래와 같이 AWS service 를 선택하고, CloudFormation 을 선택하고 Next: Permissions 버튼을 클릭합니다.
...
Role Name에는 AWS301-DevOps-CloudFormation-Role 을 입력하고 Create role 버튼을 클릭합니다.
배포를 위한 파이프라인 수정
- 배포를 수행하도록 파이프라린을 수정합니다. Edit 버튼을 클릭합니다.
...
- 파이프라인 하단의 + Add Stage 버튼을 클릭합니다.
- 팝업에서 Stage name에는 Deploy 를 입력하고, Add stage 버튼을 클릭합니다.
- + Add action group 버튼을 클릭합니다.
- 팝업이 열리면, 아래와 같이 Action group을
...
- 추가합니다. Action name은 CreateChangeSet , Stack name은 AWS301-DevOps-prod 이며, 아직 생선 전이기 때문에 찾기에 활성화 되어 있지 않으므로 직접 복사해서 붙여 넣으세요.
- 바로 하단에 + Add action group 버튼을 클릭합니다.
- 아래와 같이 ExecuteChangeSet 을 하나 생성합니다.
- 배포 파이프 라인 생성 작업이 완료되었습니다. 상단의 Save 버튼을 클릭합니다.
- 팝업이 열리면, Save 버튼을 클릭합니다.
파이프라인 실행
- 파이프라인의 Release change 버튼을 클릭하여 파이프라인을 재실행합니다.
- 팝업이 열리면 Release 버튼을 클릭합니다.
- 다시 배포 파이프라인을 따라서 아래와 같이 배포가 진행되는 것을 볼 수 있습니다.
...
-
- 배포가 완료되면 CloudFormation을 통해서 API가 배포된 Endpoint URL을 확인하여 테스트 합니다. ExecuteChangeSet의 Details 버튼을 클릭하여 배포 결과물을 확인합니다.
API Gateway 접속 테스트
CloudFormation에 배포 결과물 확인
- 아래와 같이 CloudFormation에 배포 Stack이 추가된 것을 확인할 수 있습니다. Resources 탭을 클릭하고 하단의 ServerlessRestApi 로 기재된 우측의 파란색 링크를 클릭하여 새창을 엽니다.
...
API Gateway의 배포 URL 확인
- 배포되어 있는 API를 선택하고 Stages 탭으로 이동합니다. Prod 스테이지를 클릭하면 배포되어 있는 Invoke URL 을 확인할 수 있습니다. 해당 URL을 클릭합니다.
...
- 아래와 같이 메시지가 나오는 것을 확인할 수 있습니다.
...
Canary 배포 적용
코드 수정
Lambda 코드 수정
- Lambda 코드를 수정하여 새로운 버전의 API를 만들어 보겠습니다. Cloud9에서 index.js 파일을 열고 기존 "Hello, AWS!"를 " Hello, DevOps! "로 변경합니다. Ctrl + S 를 눌러 저장합니다.
...
SAM 템플릿 수정
아래와 같이 Canary 배포를 위한 코드를 넣고 Ctrl +s 를 눌러 저장합니다. 5분간 10퍼센트의 트래픽만 변경된 버전으로 흐릅니다.
코드 블럭 language yml theme RDark title Canary 배포를 위한 SAM 템플릿 수정 linenumbers true 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
변경된 코드 체크인
아래와 같이 변경된 코드를 체크인 합니다.
코드 블럭 language bash theme DJango title 변경된 코드 체크인 git add . git commit -am "Canary deploy" git push origin master
CodePipeline에서 배포 상황 확인
코드가 체크인 되면 CodePipeline은 자동으로 CI/CD 작업을 수행합니다.
배포가 진행되는 동안 ExecuteChangeSet은 대기를 하게 됩니다. 이때, Canary 배포가 진행중이므로 아래로 내려가서 트래픽이 바뀌는지 테스트를 진행합니다.
CodeDeploy 서비스에서 확인
Canary 배포 확인
- 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 버튼을 클릭하여 배포가 중단되도록 테스트 해 보세요.
CleanUp
Code 서비스를 이용한 서버리스 서비스 CICD 배포 프로세스를 만들 수 있게 되었습니다.
...