はじめに
おはようございます、もきゅりんです。
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です。
さいごに
Arn (required) - The Amazon Resource Name (ARN) of the target.
て書いてあるけども、何を入れれば良いの?と思っていましたが、とりあえずコンソール画面で設定を試みて、何を入力すれば良さそうなのか目視確認して、クラスターARN と理解しました。
コード化するときも、基本はまずコンソールで触ってみる、が基本でございますね。
なお、rate スケジュールは設定後にすぐタスクが実行されて、その後にレート時間ごとに実行されていくのですね、使ったことがなかったので知りませんでした。
以上です。
どなたかの参考になれば幸いです。