📝

CDK で JSON ファイルを読み込んで ECS タスク定義を作成してみた

に公開

class CfnTaskDefinition (construct) · AWS CDK
本記事執筆時点では JSON ファイルを読み込んで ECS タスク定義を作成する機能は提供されていないため、ファイル読み込みライブラリを使用して実現しました。

コード

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { CfnTaskDefinition } from 'aws-cdk-lib/aws-ecs';
import * as fs from 'fs';
import * as path from 'path';

export class SampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // JSON ファイル読み込み
    const taskDefJson = JSON.parse(fs.readFileSync(path.join(__dirname, 'taskdef.json'), 'utf8'));

    const taskDefinition = new CfnTaskDefinition(this, 'TaskDef', {
      family: taskDefJson.family,
      executionRoleArn: taskDefJson.executionRoleArn,
      networkMode: taskDefJson.networkMode,
      containerDefinitions: taskDefJson.containerDefinitions,
      volumes: taskDefJson.volumes || [],
      requiresCompatibilities: taskDefJson.requiresCompatibilities,
      cpu: taskDefJson.cpu,
      memory: taskDefJson.memory,
      runtimePlatform: taskDefJson.runtimePlatform,
    });
  }
}

上記コードで読み込んだ taskdef.json は ECS コンソールからコピーした定義です。

{
    "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:012345678901:task-definition/test:65",
    "containerDefinitions": [
        {
            "name": "httpd",
            "image": "httpd",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "httpd-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "ulimits": [],
            "systemControls": []
        }
    ],
    "family": "test",
    "executionRoleArn": "arn:aws:iam::012345678901:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "revision": 65,
    "volumes": [],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "ecs.capability.task-eni"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2",
        "FARGATE"
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "3072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2025-04-24T23:28:29.249Z",
    "registeredBy": "arn:aws:sts::012345678901:assumed-role/xxx/xxx",
    "enableFaultInjection": false,
    "tags": []
}

GitHub Issue

CfnTaskDefinition/TaskDefinition/Ec2TaskDefinition/FargateTaskDefinition: Import properties from external file · Issue #34251 · aws/aws-cdk
CDK の組み込みの機能として実装してほしい旨の Issue は作成されていたので今後の機能追加に期待です。

まとめ

今回は CDK で JSON ファイルを読み込んで ECS タスク定義を作成してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion