Aws-cli: awsecs-タスク定義を更新する方法

作成日 2017年12月29日  ·  18コメント  ·  ソース: aws/aws-cli

ECSタスク定義に新しいリビジョンを追加する方法はありますか?

私の場合、コマンドラインを使用してCDパイプラインのコンテナURLを更新したいと思います。 ドキュメントにその方法がないか、現在管理コンソールを使用している場合にのみ可能ですか?

https://github.com/aws/amazon-ecs-cli/issues/91を参照して

guidance

最も参考になるコメント

ありがとう@ m-radzikowskiソリューションを少し変更したので、「最新」の代わりにgitハッシュを画像タグとして使用した場合にも機能します。 ただし、機能するにはいくつかの環境変数が必要です
`` `

!/ bin / bash

現在のタスク定義を取得するスクリプト。これに基づいて、古いテンプレートに新しいecrイメージアドレスを追加し、不要な属性を削除します。次に、新しいタスク定義を送信し、出力から新しいリビジョン番号を取得して、サービスを更新します。

セット-e
ECR_IMAGE = "$ {AWS_ACCOUNT_ID} .dkr.ecr。$ {AWS_DEFAULT_REGION} .amazonaws.com / $ {IMAGE_REPO_NAME}:$ {CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION = $(aws ecs describe-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} `` `

全てのコメント18件

うーん、よくわかりません。 一般に、 READMEで説明されているように、使用法に関連する質問に最適な場所はスタックオーバーフローです。

ただし、ドキュメントを見ると、 register-task-definitionを使用するだけで新しいリビジョンが作成されるようです。 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).

私は最初にそれを撃ちます。

ありがとう、騒音でごめんなさい。 私はそれがupdate-serviceような他のものと一致する別個のコマンドであることを期待していました

こんにちは@Extrawurst私は同じ問題を抱えています。 あなたが解決策を見つけたかどうか疑問に思いました。

こんにちは@ menocomp @ jameslsの回答を参照してください。 register-task-definitionを使用するだけで、ファミリがすでに存在する場合は新しいリビジョンが作成されます

register-task-definitionは、リビジョン番号の単なるバンプを達成するための満足のいく方法ではありません。

register-task-definitionは、入力としてタスク定義パラメーターまたはJSONが必要です。 describe-task-definitionからそれを取得すると、 register-task-definitionでの使用に無効な追加の辞書レイヤー_および_フィールドが追加されます。

トップレベルの辞書をフラット化した後:

$ 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

これは機能リクエストとして再開する必要があると思います。 現在、CI / CDに必要なECSTask updateのCLIは単純ではなく、追加のトリックが必要です。

Webで最も一般的に見られるフローは、 describe-task-definitionを呼び出し、そこからコンテナー定義を取得し、 imageパラメーターを変更して、 register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITIONプッシュバックすることです。

Fargateを使用すると、このフローで問題が発生しました。タスクを同じJSONで更新できず、追加のパラメーターが必要でした。基本的に、 describe-task JSONのすべてのトップレベル値をregister-task-definitionパラメータ(CPU、メモリなど)。

したがって、私にとってより良い解決策は、タスクの完全な入力としてJSONを使用することでしたが、@ shatilによって言及された独自の問題があります。 最後に、次のようなスクリプトで終了しました。

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"

ありがとう@ m-radzikowskiソリューションを少し変更したので、「最新」の代わりにgitハッシュを画像タグとして使用した場合にも機能します。 ただし、機能するにはいくつかの環境変数が必要です
`` `

!/ bin / bash

現在のタスク定義を取得するスクリプト。これに基づいて、古いテンプレートに新しいecrイメージアドレスを追加し、不要な属性を削除します。次に、新しいタスク定義を送信し、出力から新しいリビジョン番号を取得して、サービスを更新します。

セット-e
ECR_IMAGE = "$ {AWS_ACCOUNT_ID} .dkr.ecr。$ {AWS_DEFAULT_REGION} .amazonaws.com / $ {IMAGE_REPO_NAME}:$ {CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION = $(aws ecs describe-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} `` `

これの状況はどうですか? タスク定義のリビジョンを作成するにはどうすればよいですか? 私は次のようなものがあると思います:

aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"

そうです、私は探しています:

_ aws ecs update-task-definition _

aws ecs helpを使用して確認しましたが、そのようなユーティリティはありません。


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


このチケットを作成しました: https

aws-cliサポート、議論したくない場合はgithubを使用しないでください、申し訳ありませんが、これはまだ有効であり、再度開く必要があります

jqは必要ないかもしれません:

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargateユーザーは、次のような長いコマンドが必要になる場合があります。

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>

ファーゲートユーザーとして、ecscliと--tagsを使用するハックを見つけました。

バージョン番号に何を入力しても、リビジョンが次のリビジョンに設定されます。

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'

FargateCLIに切り替えました。 適切なタスク定義を自動的に更新します。

https://github.com/awslabs/fargatecli

FargateCLIに切り替えました。 適切なタスク定義を自動的に更新します。

https://github.com/awslabs/fargatecli

それを共有してくれてありがとう-それを見ていませんでした。 ぜひチェックしてみてください。

ボリュームが定義されている場合、fargatecliは機能しません

jqは必要ないかもしれません:

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargateユーザーは、次のような長いコマンドが必要になる場合があります。

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>

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"

@sashokbgの答えに加えて、register-task-definitionは、CPUとメモリの値に文字列が必要であると不平を言っています。 --queryコマンドは、to_string($ arg)型キャストをサポートするJMESPath構文を使用するため、これら2つをto_string()でラップするだけです。

最新のイメージ(「latest」のタグ)を使用するようにECSクラスターを更新するだけの場合は、これで十分です。

aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment

--force-new-deploymentパラメータがそのトリックを実行します。

@oalagtash情報をありがとう。 私はそれを試してみます。

このページは役に立ちましたか?
0 / 5 - 0 評価