AWS SDKを利用して既存のタスク定義にコンテナを追加する

今回は既存のタスク定義に追加でコンテナを追加するLambda関数を作成してみました。「タスク定義にX-Rayをサクッと突っ込みたい」場合などにお使いください!
2019.09.20

もこ@札幌オフィスです。一瞬で夏が過ぎて、もう札幌は最低気温11℃くらいになってしまっています。

さて、今回は既存のタスク定義に追加でコンテナを追加するLambda関数を作成してみました。

コード

今回はFargateで動いている既存のタスク定義にX-Rayのコンテナを導入してみます。

X-Rayではポート2000を利用する動作をするため、ポートマッピングで設定してあげる必要があります。

今回はFargateを利用しているためhostPortを2000と設定していますが、Fargateを使わない場合はhostPort部分を0に書き換える必要があるかもしれません。

const AWS = require("aws-sdk");
const ECS = new AWS.ECS({ region: "ap-northeast-1" });

const daemon = {
  name: "xray-daemon",
  image: "amazon/aws-xray-daemon",
  cpu: 32,
  memoryReservation: 256,
  portMappings: [
    {
      hostPort: 2000,
      containerPort: 2000,
      protocol: "tcp",
    },
  ],
  logConfiguration: {
    logDriver: "awslogs",
    secretOptions: [],
    options: {
      "awslogs-group": "/ecs/logs/sample-fargate-xray-group",
      "awslogs-region": "ap-northeast-1",
      "awslogs-stream-prefix": "sample-fargate-xray",
    },
  },
  environment: [
    {
      name: "AWS_XRAY_DAEMON_ADDRESS",
      value: "",
    },
  ],
};

exports.handler = async (event) => {
  const list = [
    "ここに追加したいTaskDefinitionの名前を入れます",
    "複数のTaskDefinitionにも対応しています",
  ];
  for (const service of list) {
    const taskDefinition = (
      await ECS.describeTaskDefinition({ taskDefinition: service }).promise()
    ).taskDefinition;

    // registerTaskDefinitionに使えるように整形
    delete taskDefinition.taskDefinitionArn;
    delete taskDefinition.revision;
    delete taskDefinition.status;
    delete taskDefinition.requiresAttributes;
    delete taskDefinition.compatibilities;

    // xray daemon注入
    const xray = daemon;
    xray.logConfiguration.options[
      "awslogs-group"
    ] = `/ecs/logs/${service}-xray-group`;
    xray.logConfiguration.options["awslogs-stream-prefix"] = `${service}-xray`;
    xray.name = `${service}-xray`;
    // describeTaskDefinitionで取ってきた既存の環境にX Ray DaemonのJSONをPushする
    taskDefinition.containerDefinitions.push(xray);
    // タスクを登録
    const registerTaskDefinition = await ECS.registerTaskDefinition(
      taskDefinition
    ).promise();
    console.log(registerTaskDefinition);
  }
};

使い方

aws-sdkを利用する場合、ローカルで実行する方法とLambda上で実行する方法がありますが、aws-sdkをインストールする必要がないLamda上でやっていきます。

Lambda関数を作成し、

そのまま上記コードをコピペします。

Lambda関数にECSの設定を変更するIAM Policyを追加で付与して上げた上で、35行目の const list = [] 内に変更したいタスク定義の名前を追加し、適当なテストイベントを作成し、実行します。

ECSのタスク定義を確認し、追加することができれば成功です!

まとめ

「タスク定義にX-Rayをサクッと突っ込みたい」場合などにお使いください!

今回はX-Ray Daemonの追加の場合のサンプルコードでしたが、少し改良すれば他のコンテナを作成することも出来ますので、是非ご活用ください!