Aws-cli: aws ecs - μž‘μ—… μ •μ˜λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 방법

에 λ§Œλ“  2017λ…„ 12μ›” 29일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: aws/aws-cli

ECS μž‘μ—… μ •μ˜μ— μƒˆ κ°œμ •μ„ μΆ”κ°€ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

제 κ²½μš°μ—λŠ” λͺ…령쀄을 μ‚¬μš©ν•˜μ—¬ CD νŒŒμ΄ν”„λΌμΈμ˜ μ»¨ν…Œμ΄λ„ˆ URL을 μ—…λ°μ΄νŠΈν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ¬Έμ„œμ— 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법이 λˆ„λ½λ˜μ—ˆκ±°λ‚˜ ν˜„μž¬ 관리 μ½˜μ†”μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λ§Œ κ°€λŠ₯ν•©λ‹ˆκΉŒ?

https://github.com/aws/amazon-ecs-cli/issues/91 μ°Έμ‘° (ν•˜μ§€λ§Œ docker composeλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒ)

guidance

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@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}```

λͺ¨λ“  18 λŒ“κΈ€

잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 일반적으둜 μ‚¬μš© κ΄€λ ¨ μ§ˆλ¬Έμ— λŒ€ν•œ κ°€μž₯ 쒋은 μœ„μΉ˜λŠ” 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 ν•΄μ‹œλ₯Ό μ‚¬μš©ν•  λ•Œλ„ μž‘λ™ν•©λ‹ˆλ‹€. μž‘λ™ν•˜λ €λ©΄ λͺ‡ 가지 ν™˜κ²½ λ³€μˆ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
```

!/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}```

이에 λŒ€ν•œ μƒνƒœλŠ” μ–΄λ–»μŠ΅λ‹ˆκΉŒ? μž‘μ—… μ •μ˜ κ°œμ •μ„ μ–΄λ–»κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” λ‹€μŒκ³Ό 같은 것이 μžˆμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"

κ·Έλž˜μ„œ λ„€ μ œκ°€ μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€:

_ aws ecs μ—…λ°μ΄νŠΈ μž‘μ—… μ •μ˜ _

aws ecs help μ‚¬μš©ν•˜μ—¬ ν™•μΈν–ˆλŠ”λ° κ·ΈλŸ¬ν•œ μœ ν‹Έλ¦¬ν‹°κ°€ μ—†μŠ΅λ‹ˆλ‹€.


Screen Shot 2019-08-13 at 10 31 13 AM


이 티켓을 μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€: 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둜 μ „ν™˜ν–ˆμŠ΅λ‹ˆλ‹€. μ μ ˆν•œ μž‘μ—… μ •μ˜λ₯Ό μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

https://github.com/awslabs/fargatecli

Fargate CLI둜 μ „ν™˜ν–ˆμŠ΅λ‹ˆλ‹€. μ μ ˆν•œ μž‘μ—… μ •μ˜λ₯Ό μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

https://github.com/awslabs/fargatecli

그것을 κ³΅μœ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ - 그것을 보지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. ν™•μΈν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

μ •μ˜λœ λ³Όλ₯¨μ΄ μžˆλŠ” 경우 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 정보 κ°μ‚¬ν•©λ‹ˆλ‹€. μ‹œλ„ν•΄ 볼게.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰