ECS μμ μ μμ μ κ°μ μ μΆκ°νλ λ°©λ²μ΄ μμ΅λκΉ?
μ κ²½μ°μλ λͺ λ Ήμ€μ μ¬μ©νμ¬ CD νμ΄νλΌμΈμ 컨ν μ΄λ URLμ μ λ°μ΄νΈνκ³ μΆμ΅λλ€. λ¬Έμμ μ΄λ₯Ό μννλ λ°©λ²μ΄ λλ½λμκ±°λ νμ¬ κ΄λ¦¬ μ½μμ μ¬μ©νλ κ²½μ°μλ§ κ°λ₯ν©λκΉ?
https://github.com/aws/amazon-ecs-cli/issues/91 μ°Έμ‘° (νμ§λ§ docker composeλ₯Ό μ¬μ©νμ§ μμ)
μ λͺ¨λ₯΄κ² μ΅λλ€. μΌλ°μ μΌλ‘ μ¬μ© κ΄λ ¨ μ§λ¬Έμ λν κ°μ₯ μ’μ μμΉλ README μ μΈκΈλ κ²μ²λΌ μ€ν μ€λ²νλ‘μ λλ€.
νμ§λ§ λ¬Έμλ₯Ό μ΄ν΄λ³΄λ©΄ register-task-definition
λ₯Ό μ¬μ©νλ©΄ μ κ°μ νμ λ§λλ κ²μ²λΌ 보μ
λλ€. https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html#outputμμ :
revision -> (integer)
The revision of the task in a particular family. The revision is
a version number of a task definition in a family. When you reg-
ister a task definition for the first time, the revision is 1 ;
each time you register a new revision of a task definition in
the same family, the revision value always increases by one
(even if you have deregistered previous revisions in this fam-
ily).
λλ κ·Έκ²μ λ¨Όμ μλ ν κ²μ λλ€.
κ°μ¬ν©λλ€. μμ μ£μ‘ν©λλ€. update-service
μ κ°μ λ€λ₯Έ λͺ
λ Ήκ³Ό μΌμΉνλ λ³λμ λͺ
λ Ήμ κΈ°λνμ΅λλ€.
μλ νμΈμ @Extrawurst μ λ κ°μ λ¬Έμ κ° μμ΅λλ€. ν΄κ²°μ± μ μ°ΎμΌμ ¨λμ§ κΆκΈν©λλ€.
μλ
νμΈμ @menocomp λ @jamesls λ΅λ³μ μ°Έμ‘°νμμμ€. register-task-definition
λ₯Ό μ¬μ©νλ©΄ ν¨λ°λ¦¬κ° μ΄λ―Έ μ‘΄μ¬νλ κ²½μ° μ κ°μ μ΄ μμ±λ©λλ€.
register-task-definition
λ κ°μ λ²νΈλ₯Ό λ리λ λ° λ§μ‘±μ€λ¬μ΄ λ°©λ²μ΄ μλλλ€.
register-task-definition
μλ μμ
μ μ 맀κ°λ³μ λλ JSONμ΄ μ
λ ₯μΌλ‘ νμν©λλ€. describe-task-definition
μμ μ‘°λ¬νλ©΄ register-task-definition
μ ν¨κ» μ¬μ©ν μ μλ μΆκ° μ¬μ λ μ΄μ΄ _λ°_ νλκ° μΆκ°λ©λλ€.
μ΅μμ μ¬μ μ λ³ν©ν ν:
$ aws ecs register-task-definition --family name --cli-input-json file:///tmp/task-definition.json
Parameter validation failed:
Unknown parameter in input: "taskDefinitionArn", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "revision", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "status", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "requiresAttributes", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "compatibilities", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
κΈ°λ₯ μμ²μΌλ‘ λ€μ μ΄μ΄μΌ νλ€κ³ μκ°ν©λλ€. νμ¬ CI/CDμ νμν ECS μμ μ λ°μ΄νΈμ© CLIλ κ°λ¨νμ§ μμΌλ©° μΆκ° νΈλ¦μ΄ νμν©λλ€.
μΉμμ κ°μ₯ μΌλ°μ μΌλ‘ λ°κ²¬λλ νλ¦μ describe-task-definition
λ₯Ό νΈμΆνκ³ , 컨ν
μ΄λ μ μλ₯Ό κ°μ Έμ€κ³ , image
맀κ°λ³μλ₯Ό λ³κ²½νκ³ register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION
λ€μ νΈμνλ κ²μ
λλ€.
Fargateλ₯Ό μ¬μ©νμ¬ μ΄ νλ¦μ λ¬Έμ κ° λ°μνμ΅λλ€. λμΌν JSONμΌλ‘ μμ
μ μ
λ°μ΄νΈν μ μκ³ μΆκ° 맀κ°λ³μκ° νμνλ©° κΈ°λ³Έμ μΌλ‘ describe-task
JSONμ λͺ¨λ μ΅μμ κ°μ register-task-definition
맀κ°λ³μ(cpu, λ©λͺ¨λ¦¬ λ±).
λ°λΌμ λμκ² λ λμ μ루μ μ JSONμ μμ μ λν μ 체 μ λ ₯μΌλ‘ μ¬μ©νλ κ²μ΄μ§λ§ @shatilμμ μΈκΈν μ체 λ¬Έμ κ° μμ΅λλ€. λ§μ§λ§μΌλ‘ λ€μκ³Ό κ°μ μ€ν¬λ¦½νΈλ‘ λλμ΅λλ€.
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "us-east-1")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$NEW_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities)')
aws ecs register-task-definition --region "us-east-1" --cli-input-json "$NEW_TASK_DEFINTIION"
@m-radzikowski κ°μ¬ν©λλ€. μ루μ
μ μ½κ° μμ νμ¬ "μ΅μ " λμ μ΄λ―Έμ§ νκ·Έλ‘ git ν΄μλ₯Ό μ¬μ©ν λλ μλν©λλ€. μλνλ €λ©΄ λͺ κ°μ§ νκ²½ λ³μκ° νμν©λλ€.
```
μΈνΈ -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.νΈνμ±)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(μμ½ $NEW_TASK_INFO | jq '.taskDefinition.revision')
AWS ECS μ
λ°μ΄νΈ μλΉμ€ --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```
μ΄μ λν μνλ μ΄λ»μ΅λκΉ? μμ μ μ κ°μ μ μ΄λ»κ² λ§λ€ μ μμ΅λκΉ? λλ λ€μκ³Ό κ°μ κ²μ΄ μμ κ²μ΄λΌκ³ μκ°ν©λλ€.
aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"
κ·Έλμ λ€ μ κ° μ°Ύκ³ μμ΅λλ€:
_ aws ecs μ λ°μ΄νΈ μμ μ μ _
aws ecs help
μ¬μ©νμ¬ νμΈνλλ° κ·Έλ¬ν μ νΈλ¦¬ν°κ° μμ΅λλ€.
μ΄ ν°μΌμ μμ±νμ΅λλ€: https://github.com/aws/aws-cli/issues/4401
aws-cli μ§μ, λ Όμνλ κ²μ΄ λ§μμ λ€μ§ μμΌλ©΄ githubλ₯Ό μ¬μ©νμ§ λ§μμμ€. μ£μ‘ν©λλ€. μ¬μ ν μ ν¨νλ©° λ€μ μ΄μ΄μΌ ν©λλ€.
jq
κ° νμνμ§ μμ μ μμ΅λλ€.
aws describe-task-definition --task-definition myapp \
--query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
> /tmp/task-definitions.json
Fargate μ¬μ©μλ λ€μκ³Ό κ°μ κΈ΄ λͺ λ Ήμ΄ νμν μ μμ΅λλ€.
aws ecs register-task-definition \
--family myapp \
--cli-input-json file:///tmp/task.json \
--requires-compatibilities FARGATE \
--network-mode awsvpc \
--cpu 1024 --memory 2048 \
--task-role-arn <arn> --execution-role-arn <arn>
Fargate μ¬μ©μλ‘μ λλ for ecs cli λ° --tagsλ₯Ό μ¬μ©νλ ν΄νΉμ λ°κ²¬νμ΅λλ€.
λ²μ λ²νΈμ 무μμ μ λ ₯νλ κ°μ νμ λ€μ λ²μ μΌλ‘ μ€μ ν©λλ€.
ecs-cli compose --project-name PROJECT-NAME --file DOCKER_COMPOSE_FILE --ecs-params ECS_PARAMS_FILE --region REGION create --launch-type FARGATE --tags 'TaskDefinition=TASK:VERSION_NUMBER'
Fargate CLIλ‘ μ ννμ΅λλ€. μ μ ν μμ μ μλ₯Ό μλμΌλ‘ μ λ°μ΄νΈν©λλ€.
Fargate CLIλ‘ μ ννμ΅λλ€. μ μ ν μμ μ μλ₯Ό μλμΌλ‘ μ λ°μ΄νΈν©λλ€.
κ·Έκ²μ 곡μ ν΄ μ£Όμ μ κ°μ¬ν©λλ€ - κ·Έκ²μ λ³΄μ§ λͺ»νμ΅λλ€. νμΈνμκΈ° λ°λλλ€.
μ μλ λ³Όλ₯¨μ΄ μλ κ²½μ° fargatecliκ° μλνμ§ μμ΅λλ€.
jq
κ° νμνμ§ μμ μ μμ΅λλ€.aws describe-task-definition --task-definition myapp \ --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \ > /tmp/task-definitions.json
Fargate μ¬μ©μλ λ€μκ³Ό κ°μ κΈ΄ λͺ λ Ήμ΄ νμν μ μμ΅λλ€.
aws ecs register-task-definition \ --family myapp \ --cli-input-json file:///tmp/task.json \ --requires-compatibilities FARGATE \ --network-mode awsvpc \ --cpu 1024 --memory 2048 \ --task-role-arn <arn> --execution-role-arn <arn>
λ€μμ JQκ° νμνμ§ μμ μ μ λ²μ μ λλ€.
NEW_TASK_DEFINTION=\$(aws ecs describe-task-definition --task-definition {task def}
--query '{ containerDefinitions: taskDefinition.containerDefinitions,
family: taskDefinition.family,
taskRoleArn: taskDefinition.taskRoleArn,
executionRoleArn: taskDefinition.executionRoleArn,
networkMode: taskDefinition.networkMode,
volumes: taskDefinition.volumes,
placementConstraints: taskDefinition.placementConstraints,
requiresCompatibilities: taskDefinition.requiresCompatibilities,
cpu: taskDefinition.cpu,
memory: taskDefinition.memory}')
aws ecs register-task-definition --cli-input-json "$NEW_TASK_DEFINTION"
@sashokbg μ λ΅λ³μ μΆκ°νμ¬ register-task-definitionμ CPU λ° λ©λͺ¨λ¦¬ κ°μ λν λ¬Έμμ΄μ΄ νμνλ€κ³ λΆνν©λλ€. --query λͺ λ Ήμ to_string($arg) μ ν μΊμ€ν μ μ§μνλ JMESPath ꡬ문μ μ¬μ©νλ―λ‘ μ΄ λ κ°μ§λ₯Ό to_string()
μ΅μ μ΄λ―Έμ§(νκ·Έ "μ΅μ " ν¬ν¨)λ₯Ό μ¬μ©νλλ‘ ECS ν΄λ¬μ€ν°λ₯Ό μ λ°μ΄νΈνλ €λ κ²½μ° λ€μμΌλ‘ μΆ©λΆν©λλ€.
aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment
--force-new-deployment
paramμ΄ νΈλ¦μ μνν©λλ€.
@oalagtash μ 보 κ°μ¬ν©λλ€. μλν΄ λ³Όκ².
κ°μ₯ μ μ©ν λκΈ
@m-radzikowski κ°μ¬ν©λλ€. μ루μ μ μ½κ° μμ νμ¬ "μ΅μ " λμ μ΄λ―Έμ§ νκ·Έλ‘ git ν΄μλ₯Ό μ¬μ©ν λλ μλν©λλ€. μλνλ €λ©΄ λͺ κ°μ§ νκ²½ λ³μκ° νμν©λλ€.
```
!/bin/bash
νμ¬ μμ μ μλ₯Ό κ°μ Έμ€κ³ μ΄λ₯Ό κΈ°λ°μΌλ‘ μ ecr μ΄λ―Έμ§ μ£Όμλ₯Ό μ΄μ ν νλ¦Ώμ μΆκ°νκ³ νμνμ§ μμ μμ±μ μ κ±°νλ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ μ μμ μ μλ₯Ό 보λ΄κ³ μΆλ ₯μμ ββμ κ°μ λ²νΈλ₯Ό κ°μ Έμ€κ³ μλΉμ€λ₯Ό μ λ°μ΄νΈν©λλ€.
μΈνΈ -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.νΈνμ±)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(μμ½ $NEW_TASK_INFO | jq '.taskDefinition.revision')
AWS ECS μ λ°μ΄νΈ μλΉμ€ --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```