我想通过使用最新的Docker镜像启动ECS服务来自动部署我的应用程序。根据我的阅读,部署新映像版本的方法如下:
这似乎有效,但我想通过CLI完成所有操作,因此我可以编写脚本。 #2似乎很容易通过AWS CLI与update-service
一起完成,但我没有看到做#1的方法而没有像register-task-definition
一样重新指定整个任务JSON(我的JSON将在环境变量中包含凭据,因此我希望在尽可能少的地方使用它。
这是我应该如何自动部署我的ECS服务更新吗?如果是这样,是否有一个好的"让任务定义启动一个新版本(即没有重复所有内容)的方法?
答案 0 :(得分:16)
是的,这是正确的方法。
不,使用当前的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可以让您更安心。
答案 1 :(得分:5)
Matt Callanan提供的答案对我不起作用:我在这部分收到错误:
--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
导致:解析参数'--container-definitions'时出错:预期:'=',收到:'''表示输入:
'{environment:[{etc etc ....
我做的是解决它:
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使用了这些卷(所以如果不使用卷则不需要它。)
答案 2 :(得分:0)
#!/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 $2}' | 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