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

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

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

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

コード

今回はFargateで動いている既存のタスク定義にX-Rayコンテナを導入してみます。 hostPortも3000で固定しているため、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: "udp"
    }
  ],
  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関数を作成し、

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

35行目の const list = []内に変更したいタスク定義の名前を追加し、右上から適当なテストイベントを作成し、実行します。

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

注意

X-Rayを利用する際、 xray:PutTraceSegmentsxray:PutTelemetryRecords を利用できるタスクロールをタスク定義で追加しないといけません。

本コードでは既存のタスクロールを上書きしてしまう事故が起こる可能性があるため、あえてタスクロールを書き換えていません。

タスクロールもまとめて書き換えたい場合、47行目あたりに

taskDefinition.taskRoleArn = arn:aws:iam::${AccountID}:role/ECSTaskRolePolicy

のようにARNを指定すると、まとめて指定することが出来ます。

まとめ

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

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