ECS 服务 - 使用新的 Docker 映像自动部署

ECS Service - Automating deploy with new Docker image

我想通过使用最新的 Docker 映像启动我的 ECS 服务来自动部署我的应用程序。据我了解,部署新映像版本的方法如下:

  1. 创建一个新的任务修订版(在更新您的 Docker 存储库中的图像之后)。
  2. 更新服务并指定新版本。

这似乎可行,但我想通过 CLI 完成所有操作,以便编写脚本。 #2 似乎很容易通过 AWS CLI 使用 update-service 完成,但我没有看到没有像 register-task-definition 一样重新指定整个任务 JSON 的方法来完成 #1 (我的 JSON 将在环境变量中包含凭据,所以我希望在尽可能少的地方使用它)。

这是我自动部署 ECS 服务更新的方式吗?如果是这样,是否有 "good" 方法让任务定义启动新修订版(即不复制所有内容)?

是的,这是正确的做法。

不,对于当前的 API,您不能在不复制的情况下注册现有任务定义的新修订版。

如果您没有使用 CLI 生成原始任务定义(或者不想重复使用生成它的原始命令),您可以通过 CLI 尝试如下操作:

OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>)
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"')
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"

不是 100% 安全,因为最后一个命令的 --container-defintions 参数(包括 "environment" 条目)在 ps 等进程中仍然可见。 AWS SDK 之一会让您更加安心。

Matt Callanan 提供的答案对我不起作用:我收到这部分的错误:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"

结果:解析参数“--container-definitions”时出错:预期:“=”,收到:“”用于输入:

'{ 环境:[ { 等等......

我解决它的方法是:

TASK_FAMILY=<task familiy name> 
DOCKER_IMAGE=<new_image_name>
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY})

echo $LATEST_TASK_DEFINITION \
     | jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \
     | jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \
     > /tmp/tmp.json

aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json

我从原始 json 文档中获取了 containerDefinitions 和 volumes 元素,因为我的 containerDefinition 使用了这些卷(如果您不使用卷,则不需要)。

#!/bin/bash
SERVICE_NAME="your service name"
IMAGE_VERSION="v_"${BUILD_NUMBER}
TASK_FAMILY="your task defination name"
CLUSTER="your cluster name"
REGION="your region"


echo "=====================Create a new task definition for this build==========================="
sed -e "s;%BUILD_NUMBER%;${BUILD_NUMBER};g" taskdef.json > ${TASK_FAMILY}-${IMAGE_VERSION}.json

echo "=================Resgistring the task defination==========================================="
aws ecs register-task-definition  --family ${TASK_FAMILY} --cli-input-json  file://${TASK_FAMILY}-${IMAGE_VERSION}.json --region ${REGION}

echo "================Update the service with the new task definition and desired count================"
TASK_REVISION=`aws ecs describe-task-definition --task-definition  ${TASK_FAMILY}  --region ${REGION} | egrep "revision" | tr "/" " " | awk '{print }' | sed 's/"$//'`


DESIRED_COUNT=`aws ecs describe-services --cluster ${CLUSTER} --services ${SERVICE_NAME}  --region ${REGION} | jq .services[].desiredCount`
if [ ${DESIRED_COUNT} = "0" ]; then
    DESIRED_COUNT="1"
fi

echo "===============Updating the service=============================================================="
aws ecs update-service --cluster ${CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${TASK_REVISION} --desired-count ${DESIRED_COUNT} --region ${REGION}


    enter code here