AWS SDK for JavaScript を使って ECSタスクスケジュールを設定する

2022.08.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、もきゅりんです。

Shall we ecs ?

タイトルのような検証があったため、ブログにしておきました。

やること

このブログでやることは、以下です。

AWS SDK for JavaScript (V3) を使って、 ECSタスクスケジュールを設定します。

前提として、ECSタスクを実行するためのECSクラスターやタスク定義などのリソースはすでに準備されているとします。

環境

  • node 16.17.0
  • npm 8.15.0
  • typescript 4.7.4
  • @aws-sdk/client-eventbridge/3.154.0

実行する

環境変数およびサブネットIDやセキュリティグループIDは環境に合わせて、よしなに放り込んで下さい。

細かいパラメータの調整は、文末の参考URLをご参照下さい。

import {
  EventBridgeClient,
  PutRuleCommand,
  PutRuleCommandInput,
  PutTargetsCommand,
  PutTargetsCommandInput,
} from '@aws-sdk/client-eventbridge';

const REGION = process.env.REGION;
const eventBridgeIamRoleArn = process.env.eventBridgeIamRoleArn;
const ecsClusterArn = process.env.ecsClusterArn;
const taskDefArn = process.env.taskDefArn;

export const client = new EventBridgeClient({ region: REGION });

const main = async () => {
  const ebRuleParams: PutRuleCommandInput = {
    Name: 'DEMO_EVENT_RULE',
    RoleArn: eventBridgeIamRoleArn,
    ScheduleExpression: 'cron(0/5 * * * ? *)',
    State: 'ENABLED',
  };

  const ebTargetParams: PutTargetsCommandInput = {
    Rule: 'DEMO_EVENT_RULE' /* required */,
    Targets: [
      /* required */
      {
        Arn: ecsClusterArn /* required */,
        RoleArn: eventBridgeIamRoleArn,
        Id: 'ecs-task-target' /* required */,
        EcsParameters: {
          TaskDefinitionArn: taskDefArn /* required */,
          EnableExecuteCommand: true,
          EnableECSManagedTags: true,
          LaunchType: 'FARGATE',
          NetworkConfiguration: {
            awsvpcConfiguration: {
              Subnets: [
                /* required */
                'subnet-exxxxxx',
                'subnet-dxxxxxx',
              ],
              AssignPublicIp: 'ENABLED',
              SecurityGroups: ['sg-0xxxxxxxxxxxxxx'],
            },
          },
          PropagateTags: 'TASK_DEFINITION',
          TaskCount: 1,
        },
        Input: '{"env":"dev"}',
      },
    ],
  };
  try {
    const res = await client.send(new PutRuleCommand(ebRuleParams));
    console.log('Success', res.RuleArn);
    const targetRes = await client.send(new PutTargetsCommand(ebTargetParams));
    console.log('Success', targetRes);
  } catch (err: unknown) {
    console.error(err);
  }
};
main();
$ REGION=ap-northeast-1
$ ts-node index.ts
Success arn:aws:events:ap-northeast-1:xxxxxxxx:rule/DEMO_EVENT_RULE
Success {
  '$metadata': {
    httpStatusCode: 200,
    requestId: '0d92fc69-4a78-40ad-8087-39881a86e463',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  FailedEntries: [],
  FailedEntryCount: 0
}

こんな感じで入力値を含んだイベントスケジュールが作成されればOKです。

ecs_image

さいごに

Arn (required) - The Amazon Resource Name (ARN) of the target. て書いてあるけども、何を入れれば良いの?と思っていましたが、とりあえずコンソール画面で設定を試みて、何を入力すれば良さそうなのか目視確認して、クラスターARN と理解しました。

コード化するときも、基本はまずコンソールで触ってみる、が基本でございますね。

なお、rate スケジュールは設定後にすぐタスクが実行されて、その後にレート時間ごとに実行されていくのですね、使ったことがなかったので知りませんでした。

以上です。

どなたかの参考になれば幸いです。

参考