はじめに
ECSデプロイのフローをGitHub Actionsで実装中、タスク定義を取得する方法が大きく分けて2種類あることが分かりました。
今回その2種類の解説を記事にしました。
まず結論
1.AWS CLIでタスク定義(taskDefinitionの値のみ)を取得
workflow.yml
env:
ECS_TASK_DEFINITION: task-definition
CONTAINER_NAME: my-container
steps:
- name: Amazon ECRへのログイン
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: タスク定義のダウンロード
run: |
aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > task-definition.json
- name: タスク定義に新しいイメージIDを記入
id: update-task-definition
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.login-ecr.outputs.registry }}/my-image:latest
2.別ファイルに記述したタスク定義を取得
env:
ECS_TASK_DEFINITION: .aws/task-definition.json
CONTAINER_NAME: my-container
steps:
- name: Amazon ECRへのログイン
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: タスク定義に新しいイメージIDを記入
id: update-task-definition
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.login-ecr.outputs.registry }}/my-image:latest
1.AWS CLIでタスク定義(taskDefinitionの値のみ)を取得
作成済みのタスク定義リソースからtaskDefinitionの値を抽出しJSONに出力、それを取得します。
Terraformを使用しない場合、AWSマネジメントコンソールから必要に応じてタスク定義を修正します。差分管理ができないので、小さい個人開発向けでしょうか?
aws ecs describe-task-definition --task-definition ${{ env.ECS_TASK_DEFINITION }} --query taskDefinition > task-definition.json
取得する値
{
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:012345678987:task-definition/task-definition:1",
"containerDefinitions": [
{
"name": "nginx",
"image": "nginx:latest",
"cpu": 256,
"memory": 300,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true
}
],
"family": "task-definition",
"networkMode": "bridge",
"revision": 1,
"status": "ACTIVE",
"requiresCompatibilities": ["EC2"]
}
2.別ファイルに記述したタスク定義を取得
タスク定義のファイルを作成し、それを取得します。
Terraformを使用しない場合、必要に応じて別ファイルを修正します。こちらは差分管理が出来ます。
env:
ECS_TASK_DEFINITION: .aws/task-definition.json
# ...
task-definition: ${{ env.ECS_TASK_DEFINITION }}
.aws/task-definition.json
{
"family": "task-definition",
"networkMode": "bridge",
"containerDefinitions": [
{
"name": "nginx",
"image": "nginx:latest",
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"memory": 300,
"cpu": 256
}
],
"requiresCompatibilities": ["EC2"]
}
Terraformの場合、AWS CLIでタスク定義を取得しよう。
わざわざ別ファイル(JSON)を作成する必要はないです。差分、インフラ管理が苦しくなるだけですね(笑)
あとがき
私はTerraformを使用しているのでAWS CLIを使用します。タスク定義を記述しているファイル内にクラスターやサービス、ボリューム、環境変数の設定などの記述もあるのでECSの構築が一目瞭然、非常に分かりやすいです!