Fargateタスク停止時のイベントに関するAmazon SNSアラートを送信するチュートリアルをAWS CDKで実装してみた

こんにちは。サービスグループの武田です。

Fargateやってますか(挨拶)。Fargateを使って簡単なシステムを作っていたら、タスク停止時にアラートを通知する設定をしておくと幸せになれるというアドバイスをもらいました。公式ドキュメントにチュートリアルがありますので、今回はこれをCDKで実装してみました。

チュートリアル: タスク停止時のイベントに関する Amazon Simple Notification Service アラートを送信する - Amazon Elastic Container Service

ソースコード全体はGitHubに上げてあります。

TAKEDA-Takashi/tutorial-fargate-task-stopped-alert

環境

検証環境は次のようになっています。

1
2
3
4
5
6
7
$ sw_vers
ProductName:  Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G1012
 
$ node -v
v10.16.3

やってみた

それでは実際に構築した手順をさらっていきます。前述のとおりGitHubにソースコード一式は上げてありますが、実際に試す際には通知先のアドレスを受信可能なアドレスに変更してからnpx cdk deployをしてください。

tutorial-fargate-task-stopped-alert/tutorial-fargate-task-stopped-alert-stack.ts at master · TAKEDA-Takashi/tutorial-fargate-task-stopped-alert

まずはプロジェクトを作成して必要なモジュールをインストールします。

1
2
3
$ cd /path/to/
$ mkdir tutorial-fargate-task-stopped-alert && cd $_ && npx -p aws-cdk cdk init --language typescript
$ npm install @aws-cdk/{aws-ec2,aws-ecs-patterns,aws-events,aws-events-targets,aws-sns-subscriptions,aws-applicationautoscaling}

次にチュートリアルで行っている内容をCDKで実装します。基本的には同じように実装していますが、Fargateタスクは手作業ではなく5分間隔で定期実行されるようにしています。スタックを片付けるまでひたすらアラートメールも飛んできますので注意してください。

import * as cdk from '@aws-cdk/core';
import * as ec2 from '@aws-cdk/aws-ec2';
import * as ecs from '@aws-cdk/aws-ecs';
import * as targets from '@aws-cdk/aws-events-targets';

import { ScheduledFargateTask } from '@aws-cdk/aws-ecs-patterns';
import { Schedule } from '@aws-cdk/aws-applicationautoscaling';
import { Topic } from '@aws-cdk/aws-sns';
import { EmailSubscription } from '@aws-cdk/aws-sns-subscriptions';
import { Rule } from '@aws-cdk/aws-events';

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

   
const vpc = new ec2.Vpc(this, 'Vpc', {
      cidr
: '10.0.0.0/16',
      maxAzs
: 1,
   
});

   
const cluster = new ecs.Cluster(this, 'Cluster', {
      vpc
,
   
});

   
const task = new ScheduledFargateTask(this, 'ScheduledFargateTask', {
      cluster
,
      schedule
: Schedule.expression('cron(0/5 * * * ? *)'),
      scheduledFargateTaskImageOptions
: {
        memoryLimitMiB
: 512,
        cpu
: 256,
        command
: [
         
'sh',
         
'-c',
         
'sleep 5',
       
],
        image
: ecs.ContainerImage.fromRegistry('amazonlinux:2'),
     
},
   
});

   
const taskStoppedAlert = new Topic(this, 'TaskStoppedAlert', {
      topicName
: 'TaskStoppedAlert',
   
});

    taskStoppedAlert
.addSubscription(new EmailSubscription('alert@example.com'));

   
new Rule(this, 'Rule', {
      eventPattern
: {
        source
: ['aws.ecs'],
        detailType
: ['ECS Task State Change'],
        detail
: {
          lastStatus
: ['STOPPED'],
          stoppedReason
: ['Essential container in task exited'],
       
},
     
},
      targets
: [new targets.SnsTopic(taskStoppedAlert)],
   
});
 
}
}

デプロイ前に、Stackをnewする際にリージョン情報などをenvとして渡すように実行ファイルを修正しておきます。

#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { TutorialFargateTaskStoppedAlertStack } from '../lib/tutorial-fargate-task-stopped-alert-stack';

const env = {
    account
: process.env.CDK_DEFAULT_ACCOUNT,
    region
: process.env.CDK_DEFAULT_REGION || 'ap-northeast-1',
};

const app = new cdk.App();
new TutorialFargateTaskStoppedAlertStack(app, 'TutorialFargateTaskStoppedAlertStack', {
    env
,
});

それではデプロイしてみます。

1
$ npx cdk deploy

デプロイされると、SNSのサブスクリプション確認メールが飛んできます。リンクをクリックして承諾します。

その後、しばらく待っているとタスクが起動して停止するはずです。実際に停止されると次のようなメールが飛んできました。

きちんとアラートが送信されましたね!

まとめ

チュートリアルも用意されており、簡単にFargateタスクの停止を検知するしくみを試すことができました。またCDKで簡単に環境の構築/破棄もできて便利ですね。引き続き、いろいろ試してアウトプットしていきます!