1
3

More than 1 year has passed since last update.

GitHub ActionsでECSのタスク定義を取得する2つの方法

Posted at

はじめに

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の構築が一目瞭然、非常に分かりやすいです!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3