Aws-cli: aws ecs - cara memperbarui definisi tugas

Dibuat pada 29 Des 2017  ·  18Komentar  ·  Sumber: aws/aws-cli

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)

guidance

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

Semua 18 komentar

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

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

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:


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


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.

https://github.com/awslabs/fargatecli

Saya telah beralih ke Fargate CLI. Secara otomatis memperbarui definisi tugas yang sesuai.

https://github.com/awslabs/fargatecli

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat