์๋
ํ์ธ์ :)
์ค๋๊ฐ๋ง์ ํฌ์คํ
์
๋๋ค.
์ค๋์ ECR์ ์ด๋ฏธ์ง๊ฐ Push ๋๋ฉด, ECS์๋น์ค ๋ฐฐํฌ ๋ฐฉ์(blue/green, rolling)์ ๋ฐ๋ผ ECS์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์ฑํฉ๋๋ค.
๊ทธ๋ฅ, ECR ๋ ํฌ์งํ ๋ฆฌ์ latest ํ๊ทธ๋ฅผ ๊ฐ์ง ๋์ปค์ด๋ฏธ์ง๊ฐ push ๋๋ฉด, ๋ฐ๋ก ๋ฐฐํฌ๋๊ฒ๋... ๊ตฌ์ฑํฉ๋๋ค.
AWS ๊ณต์ ๋ฌธ์๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ECS ์๋น์ค๊ฐ ์ด๋ฏธ ๊ตฌ์ฑ ๋์ด์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๐ ์ํคํ ์ณ
๐ Step 1) CodeCommit ๊ตฌ์ฑ
codecommit์ด ์๋์ด๋ ๊ด์ฐฎ์ต๋๋ค. Github, Bitbucket๋ ๊ฐ๋ฅํฉ๋๋ค.
- ์ฝ๋์ปค๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ appspec.yaml, taskdef.json ๋๊ฐ์ ํ์ผ์ด ํ์ํฉ๋๋ค.
- ๋กค๋ง ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ imagedefinitions.json ํ๋์ ํ์ผ์ด ํ์ํฉ๋๋ค.
- ๊ฐ ๋ฐฐํฌ ๋ฐฉ์์ ๋ง๋ ํ์ผ์ CodeCommit์ ์ ๋ก๋ ํ์ฌ ์ค๋นํฉ๋๋ค.
๐ appspec.yaml ์ํ
์ปจํ ์ด๋ ์ค์ ์ ๋ง๊ฒ ContainerName, ContainerPort ๋๊ฐ๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "์ปจํ
์ด๋ ์ด๋ฆ"
ContainerPort: 80
CapacityProviderStrategy:
- Base: 0
CapacityProvider: "์ฉ๋๊ณต๊ธ์ ์ด๋ฆ"
Weight: 1
# # Optional properties
# PlatformVersion: "LATEST"
# NetworkConfiguration:
# AwsvpcConfiguration:
# Subnets: ["subnet-name-1", "subnet-name-2"]
# SecurityGroups: ["security-group"]
# AssignPublicIp: "ENABLED"
# Hooks:
# - BeforeInstall: "BeforeInstallHookFunctionName"
# - AfterInstall: "AfterInstallHookFunctionName"
# - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
# - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
# - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"
๐ taskdef.json ์ํ
"aws ecs describe-task-definition --task-definition <์์
์ ์:๋ฒ์ >"์ ํฐ๋ฏธ๋์์ ์คํํ์ฌ ๊ฐ์ ํ์ธํ๊ณ ,
"taskDefinition" ํค ์๋์ ๊ฐ์ ๋ชจ๋ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
taskdef.jon์ ์ ์๋ ๋ฐ๋ก ์ปจํ
์ด๋๊ฐ ์คํ๋๊ธฐ๋๋ฌธ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
{
"executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "sample-website",
"image": "<IMAGE1_NAME>",
"essential": true,
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "ecs-demo"
}
๐ imagedefinitions.json ์ํ
์ ์ผ ๊ฐ๋จํฉ๋๋ค. ์ปจํ ์ด๋ ์ด๋ฆ๊ณผ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
[
{
"name": "์ปจํ
์ด๋ ์ด๋ฆ"
"imageUri": "์ด๋ฏธ์งURL:latest"
}
]
๐ Step 2) CodePipeline ๊ตฌ์ฑ
๊ฒฐ๊ณผ ๋จผ์ ๋ณด์๋ฉด, ์๋์ฒ๋ผ ๊ตฌ์ฑ๋๋ฉด ๋ฉ๋๋ค.
์ฃผ์ํด์ผํ ๋ถ๋ถ์ CodeCommit/Github/bitbucket ๋จผ์ ์์ค์ ๋ฑ๋กํ ํ ECR์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
1) Source์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ฑ๋กํฉ๋๋ค.
2) ๋น๋ ๋จ๊ณ๋ฅผ ๊ฑด๋๋๋๋ค.
3) ๋ฐฐํฌ ์คํ
์ด์ง์์ ๋ฐฐํฌํ ECS ์๋น์ค ๋ฅผ ์ ํํฉ๋๋ค. ์ง๊ด์ ์ด๊ธฐ๋๋ฌธ์.. ์บก์ณ ์์ด ์ง๋๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ฃ ๋ฒํผ์ ๋๋ฆ
๋๋ค.
4) ์ฝ๋ํ์ดํ๋ผ์ธ ์์ -> ์์ค ์คํ
์ด์ง ํธ์ง์ ๋๋ฅด๊ณ ECR์ ์ถ๊ฐํฉ๋๋ค.
์ด๋ ์ถ๋ ฅ ์ํฐํํธ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. AWS ๊ณต์์์ต์ ๋ฌธ์์ ๋ฐ๋ผ "MyImage"๋ก ์ง์ ํ์ง๋ง ์ด๋ฆ์ ๋ค๋ฅธ๊ฒ์ผ๋ก ํด๋ ๊ด์ฐฎ์ต๋๋ค.
5) ์ ๋จ๊ณ์์ ์ถ๊ฐํ ECR ์์ค๋ฅผ ํธ๋ฆฌ๊ฑฐ ํ ์ ์๋๋ก Deploy๋ ์์ ํฉ๋๋ค.
์
๋ ฅ ์ํฐํฉํธ์ MyImage๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์๋๋ก ์คํฌ๋กค ๋ค์ดํ์ฌ "์ด๋ฏธ์ง ์ธ๋ถ ์ ๋ณด๊ฐ ์๋ ์
๋ ฅ ์ํฐํฉํธ" - "MyImage"๋ฅผ ์ ํํ๊ณ ,
"์์
์ ์์ ์๋ฆฌ ํ์์ ํ
์คํธ"- "IMAGE1_NAME"์ ์
๋ ฅํฉ๋๋ค.
์์
์ ์์ ์๋ฆฌ ํ์์ ํ
์คํธ๋ taskdef.json์์ ์ ์ํ์์ต๋๋ค.
๐ Step 3) ํ ์คํธ
์ด์ ์ ๋์ํ๋์ง ํ
์คํธ ํด๋ด
์๋ค.
ECR ๋ ํฌ์ ์ด๋ฏธ์ง๋ฅผ push ํด๋ณด์ธ์! ์ ๋ ๊ฒ๋๋ค.
https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html