유재석 솔루션즈 아키텍트, AWS
AWS Fargate와 Amazon ECS 활용한 CI/CD 모범사례
AWS Game Master 온라인 세미나
강연 중 질문하는 방법
Go to Webinar “Questions” 창에 자신이 질문한
내역이 표시됩니다. 기본적으로 모든 질문은
공개로 답변 됩니다만 본인만 답변을 받고 싶으면
(비공개)라고 하고 질문해 주시면 됩니다.
본 컨텐츠는 고객의 편의를 위해 AWS 서비스 설명을 위해 온라인 세미나용으로 별도로 제작, 제공된 것입니다. 만약 AWS
사이트와 컨텐츠 상에서 차이나 불일치가 있을 경우, AWS 사이트(aws.amazon.com)가 우선합니다. 또한 AWS 사이트
상에서 한글 번역문과 영어 원문에 차이나 불일치가 있을 경우(번역의 지체로 인한 경우 등 포함), 영어 원문이 우선합니다.
AWS는 본 컨텐츠에 포함되거나 컨텐츠를 통하여 고객에게 제공된 일체의 정보, 콘텐츠, 자료, 제품(소프트웨어 포함) 또는 서비스를 이용함으로 인하여 발생하는 여하한 종류의 손해에
대하여 어떠한 책임도 지지 아니하며, 이는 직접 손해, 간접 손해, 부수적 손해, 징벌적 손해 및 결과적 손해를 포함하되 이에 한정되지 아니합니다.
고지 사항(Disclaimer)
컨테이너와 CI/CD
컨테이너와 CI/CD
FROM node:12
WORKDIR /opt/app
COPY package.json package-lock.json ./
RUN npm ci
COPY ./app /opt/app
EXPOSE 80
CMD [ "node", "service.js" ]
컨테이너와 CI/CD
CI/CD 모범사례
3.
반복 가능한
인프라 변경
Repeatable
infrastructure
changes
1.
릴리스 자동화
Automated
releases
2.
안전한
배포
Safe
deployments
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한
배포
1억 9천만번의 배포
1억 9천만번의 배포
(매 초마다 6번의 배포)
소스
소스
App code
Infrastructure
as code
Configuration
Base image
소스 빌드
App code
Infrastructure
as code
Configuration
Base image
소스 빌드
Artifacts
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파
준비단계
Artifacts
Automated
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타
준비단계
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
…
소스 빌드 알파 베타 감마
준비단계 프로덕션
Artifacts
Automated
tests
Automated
integration
tests
Automated
load/perf
tests
Automated
integration
tests
Automated
synthetic
tests
API smoke
tests
Automated
browser
tests
App code
Infrastructure
as code
Configuration
Base image
…
파이프라인 방해물: 코드 커버리지, 코드 리뷰, 보안 검색, 의존성 업데이트, 시간대, 파이프라인 정책, 기타 여러가지
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
• Check-in source
code such as
.java files and
Dockerfile
• Peer review new
code
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
• Check-in source
code such as
.java files and
Dockerfile
• Peer review new
code
• Compile code
• Unit tests
• Style checkers
• Create container
images
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
• Integration tests
with other
systems
• Load testing
• UI tests
• Security testing
• Check-in source
code such as
.java files and
Dockerfile
• Peer review new
code
• Compile code
• Unit tests
• Style checkers
• Create container
images
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
• Integration tests
with other
systems
• Load testing
• UI tests
• Security testing
• Check-in source
code such as
.java files and
Dockerfile
• Peer review new
code
• Compile code
• Unit tests
• Style checkers
• Create container
images
• Deploy to
production
environments
• Monitor code in
production in
order to quickly
detect errors
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
• Integration tests
with other
systems
• Load testing
• UI tests
• Security testing
• Check-in source
code such as
.java files and
Dockerfile
• Peer review new
code
• Compile code
• Unit tests
• Style checkers
• Create container
images
• Deploy to
production
environments
• Monitor code in
production in
order to quickly
detect errors
Amazon ECS를 위한 CI/CD 툴
AWS CodePipeline
• 릴리스 프로세스를 모델링, 시각화
• 코드 변경이 있을 때마다 애플리케이션을 빌드,
테스트, 배포
• 파트너 도구 및 Amazon ECS를 비롯한
AWS서비스들과 통합
AWS CodePipeline: 릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
AWS CodePipeline: 릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
AWS CodePipeline: 지원하는 소스
브랜치 선택
AWS CodeCommit
GitHub
오브젝트나 폴더 선택
Amazon Simple Storage
Service (Amazon S3)
도커 태그 선택
Amazon Elastic
Container Registry
(Amazon ECR)
릴리스를 자동으로 시작하고 최신 소스 코드를 가져옵니다
AWS CodePipeline: 릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
AWS CodeBuild
• 완전 관리형 소프트웨어 빌드 서비스
• 지속적으로 확장되며 여러 빌드를 동시에 처리
• 관리할 빌드 서버가 없음
• 빌드에 소모되는 시간만큼만 분당 요금을 지불
AWS CodeBuild for containers
• 도커 이미지를 빌드, 푸시, 확인
• 도커와 AWS CLI가 모든 CodeBuild 이미지에 기본
탑재 되어 있음
• Docker 이미지를 Amazon ECR로 푸시하기 위해
빌드 환경에 채워진 역할 자격 증명
• Amazon ECR에 이미지를 푸시하기위한 역할
자격증명이 빌드 환경에 포함
• 사용자 지정 빌드 이미지 사용 가능
AWS CodeBuild: Container buildspec
version: 0.2
phases:
build:
commands:
- $(aws ecr get-login --no-include-email)
- docker build -t $IMAGE_NAME:$IMAGE_TAG .
- docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG
- docker push $ECR_REPO:$IMAGE_TAG
컨테이너 이미지 태깅
컨테이너 이미지 태깅
빌드가 “latest” 이미지를 새로 푸시
Image: sha256@22222... (“latest”)
컨테이너 이미지 태깅
서비스 확대, 새로운 작업들을 시작
Image: sha256@22222... (“latest”)
AWS CodeBuild: 컨테이너 이미지 태깅
version: 0.2
phases:
build:
commands:
- export IMAGE_TAG=build-`echo build-$CODEBUILD_BUILD_ID
| awk –F":" ‘{print $2}‘`
- $(aws ecr get-login --no-include-email)
- docker build -t $IMAGE_NAME:$IMAGE_TAG .
- docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG
- docker push $ECR_REPO:$IMAGE_TAG
Amazon ECR 변경 불가능한 이미지 태그
$ aws ecr put-image-tag-mutability 
--repository-name my-ecr-repo 
--image-tag-mutability IMMUTABLE
$ docker push $ECR_REPO:latest
Tag invalid: The image tag ‘latest’ already exists in the ‘my-
ecr-repo’ repository and cannot be overwritten because the
repository is immutable.
Amazon ECR 이미지 스캐닝
$ aws ecr put-image-scanning-configuration 
--repository-name my-ecr-repo 
--image-scanning-configuration scanOnPush=true
$ docker push $ECR_REPO:$BUILD_ID_TAG
$ aws ecr describe-image-scan-findings 
--repository-name my-ecr-repo 
--image-id imageTag=$BUILD_ID_TAG
AWS CodePipeline: 릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
AWS CodePipeline: 릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
Amazon ECS
AWS CodePipeline: 샘플 파이프라인
Source code:
“master” 브랜치
CodeBuild:
어플리케이션 이미지
빌드 및 푸시
Amazon ECS:
이미지를
테스트 환경에
배포
소스 빌드 테스트 프로덕션
Amazon ECS:
이미지를
프로덕션
환경에 배포
AWS CodePipeline: 이미지 파이프라인
Source code:
“master” 브랜치
CodeBuild:
베이스 이미지나
사이드카 이미지
빌드 및 푸시
Amazon ECR 베이스
이미지나 사이드카
이미지 저장소:
“release” 태그
AWS CodePipeline: 샘플 파이프라인
Source code:
“master” 브랜치
CodeBuild:
어플리케이션 이미지
빌드 및 푸시
Amazon ECS:
이미지를 테스트와
프로덕션에 순차적
배포
AWS CodePipeline: 샘플 파이프라인
Source code:
“master”
branch
Amazon ECR base
image repository:
“release” tag
CodeBuild:
Build and push
application image
Amazon ECS:
Deploy image to
test, then
production
AWS CodePipeline: 샘플 파이프라인
Source code:
“master”
branch
Amazon ECR base
image repository:
“release” tag
CodeBuild:
Build and push
application image
Amazon ECR sidecar
image repository:
“release” tag
Amazon ECS:
Deploy image to
test, then
production
릴리스 프로세스 단계
소스 빌드 테스트 프로덕션
GitHub Actions 워크플로우
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-2
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: my-ecs-service
cluster: my-ecs-cluster
Jenkinsfile
stage('Deploy to ECS Test Service') {
steps {
script {
sh '''#!/bin/bash -ex
sed -i s/BUILD/${BUILD_NUMBER}/g taskdef.json
REV=$(aws ecs register-task-definition --cli-input-json file://taskdef.json | 
jq '.taskDefinition.taskDefinitionArn')
aws ecs update-service --cluster ${CLUSTER} --service ${APP} 
--task-definition ${REV}
aws ecs wait services-stable --cluster ${ECS_CLUSTER} --services ${ECS_SERVICE}
'''
}
}
}
Spinnaker pipeline
"stages": [
{
"name": "Deploy to Test ECS Service",
"type": "deploy"
"clusters": [
{
“cloudProvider": “ecs",
"strategy": "redblack",
"rollback": { "onFailure": true },
"ecsClusterName": “test-cluster",
"imageDescription": {
"account": "my-ecr-registry",
"fromTrigger": true,
"registry": "123456789012.dkr.ecr.eu-central-1.amazonaws.com",
"repository": "spinnaker-deployment-images"
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한 배포
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한 배포
CI/CD를 위한 아마존의 안전 기준
1. 알람과 테스트에 기반한자동 롤백
2. 빠른 롤백
3. 배포 후 “뜸들이기”
4. 배포는 작게 시작, 점점 크게
AWS CodeDeploy
• EC2, ECS, Lambda에 소프트웨어 자동 배포
• 애플리케이션을 배포하는 동안 가동 중지 시간을
최소화
• 오류가 발생하는 경우 자동으로 롤백
• 트래픽 관리를 통한 사용자 영향 최소화
CodeDeploy ECS 블루/그린 배포
블루 작업:
v1 code
블루
대상
그룹
100%
프로덕션
트래픽
100%
프로덕션
트래픽
CodeDeploy ECS 블루/그린 배포
블루
대상
그룹
블루 작업:
v1 code
CodeDeploy ECS 블루/그린 배포
블루 작업:
v1 code
블루
대상
그룹
100%
프로덕션
트래픽
100%
테스트
트래픽
CodeDeploy ECS 블루/그린 배포
테스트
트래픽
리스너
(포트 9000)
그린
대상
그룹
블루 작업:
v1 code
블루
대상
그룹
100%
프로덕션
트래픽
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
그린 작업 준비
블루
대상
그룹
블루 작업:
v1 code
그린
대상
그룹
100%
test
traffic
100%
프로덕션
트래픽
100%
테스트
리스너
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
테스트 트래픽을 그린으로 변경; 테스트 엔드포인트를 대상으로 검증 테스트
블루
대상
그룹
블루 작업:
v1 code
그린
대상
그룹
100%
프로덕션
트래픽
CodeDeploy ECS AppSpec file
version: 1.0
Hooks:
- BeforeInstall: "LambdaFunctionToExecuteAnythingBeforeNewRevisionInstalltion"
- AfterInstall: "LambdaFunctionToExecuteAnythingAfterNewRevisionInstallation"
- AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficShift"
- BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift"
- AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift"
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
- TaskDefinition: "my_task_definition:8"
LoadBalancerInfos:
- ContainerName: "SampleApp"
ContainerPort: 80
CodeDeploy 수명주기 후크
exports.handler = async function (event, context, callback) {
var params = {
deploymentId: event.DeploymentId,
lifecycleEventHookExecutionId: event.LifecycleEventHookExecutionId,
status: 'Succeeded'
};
const response = await axios(http://my-service.com:9000/api);
if (response.status != 200) {
params.status = 'Failed';
}
await codedeploy.putLifecycleEventHookExecutionStatus(params).promise();
}
100%
테스트
트래픽
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
테스트 트래픽을 그린으로 변경; 테스트 엔드포인트를 대상으로 검증 테스트
블루
대상
그룹
블루 작업:
v1 code
그린
대상
그룹
100%
프로덕션
트래픽
100%
테스트
트래픽
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
프로덕션 트래픽을 그린으로 변경; 알람 발생시 롤백
블루
대상
그룹
블루 작업:
v1 code
그린
대상
그룹
100%
프로덕션
트래픽
CodeDeploy 배포 그룹 구성
"alarmConfiguration": {
"enabled": true,
"ignorePollAlarmFailure": false,
"alarms": [
{
"name": "MyCloudWatchAlarm_Http5xx"
},
{
"name": "MyCloudWatchAlarm_UnhealthyHosts"
},
{
"name": "MyCloudWatchAlarm_ErrorLogging"
}
]
}
CodeDeploy 배포 그룹 구성
"blueGreenDeploymentConfiguration": {
"terminateBlueInstancesOnDeploymentSuccess": {
"action": "TERMINATE",
"terminationWaitTimeInMinutes": 60
}
},
100%
테스트
트래픽
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
프로덕션 트래픽을 그린으로 변경; 알람 발생시 롤백
블루
대상
그룹
블루 작업:
v1 code
그린
대상
그룹
100%
프로덕션
트래픽
100%
테스트
트래픽
CodeDeploy ECS 블루/그린 배포
그린 작업:
v2 code
블루 작업을 제거
블루
대상
그룹
그린
대상
그룹
100%
프로덕션
트래픽
CodeDeploy ECS 블루/그린 배포
• CodePipeline에서 “CodeDeploy-ECS” 배포 작업 사용
• Jenkins나 다른 CI/CD 툴에서 “aws ecs deploy” 커맨드 사용
aws ecs deploy 
--service MyEcsService 
--codedeploy-deployment-group MyDeploymentGroup 
--task-definition task-definition.json 
--codedeploy-appspec appspec.yml
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한 배포
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한 배포
나의 앱
이미지
나의 앱
이미지
트래픽
(port 443)
나의 앱
이미지
트래픽
(port 8080)
상태 확인
(/health)
Traffic
(port 443)
나의 앱
이미지
트래픽
(port 8080)
상태 확인
(/health)
트래픽
(port 8080)
상태 확인
(/health)
테스트 환경
트래픽
(port 8080)
프로덕트 환경
상태 확인
(/)
아!
AWS CloudFormation을 사용한 인프라 코드 자동화
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
HealthCheckIntervalSeconds: 6
HealthCheckPath: /health
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 5
HealthyThresholdCount: 2
TargetType: ip
Name: !Ref 'ServiceName'
Port: !Ref 'ContainerPort'
Protocol: HTTP
UnhealthyThresholdCount: 2
Amazon의 CI/CD 사용과 인프라 코드 자동화
Repo(s) contain
app code & CFN
template file
소스 단계 빌드 단계 테스트 단계 프로덕션 단계
Build & push
image; update
CFN template
file
Deploy CFN
template file;
run tests
Deploy CFN
template file;
monitor
Insert image ID into infrastructure as code template
TaskDef:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- - Image: my-app-image:<PLACEHOLDER>
+ - Image: my-app-image@sha256:e3b0c44298fc1c149afbf4c87...
Amazon의 CI/CD 사용과 인프라 코드 자동화
Repo(s) contain
app code & CFN
template file
소스 단계 빌드 단계 테스트 단계 프로덕션 단계
Build & push
image; update
CFN template
file
Deploy CFN
template file;
run tests
Deploy CFN
template file;
monitor
트래픽
(port 443)
나의 앱
이미지
트래픽
(port 8080)
상태 확인
(/health)
AWS Cloud Development Kit (AWS CDK)
• 익숙한 프로그래밍 언어를 사용하여 클라우드
인프라를 정의할 수 있는 오픈 소스 소프트웨어 개발
프레임워크
• JavaScript, TypeScript, Python, Java 및 C# 지원
• AWS CloudFormation을 통해 리소스를 프로비저닝
• CloudFormation 리소스를 모두 지원
• AWS의 노하우가 담겨있는 풍부한 상위 레벨 구문을
제공
AWS CDK ECS constructs
const cluster = new ecs.Cluster(this, 'Cluster');
const taskDef = new ecs.FargateTaskDefinition(this, "MyTaskDefinition", {
memoryLimitMiB: 512,
cpu: 256,
});
taskDef.addContainer("AppContainer", {
image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
});
new ecs.FargateService(this, "FargateService", {
cluster,
taskDefinition: taskDef
});
AWS CDK ECS 패턴
• 애플리케이션 로드
밸런스 서비스
• 네트워크 로드 밸런스
서비스
• 큐 프로세싱 서비스
• 예약된 작업 (Cron job)
트래픽
(port 443)
내 앱
이미지
트래픽
(port 80)
상태 확인
(/)
AWS CDK ECS 패턴
import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns';
import { ContainerImage } from 'aws-cdk/aws-ecs';
import cdk = require('@aws-cdk/core');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props: cdk.StackProps) {
super(parent, name, props);
new ApplicationLoadBalancedFargateService(this, 'Service', {
taskImageOptions: { image: ContainerImage.fromAsset(‘../src') }
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour', {});
app.synth();
ECS 패턴 포함 항목:
• VPC
• ECS 클러스터
• ECS 작업 정의
• AWS Fargate 서비스
• Amazon CloudWatch Logs
• 로드 밸런서
• 보안 그룹
AWS CDK ECS 패턴
import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns';
import { ContainerImage } from 'aws-cdk/aws-ecs';
import cdk = require('@aws-cdk/core');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props: cdk.StackProps) {
super(parent, name, props);
new ApplicationLoadBalancedFargateService(this, 'Service', {
taskImageOptions: { image: ContainerImage.fromAsset(‘../src') }
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour', {});
app.synth();
AWS CDK는 ECR
리포지토리를
만들고, 여러분의
도커 이미지를 빌드
하고 푸시 할 겁니다.
AWS CDK ECS 패턴
import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns';
import { ContainerImage } from 'aws-cdk/aws-ecs';
import cdk = require('@aws-cdk/core');
class BonjourFargate extends cdk.Stack {
constructor(parent: cdk.App, name: string, props: cdk.StackProps) {
super(parent, name, props);
new ApplicationLoadBalancedFargateService(this, 'Service', {
taskImageOptions: { image: ContainerImage.fromAsset('../src') }
});
}
}
const app = new cdk.App();
new BonjourFargate(app, 'Bonjour', {});
app.synth();
수백줄에 달하는 AWS
CloudFormation Template 을
생성합니다.
AWS CDK CLI
npm install -g aws-cdk
cdk init --language typescript
cdk synth
cdk deploy
AWS CDK code를 위한 CI/CD
Repo(s) contain
app code &
CDK code
소스 단계 빌드 단계 테스트 단계 프로덕션 단계
Build & push
image;
synthesize CDK
template
Deploy CFN
template file;
run tests
Deploy CFN
template file;
monitor
AWS CDK CodeBuild buildspec
version: 0.2
phases:
install:
commands:
# Install CDK
- npm install -g aws-cdk
build:
commands:
# Compile code & synthesize CloudFormation templates
- npm ci
- tsc
- cdk synth --app 'node ecs-service.js'
AWS CDK CodePipeline pipelines
class DeployCDKPipeline extends cdk.Stack {
constructor(parent: cdk.App, name: string, props: MyMicroservicePipelineProps) {
super(parent, name, props);
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
pipelineName: props.serviceName,
});
const githubAccessToken = cdk.SecretValue.secretsManager('GitHubToken');
const sourceOutput = new codepipeline.Artifact('SourceArtifact');
const sourceAction = new actions.GitHubSourceAction({
actionName: 'GitHubSource', output: sourceOutput,
owner: ‘my-github-org’, repo: props.serviceName,
oauthToken: githubAccessToken
});
AWS CDK CodePipeline pipelines
class MyMicroservicePipelinesStack extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
new DeployCDKPipeline(this, 'Pipeline1', { 'serviceName': 'Microservice1' });
new DeployCDKPipeline(this, 'Pipeline2', { 'serviceName': 'Microservice2' });
new DeployCDKPipeline(this, 'Pipeline3', { 'serviceName': 'Microservice3' });
new DeployCDKPipeline(this, 'Pipeline4', { 'serviceName': 'Microservice4' });
}
}
CI/CD 모범사례
3.
반복 가능한
인프라 변경
1.
릴리스 자동화
2.
안전한 배포
더 나은 세미나를 위해
여러분의 의견을 남겨주세요!

AWS Fargate와 Amazon ECS를 활용한 CI/CD 모범사례 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Game Master 온라인 세미나

  • 1.
    유재석 솔루션즈 아키텍트,AWS AWS Fargate와 Amazon ECS 활용한 CI/CD 모범사례 AWS Game Master 온라인 세미나
  • 2.
    강연 중 질문하는방법 Go to Webinar “Questions” 창에 자신이 질문한 내역이 표시됩니다. 기본적으로 모든 질문은 공개로 답변 됩니다만 본인만 답변을 받고 싶으면 (비공개)라고 하고 질문해 주시면 됩니다. 본 컨텐츠는 고객의 편의를 위해 AWS 서비스 설명을 위해 온라인 세미나용으로 별도로 제작, 제공된 것입니다. 만약 AWS 사이트와 컨텐츠 상에서 차이나 불일치가 있을 경우, AWS 사이트(aws.amazon.com)가 우선합니다. 또한 AWS 사이트 상에서 한글 번역문과 영어 원문에 차이나 불일치가 있을 경우(번역의 지체로 인한 경우 등 포함), 영어 원문이 우선합니다. AWS는 본 컨텐츠에 포함되거나 컨텐츠를 통하여 고객에게 제공된 일체의 정보, 콘텐츠, 자료, 제품(소프트웨어 포함) 또는 서비스를 이용함으로 인하여 발생하는 여하한 종류의 손해에 대하여 어떠한 책임도 지지 아니하며, 이는 직접 손해, 간접 손해, 부수적 손해, 징벌적 손해 및 결과적 손해를 포함하되 이에 한정되지 아니합니다. 고지 사항(Disclaimer)
  • 4.
  • 5.
    컨테이너와 CI/CD FROM node:12 WORKDIR/opt/app COPY package.json package-lock.json ./ RUN npm ci COPY ./app /opt/app EXPOSE 80 CMD [ "node", "service.js" ]
  • 6.
  • 7.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 Repeatable infrastructure changes 1. 릴리스 자동화 Automated releases 2. 안전한 배포 Safe deployments
  • 8.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 9.
  • 10.
    1억 9천만번의 배포 (매초마다 6번의 배포)
  • 11.
  • 12.
  • 13.
    소스 빌드 App code Infrastructure ascode Configuration Base image
  • 14.
  • 15.
    소스 빌드 알파 준비단계 Artifacts Automated tests Appcode Infrastructure as code Configuration Base image
  • 16.
    소스 빌드 알파베타 준비단계 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 17.
    소스 빌드 알파베타 감마 준비단계 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 18.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 19.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 20.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 21.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 22.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image
  • 23.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image …
  • 24.
    소스 빌드 알파베타 감마 준비단계 프로덕션 Artifacts Automated tests Automated integration tests Automated load/perf tests Automated integration tests Automated synthetic tests API smoke tests Automated browser tests App code Infrastructure as code Configuration Base image … 파이프라인 방해물: 코드 커버리지, 코드 리뷰, 보안 검색, 의존성 업데이트, 시간대, 파이프라인 정책, 기타 여러가지
  • 25.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션
  • 26.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션 • Check-in source code such as .java files and Dockerfile • Peer review new code
  • 27.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션 • Check-in source code such as .java files and Dockerfile • Peer review new code • Compile code • Unit tests • Style checkers • Create container images
  • 28.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션 • Integration tests with other systems • Load testing • UI tests • Security testing • Check-in source code such as .java files and Dockerfile • Peer review new code • Compile code • Unit tests • Style checkers • Create container images
  • 29.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션 • Integration tests with other systems • Load testing • UI tests • Security testing • Check-in source code such as .java files and Dockerfile • Peer review new code • Compile code • Unit tests • Style checkers • Create container images • Deploy to production environments • Monitor code in production in order to quickly detect errors
  • 30.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션 • Integration tests with other systems • Load testing • UI tests • Security testing • Check-in source code such as .java files and Dockerfile • Peer review new code • Compile code • Unit tests • Style checkers • Create container images • Deploy to production environments • Monitor code in production in order to quickly detect errors
  • 31.
  • 32.
    AWS CodePipeline • 릴리스프로세스를 모델링, 시각화 • 코드 변경이 있을 때마다 애플리케이션을 빌드, 테스트, 배포 • 파트너 도구 및 Amazon ECS를 비롯한 AWS서비스들과 통합
  • 33.
    AWS CodePipeline: 릴리스프로세스 단계 소스 빌드 테스트 프로덕션
  • 34.
    AWS CodePipeline: 릴리스프로세스 단계 소스 빌드 테스트 프로덕션
  • 35.
    AWS CodePipeline: 지원하는소스 브랜치 선택 AWS CodeCommit GitHub 오브젝트나 폴더 선택 Amazon Simple Storage Service (Amazon S3) 도커 태그 선택 Amazon Elastic Container Registry (Amazon ECR) 릴리스를 자동으로 시작하고 최신 소스 코드를 가져옵니다
  • 36.
    AWS CodePipeline: 릴리스프로세스 단계 소스 빌드 테스트 프로덕션
  • 37.
    AWS CodeBuild • 완전관리형 소프트웨어 빌드 서비스 • 지속적으로 확장되며 여러 빌드를 동시에 처리 • 관리할 빌드 서버가 없음 • 빌드에 소모되는 시간만큼만 분당 요금을 지불
  • 38.
    AWS CodeBuild forcontainers • 도커 이미지를 빌드, 푸시, 확인 • 도커와 AWS CLI가 모든 CodeBuild 이미지에 기본 탑재 되어 있음 • Docker 이미지를 Amazon ECR로 푸시하기 위해 빌드 환경에 채워진 역할 자격 증명 • Amazon ECR에 이미지를 푸시하기위한 역할 자격증명이 빌드 환경에 포함 • 사용자 지정 빌드 이미지 사용 가능
  • 39.
    AWS CodeBuild: Containerbuildspec version: 0.2 phases: build: commands: - $(aws ecr get-login --no-include-email) - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG - docker push $ECR_REPO:$IMAGE_TAG
  • 40.
  • 41.
    컨테이너 이미지 태깅 빌드가“latest” 이미지를 새로 푸시 Image: sha256@22222... (“latest”)
  • 42.
    컨테이너 이미지 태깅 서비스확대, 새로운 작업들을 시작 Image: sha256@22222... (“latest”)
  • 43.
    AWS CodeBuild: 컨테이너이미지 태깅 version: 0.2 phases: build: commands: - export IMAGE_TAG=build-`echo build-$CODEBUILD_BUILD_ID | awk –F":" ‘{print $2}‘` - $(aws ecr get-login --no-include-email) - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG - docker push $ECR_REPO:$IMAGE_TAG
  • 44.
    Amazon ECR 변경불가능한 이미지 태그 $ aws ecr put-image-tag-mutability --repository-name my-ecr-repo --image-tag-mutability IMMUTABLE $ docker push $ECR_REPO:latest Tag invalid: The image tag ‘latest’ already exists in the ‘my- ecr-repo’ repository and cannot be overwritten because the repository is immutable.
  • 45.
    Amazon ECR 이미지스캐닝 $ aws ecr put-image-scanning-configuration --repository-name my-ecr-repo --image-scanning-configuration scanOnPush=true $ docker push $ECR_REPO:$BUILD_ID_TAG $ aws ecr describe-image-scan-findings --repository-name my-ecr-repo --image-id imageTag=$BUILD_ID_TAG
  • 46.
    AWS CodePipeline: 릴리스프로세스 단계 소스 빌드 테스트 프로덕션
  • 47.
    AWS CodePipeline: 릴리스프로세스 단계 소스 빌드 테스트 프로덕션 Amazon ECS
  • 48.
    AWS CodePipeline: 샘플파이프라인 Source code: “master” 브랜치 CodeBuild: 어플리케이션 이미지 빌드 및 푸시 Amazon ECS: 이미지를 테스트 환경에 배포 소스 빌드 테스트 프로덕션 Amazon ECS: 이미지를 프로덕션 환경에 배포
  • 49.
    AWS CodePipeline: 이미지파이프라인 Source code: “master” 브랜치 CodeBuild: 베이스 이미지나 사이드카 이미지 빌드 및 푸시 Amazon ECR 베이스 이미지나 사이드카 이미지 저장소: “release” 태그
  • 50.
    AWS CodePipeline: 샘플파이프라인 Source code: “master” 브랜치 CodeBuild: 어플리케이션 이미지 빌드 및 푸시 Amazon ECS: 이미지를 테스트와 프로덕션에 순차적 배포
  • 51.
    AWS CodePipeline: 샘플파이프라인 Source code: “master” branch Amazon ECR base image repository: “release” tag CodeBuild: Build and push application image Amazon ECS: Deploy image to test, then production
  • 52.
    AWS CodePipeline: 샘플파이프라인 Source code: “master” branch Amazon ECR base image repository: “release” tag CodeBuild: Build and push application image Amazon ECR sidecar image repository: “release” tag Amazon ECS: Deploy image to test, then production
  • 53.
    릴리스 프로세스 단계 소스빌드 테스트 프로덕션
  • 54.
    GitHub Actions 워크플로우 steps: -name: Checkout uses: actions/checkout@v1 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-2 - name: Deploy Amazon ECS task definition uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: task-definition.json service: my-ecs-service cluster: my-ecs-cluster
  • 55.
    Jenkinsfile stage('Deploy to ECSTest Service') { steps { script { sh '''#!/bin/bash -ex sed -i s/BUILD/${BUILD_NUMBER}/g taskdef.json REV=$(aws ecs register-task-definition --cli-input-json file://taskdef.json | jq '.taskDefinition.taskDefinitionArn') aws ecs update-service --cluster ${CLUSTER} --service ${APP} --task-definition ${REV} aws ecs wait services-stable --cluster ${ECS_CLUSTER} --services ${ECS_SERVICE} ''' } } }
  • 56.
    Spinnaker pipeline "stages": [ { "name":"Deploy to Test ECS Service", "type": "deploy" "clusters": [ { “cloudProvider": “ecs", "strategy": "redblack", "rollback": { "onFailure": true }, "ecsClusterName": “test-cluster", "imageDescription": { "account": "my-ecr-registry", "fromTrigger": true, "registry": "123456789012.dkr.ecr.eu-central-1.amazonaws.com", "repository": "spinnaker-deployment-images"
  • 57.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 58.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 59.
    CI/CD를 위한 아마존의안전 기준 1. 알람과 테스트에 기반한자동 롤백 2. 빠른 롤백 3. 배포 후 “뜸들이기” 4. 배포는 작게 시작, 점점 크게
  • 60.
    AWS CodeDeploy • EC2,ECS, Lambda에 소프트웨어 자동 배포 • 애플리케이션을 배포하는 동안 가동 중지 시간을 최소화 • 오류가 발생하는 경우 자동으로 롤백 • 트래픽 관리를 통한 사용자 영향 최소화
  • 61.
    CodeDeploy ECS 블루/그린배포 블루 작업: v1 code 블루 대상 그룹 100% 프로덕션 트래픽
  • 62.
    100% 프로덕션 트래픽 CodeDeploy ECS 블루/그린배포 블루 대상 그룹 블루 작업: v1 code
  • 63.
    CodeDeploy ECS 블루/그린배포 블루 작업: v1 code 블루 대상 그룹 100% 프로덕션 트래픽
  • 64.
    100% 테스트 트래픽 CodeDeploy ECS 블루/그린배포 테스트 트래픽 리스너 (포트 9000) 그린 대상 그룹 블루 작업: v1 code 블루 대상 그룹 100% 프로덕션 트래픽
  • 65.
    CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 그린 작업 준비 블루 대상 그룹 블루 작업: v1 code 그린 대상 그룹 100% test traffic 100% 프로덕션 트래픽
  • 66.
    100% 테스트 리스너 CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 테스트 트래픽을 그린으로 변경; 테스트 엔드포인트를 대상으로 검증 테스트 블루 대상 그룹 블루 작업: v1 code 그린 대상 그룹 100% 프로덕션 트래픽
  • 67.
    CodeDeploy ECS AppSpecfile version: 1.0 Hooks: - BeforeInstall: "LambdaFunctionToExecuteAnythingBeforeNewRevisionInstalltion" - AfterInstall: "LambdaFunctionToExecuteAnythingAfterNewRevisionInstallation" - AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficShift" - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift" - AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift" Resources: - TargetService: Type: AWS::ECS::Service Properties: - TaskDefinition: "my_task_definition:8" LoadBalancerInfos: - ContainerName: "SampleApp" ContainerPort: 80
  • 68.
    CodeDeploy 수명주기 후크 exports.handler= async function (event, context, callback) { var params = { deploymentId: event.DeploymentId, lifecycleEventHookExecutionId: event.LifecycleEventHookExecutionId, status: 'Succeeded' }; const response = await axios(http://my-service.com:9000/api); if (response.status != 200) { params.status = 'Failed'; } await codedeploy.putLifecycleEventHookExecutionStatus(params).promise(); }
  • 69.
    100% 테스트 트래픽 CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 테스트 트래픽을 그린으로 변경; 테스트 엔드포인트를 대상으로 검증 테스트 블루 대상 그룹 블루 작업: v1 code 그린 대상 그룹 100% 프로덕션 트래픽
  • 70.
    100% 테스트 트래픽 CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 프로덕션 트래픽을 그린으로 변경; 알람 발생시 롤백 블루 대상 그룹 블루 작업: v1 code 그린 대상 그룹 100% 프로덕션 트래픽
  • 71.
    CodeDeploy 배포 그룹구성 "alarmConfiguration": { "enabled": true, "ignorePollAlarmFailure": false, "alarms": [ { "name": "MyCloudWatchAlarm_Http5xx" }, { "name": "MyCloudWatchAlarm_UnhealthyHosts" }, { "name": "MyCloudWatchAlarm_ErrorLogging" } ] }
  • 72.
    CodeDeploy 배포 그룹구성 "blueGreenDeploymentConfiguration": { "terminateBlueInstancesOnDeploymentSuccess": { "action": "TERMINATE", "terminationWaitTimeInMinutes": 60 } },
  • 73.
    100% 테스트 트래픽 CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 프로덕션 트래픽을 그린으로 변경; 알람 발생시 롤백 블루 대상 그룹 블루 작업: v1 code 그린 대상 그룹 100% 프로덕션 트래픽
  • 74.
    100% 테스트 트래픽 CodeDeploy ECS 블루/그린배포 그린 작업: v2 code 블루 작업을 제거 블루 대상 그룹 그린 대상 그룹 100% 프로덕션 트래픽
  • 75.
    CodeDeploy ECS 블루/그린배포 • CodePipeline에서 “CodeDeploy-ECS” 배포 작업 사용 • Jenkins나 다른 CI/CD 툴에서 “aws ecs deploy” 커맨드 사용 aws ecs deploy --service MyEcsService --codedeploy-deployment-group MyDeploymentGroup --task-definition task-definition.json --codedeploy-appspec appspec.yml
  • 76.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 77.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
    트래픽 (port 8080) 상태 확인 (/health) 테스트환경 트래픽 (port 8080) 프로덕트 환경 상태 확인 (/) 아!
  • 83.
    AWS CloudFormation을 사용한인프라 코드 자동화 TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: HealthCheckIntervalSeconds: 6 HealthCheckPath: /health HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetType: ip Name: !Ref 'ServiceName' Port: !Ref 'ContainerPort' Protocol: HTTP UnhealthyThresholdCount: 2
  • 84.
    Amazon의 CI/CD 사용과인프라 코드 자동화 Repo(s) contain app code & CFN template file 소스 단계 빌드 단계 테스트 단계 프로덕션 단계 Build & push image; update CFN template file Deploy CFN template file; run tests Deploy CFN template file; monitor
  • 85.
    Insert image IDinto infrastructure as code template TaskDef: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: - - Image: my-app-image:<PLACEHOLDER> + - Image: my-app-image@sha256:e3b0c44298fc1c149afbf4c87...
  • 86.
    Amazon의 CI/CD 사용과인프라 코드 자동화 Repo(s) contain app code & CFN template file 소스 단계 빌드 단계 테스트 단계 프로덕션 단계 Build & push image; update CFN template file Deploy CFN template file; run tests Deploy CFN template file; monitor
  • 87.
  • 88.
    AWS Cloud DevelopmentKit (AWS CDK) • 익숙한 프로그래밍 언어를 사용하여 클라우드 인프라를 정의할 수 있는 오픈 소스 소프트웨어 개발 프레임워크 • JavaScript, TypeScript, Python, Java 및 C# 지원 • AWS CloudFormation을 통해 리소스를 프로비저닝 • CloudFormation 리소스를 모두 지원 • AWS의 노하우가 담겨있는 풍부한 상위 레벨 구문을 제공
  • 89.
    AWS CDK ECSconstructs const cluster = new ecs.Cluster(this, 'Cluster'); const taskDef = new ecs.FargateTaskDefinition(this, "MyTaskDefinition", { memoryLimitMiB: 512, cpu: 256, }); taskDef.addContainer("AppContainer", { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"), }); new ecs.FargateService(this, "FargateService", { cluster, taskDefinition: taskDef });
  • 90.
    AWS CDK ECS패턴 • 애플리케이션 로드 밸런스 서비스 • 네트워크 로드 밸런스 서비스 • 큐 프로세싱 서비스 • 예약된 작업 (Cron job) 트래픽 (port 443) 내 앱 이미지 트래픽 (port 80) 상태 확인 (/)
  • 91.
    AWS CDK ECS패턴 import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns'; import { ContainerImage } from 'aws-cdk/aws-ecs'; import cdk = require('@aws-cdk/core'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props: cdk.StackProps) { super(parent, name, props); new ApplicationLoadBalancedFargateService(this, 'Service', { taskImageOptions: { image: ContainerImage.fromAsset(‘../src') } }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour', {}); app.synth(); ECS 패턴 포함 항목: • VPC • ECS 클러스터 • ECS 작업 정의 • AWS Fargate 서비스 • Amazon CloudWatch Logs • 로드 밸런서 • 보안 그룹
  • 92.
    AWS CDK ECS패턴 import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns'; import { ContainerImage } from 'aws-cdk/aws-ecs'; import cdk = require('@aws-cdk/core'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props: cdk.StackProps) { super(parent, name, props); new ApplicationLoadBalancedFargateService(this, 'Service', { taskImageOptions: { image: ContainerImage.fromAsset(‘../src') } }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour', {}); app.synth(); AWS CDK는 ECR 리포지토리를 만들고, 여러분의 도커 이미지를 빌드 하고 푸시 할 겁니다.
  • 93.
    AWS CDK ECS패턴 import { ApplicationLoadBalancedFargateService } from '@aws-cdk/aws-ecs-patterns'; import { ContainerImage } from 'aws-cdk/aws-ecs'; import cdk = require('@aws-cdk/core'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props: cdk.StackProps) { super(parent, name, props); new ApplicationLoadBalancedFargateService(this, 'Service', { taskImageOptions: { image: ContainerImage.fromAsset('../src') } }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour', {}); app.synth(); 수백줄에 달하는 AWS CloudFormation Template 을 생성합니다.
  • 94.
    AWS CDK CLI npminstall -g aws-cdk cdk init --language typescript cdk synth cdk deploy
  • 95.
    AWS CDK code를위한 CI/CD Repo(s) contain app code & CDK code 소스 단계 빌드 단계 테스트 단계 프로덕션 단계 Build & push image; synthesize CDK template Deploy CFN template file; run tests Deploy CFN template file; monitor
  • 96.
    AWS CDK CodeBuildbuildspec version: 0.2 phases: install: commands: # Install CDK - npm install -g aws-cdk build: commands: # Compile code & synthesize CloudFormation templates - npm ci - tsc - cdk synth --app 'node ecs-service.js'
  • 97.
    AWS CDK CodePipelinepipelines class DeployCDKPipeline extends cdk.Stack { constructor(parent: cdk.App, name: string, props: MyMicroservicePipelineProps) { super(parent, name, props); const pipeline = new codepipeline.Pipeline(this, 'Pipeline', { pipelineName: props.serviceName, }); const githubAccessToken = cdk.SecretValue.secretsManager('GitHubToken'); const sourceOutput = new codepipeline.Artifact('SourceArtifact'); const sourceAction = new actions.GitHubSourceAction({ actionName: 'GitHubSource', output: sourceOutput, owner: ‘my-github-org’, repo: props.serviceName, oauthToken: githubAccessToken });
  • 98.
    AWS CDK CodePipelinepipelines class MyMicroservicePipelinesStack extends cdk.Stack { constructor(parent: cdk.App, name: string, props?: cdk.StackProps) { super(parent, name, props); new DeployCDKPipeline(this, 'Pipeline1', { 'serviceName': 'Microservice1' }); new DeployCDKPipeline(this, 'Pipeline2', { 'serviceName': 'Microservice2' }); new DeployCDKPipeline(this, 'Pipeline3', { 'serviceName': 'Microservice3' }); new DeployCDKPipeline(this, 'Pipeline4', { 'serviceName': 'Microservice4' }); } }
  • 99.
    CI/CD 모범사례 3. 반복 가능한 인프라변경 1. 릴리스 자동화 2. 안전한 배포
  • 100.
    더 나은 세미나를위해 여러분의 의견을 남겨주세요!