ECSタスク定義に新しいリビジョンを追加する方法はありますか?
私の場合、コマンドラインを使用してCDパイプラインのコンテナURLを更新したいと思います。 ドキュメントにその方法がないか、現在管理コンソールを使用している場合にのみ可能ですか?
うーん、よくわかりません。 一般に、 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ハッシュを画像タグとして使用した場合にも機能します。 ただし、機能するにはいくつかの環境変数が必要です
`` `
セット-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
を使用して確認しましたが、そのようなユーティリティはありません。
このチケットを作成しました: 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に切り替えました。 適切なタスク定義を自動的に更新します。
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情報をありがとう。 私はそれを試してみます。
最も参考になるコメント
ありがとう@ 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} `` `