appspec.yaml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "<TASK_DEFINITION>"
LoadBalancerInfo:
ContainerName: "<CONTAINER_NAME>"
ContainerPort: <PORT>
YAML
복사
buildspec.yml
version: 0.2
cache:
paths:
# - "/root/.gradle/caches/**/*" # gradle
# - "/root/.m2/**/*" # maven
# - "/root/.cache/pip/**/*" # pip
# - "/root/.npm/**/*" # npm
# - "/root/.nuget/**/*" # nuget
# - "/root/.cache/yarn/**/*" # yarn
env:
variables:
AWS_REGION: "REGION"
ECR_REPO_NAME: "ECR_REPO_NAME"
phases:
pre_build:
commands:
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
build:
commands:
- docker build -t $ECR_REPO_NAME .
- docker tag $ECR_REPO_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPO_NAME:latest
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPO_NAME:latest
- echo "{\"ImageURI\":\"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}:latest\"}" > imageDetail.json
artifacts:
files:
- appspec.yaml
- taskdef.json
- imageDetail.json
YAML
복사
taskdef.json (ECS - Task정의 가서 복붙해오기)
{
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-2:362708816803:task-definition/skills-taskdef:96",
"containerDefinitions": [
{
"name": "skills-app",
"image": "<IMAGE_NAME>",
"cpu": 0,
"portMappings": [
{
"name": "skills-app-tcp-8080",
"containerPort": 8080,
"hostPort": 8080,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"environment": [],
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"ulimits": [],
"systemControls": []
}
],
"family": "skills-taskdef",
"taskRoleArn": "arn:aws:iam::362708816803:role/ecsTaskExecutionRole",
"executionRoleArn": "arn:aws:iam::362708816803:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"revision": 96,
"volumes": [],
"status": "ACTIVE",
"requiresAttributes": [
{
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"name": "com.amazonaws.ecs.capability.task-iam-role"
},
{
"name": "ecs.capability.execution-role-ecr-pull"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"name": "ecs.capability.task-eni"
}
],
"placementConstraints": [],
"compatibilities": ["EC2", "FARGATE"],
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"registeredAt": "2024-12-31T01:19:22.385Z",
"registeredBy": "arn:aws:iam::362708816803:root",
"enableFaultInjection": false,
"tags": []
}
JSON
복사
•
1시간 → 5분으로 변경
배포 구성
•
CodeDeployDefault.ECSAllAtOne
모든 트래픽을 업데이트된 Amazon ECS 컨테이너로 한 번에 이동합니다.
•
Canary 배포
카나리아 배포/릴리스를 사용하면 주어진 애플리케이션의 새 버전을 배포한 후 비즈니스 요구에 따라 사용자 정의 백분율 증분으로 트래픽을 전환합니다.
•
Linear(선형)
카나리아 배포와 유사합니다. 해당 트래픽을 소화하는 만큼의 리소스를 배포하고, 시간에 따라서 Ver2의 배포를 점점 늘리는 형태를 말합니다.
생성 방법은 배포 구성에서 배포 구성 만들기를 선택한다음 만들면 됩니다.








