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

mra*_*agh 21 amazon-ecs

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

  1. 创建新的任务修订版(在更新Docker存储库上的映像之后).
  2. 更新服务并指定新修订.

这似乎有效,但我想通过CLI完成所有操作,因此我可以编写脚本.#2似乎很容易通过AWS CLI来完成update-service,但我没有看到做#1的方法而没有再次指定整个Task JSON register-task-definition(我的JSON将在环境变量中包含凭据,所以我想要在尽可能少的地方有这个.

这是我应该如何自动部署我的ECS服务更新?如果是这样,是否有一种"好"的方式让任务定义启动一个新版本(即没有重复所有内容)?

小智 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)'"
Run Code Online (Sandbox Code Playgroud)

不是100%安全,因为最后一个命令的--container-defintions参数(包括"environment"条目)仍然可以通过像这样的进程看到ps.其中一个AWS SDK可以让您更安心.


veu*_*ent 5

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

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
Run Code Online (Sandbox Code Playgroud)

导致:解析参数'--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
Run Code Online (Sandbox Code Playgroud)

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