はじめまして。ニフティ新卒4年目の島田です。
最近AWS Certified Solutions Architect – Professionalを取得したので知り合いに自慢して回るのが趣味です。
https://www.credly.com/badges/64ffbc6a-6883-4040-b00a-9262e3827e3d/public_url
先日開催された社内イベント、TechDayのLTセッションでも発表した内容を、改めて技術寄りに紹介しようと思います。
よろしくおねがいします。
@nifty MAX光
https://setsuzoku.nifty.com/max/
最近自分が関わったプロダクトの話です。
@nifty MAX光では主に申込システムを作っていました。
フルAWSで構成されており、かんたんなバッチ処理の構成図は以下のようになっています。
バッチ処理はFargateタスクで稼働しており、14の処理が各々のタイミングで起動します。
今回はこのバッチ処理が起動、停止、異常終了したときの通知をしたい、という内容です。
Amazon ECSをContainer Insightsでモニタリングする
Amazon ECSはAWSが用意したコンテナ実行基板上でコンテナを起動できるコンテナオーケストレーションサービスです。
利用者はローカルで、例えばDocker等を利用して開発したコンテナをそのままAWS上で実行する事ができます。
今回は特にコンピューティングリソースにAWS Fargateを利用しているため、サーバを意識せず開発に集中できるのが魅力です。
非常に便利なAmazon ECSですが、Container Insightsを有効化することでモニタリングについても優位性を発揮します。
Container Insightsはクラスター作成時に有効化することが出来ます。
クラスター作成済だとコンソールからは変更できず、CLIで以下コマンドを実行することで有効化出来ます。
1 |
aws ecs update-cluster-settings --cluster cluster-name --settings name=containerInsights,value=enabled |
これでコンテナの状態をモニタリングできるようになりました。
AWS Chatbotでslack通知する
slack通知はwebhookやslack appではなくAWS Chatbotにやってもらいます。
AWS Chatbotを利用すると簡単な通知(例えばAWS code deployの通知など)が行えます。
まずAWS ChatbotでサブスクライブするAmazon SNSトピックを作成します。
スタンダードキューを選択します。
AWS ChatbotにチャンネルID、権限、SNSトピックを適切に設定します。
“テストメッセージを送信”を押してメッセージが届けばAWS Chatbot -> slackの連携はokです。
Amazon EventBridgeでタスクの状態変化を検知する
個人的に感動しているサービスです。
過去にはAmazon CloudWatch Eventsとして提供されていましたが、現在はイベント制御部分がこのサービスに集約されています。
ルールを作成からイベントルールを作成します。
タスクの状態変更をイベントパターンで定義するので、”イベントパターンを持つルール” を選択します。
イベントパターンを定義します。
イベントパターンのフォームからでもある程度入力できます。
今回はタスクの開始を通知してみます。lastStatusが”RUNNING”のとき、という条件をつけます。
ターゲットはAWS ChatbotがサブスクライブしているSNSトピックを指定します。
この状態でタスクを起動すると、ステータスが”RUNNING”になったタイミングで通知されました。
デフォルトの通知がイマイチなときは、インプットトランスフォーマーを利用して欲しい情報のみを表示することもできます。
今回はコンテナオーバーライドで実行時に上書きしているコマンドの3番目が重要なので、commandというキーで取得しています。
command以外の項目はAWS Chatbotで利用する必須項目(多分)なので、使わなくても渡す必要があります。
テンプレートはAWS Chatbotにメッセージとして渡す値なのでslackに表示したい形式にしています。
1 2 3 4 5 6 7 8 9 10 |
{ "account": "$.account", "id": "$.id", "jobId": "$.detail.jobId", "region": "$.region", "source": "$.source", "time": "$.time", "version": "$.version", "command": "$.detail.overrides.containerOverrides[0].command[2]" } |
1 |
{"version": "<version>","id": "<id>","detail-type": "ECS Task Started :arrow_forward:","source": "<source>","account": "<account>","time": "<time>","region": "<region>","resources": ["command: `<command>`", "time: <time>"]} |
これでタスクを開始したときにslackに通知が来るようになりました。
同じ要領でイベントパターンとインプットトランスフォーマーを変更すると色々な通知を簡単に送ることが出来ます。
最後に
無事Amazon ECSタスク開始をAWS Chatbotでslackに通知できるようになりました。
今回は問題なく利用できていますが、インプットトランスフォーマーを利用する部分についてドキュメントに以下のような記載があります。
Q: AWS Chatbot を使用して任意の通知を受け取ることができますか?
いいえ。AWS Chatbot は、ドキュメントに記載されているサービスからの通知のみをサポートしています。サポート対象外のソースからのイベントはチャットチャネルに配信されません。
4. 詳細ページの [Input] (入力) セクションに [Input Transformer] (入力トランスフォーマー) がリストされているかどうかを確認します。[Input Transformer] (入力トランスフォーマー) がリストされている場合は、ルールから入力トランスフォーマーを削除します。
AWS Chatbotに渡す値を変更する方法は自己責任でお試しください。
個人的にslackへの通知用にwebhookを取ったりするのが面倒なので、AWSとslackさえ繋がっていればいいこの方法は有用だと思っています。
Amazon CloudWatch EventsがAmazon EventBridgeになりできることが増えたことで、より面白い事ができている気がします。
今後のAWSのアップデートも楽しみです。