Apakah ada cara untuk menambahkan revisi baru ke definisi tugas ECS?
Dalam kasus saya, saya ingin memperbarui URL wadah di saluran CD saya menggunakan baris perintah. Entah dokumentasinya hilang bagaimana melakukannya atau hanya mungkin saat ini menggunakan konsol manajemen?
lihat https://github.com/aws/amazon-ecs-cli/issues/91 (tapi saya tidak menggunakan docker compose)
Hmm, saya tidak yakin. Secara umum, tempat terbaik untuk pertanyaan terkait penggunaan adalah di stack overflow, seperti yang disebutkan dalam README kami.
Melihat dokumen, sepertinya hanya menggunakan register-task-definition
akan membuat revisi baru. Dari 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).
Saya akan mencobanya terlebih dahulu.
terima kasih, maaf untuk kebisingan. Saya mengharapkannya menjadi perintah terpisah yang konsisten dengan yang lain seperti update-service
Halo @Extrawurst Saya memiliki masalah yang sama. Saya bertanya-tanya apakah Anda menemukan solusi.
hai @menocomp lihat jawaban @jamesls . cukup gunakan register-task-definition
dan itu akan membuat revisi baru jika keluarga sudah ada
register-task-definition
bukan cara yang memuaskan untuk mencapai angka revisi belaka.
register-task-definition
memerlukan parameter Definisi Tugas atau JSON sebagai masukan. Mendapatkan itu dari describe-task-definition
menambahkan bidang kamus lapisan _and_ tambahan yang tidak valid untuk digunakan dengan register-task-definition
.
Setelah meratakan kamus tingkat atas:
$ 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
Saya pikir ini harus dibuka kembali sebagai permintaan fitur. Saat ini, pembaruan Tugas CLI untuk ECS, yang diperlukan untuk CI/CD, tidak langsung dan memerlukan trik tambahan.
Alur yang paling umum ditemukan di web adalah memanggil describe-task-definition
, mendapatkan definisi wadah darinya, mengubah parameter image
dan mendorongnya kembali dengan register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION
.
Menggunakan Fargate saya menemukan masalah dengan aliran ini - tugas tidak dapat diperbarui dengan JSON yang sama, itu memerlukan parameter tambahan, dan pada dasarnya saya harus meletakkan semua nilai tingkat atas dari describe-task
JSON sebagai register-task-definition
Parameter
Jadi solusi yang lebih baik bagi saya adalah menggunakan JSON sebagai input penuh untuk tugas tersebut, tetapi memiliki masalah sendiri yang disebutkan oleh @shatil. Akhirnya saya akhiri dengan skrip seperti ini:
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"
Terima kasih @m-radzikowski Saya sedikit memodifikasi solusi Anda sehingga juga berfungsi saat menggunakan git hash sebagai tag gambar alih-alih "terbaru". Membutuhkan beberapa variabel lingkungan untuk bekerja
```
set -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs explain-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(.compatibilities)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```
Ini statusnya apa? bagaimana kita bisa membuat revisi definisi tugas? Saya akan berpikir akan ada sesuatu seperti:
aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"
jadi ya saya mencari:
_ aws ecs update-task-definition _
Saya memeriksa menggunakan aws ecs help
dan tidak ada utilitas seperti itu:
Saya membuat tiket ini: https://github.com/aws/aws-cli/issues/4401
aws-cli support, jika tidak suka kita diskusikan saja jangan gunakan github, maaf ini masih valid dan harus dibuka kembali
Anda mungkin tidak perlu jq
:
aws describe-task-definition --task-definition myapp \
--query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
> /tmp/task-definitions.json
Pengguna Fargate mungkin memerlukan perintah panjang seperti ini:
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>
Sebagai pengguna fargate, saya telah menemukan peretasan yang digunakan untuk ecs cli dan --tags.
Apa pun yang Anda masukkan ke nomor versi, itu akan mengatur revisi sebagai yang berikutnya.
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'
Saya telah beralih ke Fargate CLI. Secara otomatis memperbarui definisi tugas yang sesuai.
Saya telah beralih ke Fargate CLI. Secara otomatis memperbarui definisi tugas yang sesuai.
Terima kasih telah berbagi itu - belum melihatnya. Nantikan untuk memeriksanya.
fargatecli tidak berfungsi jika Anda memiliki volume yang ditentukan
Anda mungkin tidak perlu
jq
:aws describe-task-definition --task-definition myapp \ --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \ > /tmp/task-definitions.json
Pengguna Fargate mungkin memerlukan perintah panjang seperti ini:
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>
Berikut adalah versi lengkap yang tidak memerlukan 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"
Menambahkan ke jawaban @sashokbg , register-task-definition mengeluh bahwa ia membutuhkan string untuk nilai cpu dan memori. Perintah --query menggunakan sintaks JMESPath, yang mendukung casting tipe to_string($arg), jadi bungkus saja keduanya dalam to_string()
Jika Anda hanya ingin memperbarui klaster ECS Anda untuk menggunakan gambar terbaru (tag dengan "terbaru"), ini sudah cukup:
aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment
Param --force-new-deployment
.
@oalagtash Terima kasih atas infonya. Aku akan mencobanya.
Komentar yang paling membantu
Terima kasih @m-radzikowski Saya sedikit memodifikasi solusi Anda sehingga juga berfungsi saat menggunakan git hash sebagai tag gambar alih-alih "terbaru". Membutuhkan beberapa variabel lingkungan untuk bekerja
```
!/bin/bash
Script untuk mendapatkan definisi tugas saat ini, dan berdasarkan itu tambahkan alamat gambar ecr baru ke template lama dan hapus atribut yang tidak diperlukan, kemudian kami mengirim definisi tugas baru, mendapatkan nomor revisi baru dari output dan layanan pembaruan
set -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs explain-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(.compatibilities)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```