
CloudFormation の失敗を Slack に通知する仕組みを AWS CDK で実装してみた
こんにちは!製造ビジネステクノロジー部の小林です。
CloudFormationのデプロイが失敗することはありませんか?デプロイは時間がかかるので、待っている間に他の作業を進めることが多いのですが、集中しすぎて気がついたら失敗していた...という経験を先日しました。
こういう時、Slackに通知が来れば気づきやすそうですよね。
そこで今回は、CloudFormationのデプロイ失敗をSlackに通知する仕組みをAWS CDKで実装してみました。
参考記事について
基本的には以下の記事を参考にしています。以下の記事ではCloudFormationの失敗通知をSNS経由でメールに送信する実装を紹介しています。
この内容をベースにSlack通知版にカスタマイズしてみました。やってみた
今回実装するのは以下の構成です。
Slackの準備
今回の実装では、SlackのワークスペースIDとチャンネルIDが必要になるので、以下の手順で取得します。
Slackデスクトップ版で、左上にあるワークスペースアイコンをクリックします。
対象のワークスペースの2行目にあるURLをブラウザに入力します。
SlackのWeb版が開いたら、通知を送信したいチャンネルをクリックします。
チャンネルを選択した状態でURLを確認します。
ワークスペースID: Tから始まる部分
チャンネルID: Cから始まる部分
2つとも取得できましたね!この情報は以下のCDKで利用します。
CDKの実装
AWS CDK の実装コードは以下の通りです。
import * as cdk from 'aws-cdk-lib';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
import * as chatbot from 'aws-cdk-lib/aws-chatbot';
import { Construct } from 'constructs';
export class CloudformationNotificationStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// SNSトピックの作成
const topic = new sns.Topic(this, 'Topic');
// EventBridge ルールを作成
const eventRule = new events.Rule(this, "EventRule", {
eventPattern: {
source: ["aws.cloudformation"],
detailType: ["CloudFormation Stack Status Change"],
detail: {
"status-details": {
// @see https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/view-stack-events.html#cfn-console-view-stack-data-resources-status-codes
status: [
"CREATE_FAILED",
"DELETE_FAILED",
"IMPORT_ROLLBACK_COMPLETE",
"IMPORT_ROLLBACK_FAILED",
"ROLLBACK_COMPLETE",
"ROLLBACK_FAILED",
"UPDATE_FAILED",
"UPDATE_ROLLBACK_COMPLETE",
"UPDATE_ROLLBACK_FAILED",
],
},
},
},
});
// EventBridge のターゲットとして SNS を設定
eventRule.addTarget(new targets.SnsTopic(topic));
// Amazon Q Developer in chat applicationsの設定
new chatbot.SlackChannelConfiguration(this, 'SlackChannel', {
slackChannelConfigurationName: this.node.path.replace(
/[^a-zA-Z0-9-_]/g,
'-'
),
slackWorkspaceId: 'TXXXXXXXXXX', // ワークスペースIDを指定
slackChannelId: 'C09GTCHGE1H', // チャンネルIDを指定
notificationTopics: [topic],
});
}
}
上記 CDK スタックをデプロイします。
デプロイ時のエラー対応
デプロイ時に以下のエラーが発生しました。
❌ CloudformationNotificationStack failed: ToolkitError: The stack named CloudformationNotificationStack failed creation, it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE: Resource handler returned message: "Invalid request provided: Unable to create the configuration because Slack workspace TXXXXXXXXXX is not authorized with AWS account XXXXXXXXXXXX. See https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html#slack-client-setup (Service: AWSChatbot; Status Code: 400; Error Code: InvalidRequestException; Request ID: b9f94e52-d2fc-480e-a534-ff4c48618278; Proxy: null)" (RequestToken: 29524f86-b67d-156c-9f8f-05024094b385, HandlerErrorCode: InvalidRequest)
このエラーは、Amazon Q Developer in chat applications (旧称: AWS Chatbot)とSlackワークスペースの連携が事前に設定されていないことが原因でした。CDKでChatbot設定をデプロイする前に、手動でSlackワークスペースとの連携を行う必要があります。
Amazon Q Developer in chat applications(旧称: AWS Chatbot) の設定
AWSマネジメントコンソールから必要な設定を行います。
Amazon Q Developer in chat applications にアクセスし、チャットクライアントで「Slack」を選択し、クライアントを設定します。
Slackとの連携画面が表示されるので、対象のワークスペースを選択して許可します。
Amazon Q Developer in chat applicationsとワークスペースの連携が完了しました。
これでSlackワークスペースとの連携が完了したので、再度CDKをデプロイしてSlackチャンネルとの連携を行います。今度は成功するはずです。
動作確認
参考記事と同様の方法で動作確認を行います。
動作確認として、意図的に CloudFormation スタックのデプロイを失敗させてみます。例えば、グローバルでユニークな名前を要求するリソース(S3 バケットなど)を作成しようとすると、同じ名前のバケットが存在する場合にデプロイが失敗します。
意図的にCloudFormationのデプロイを失敗させた結果、以下のようにスタックの作成が失敗しました。
すると、CloudFormationのデプロイ失敗と同時に、Slackチャンネルへ以下の通知が届きました。
通知が正常に動作していることが確認できました!
おわりに
CloudFormationのデプロイ失敗をSlackに通知する仕組みを実装しました。これで他の作業に集中していてもデプロイの失敗にすぐ気づけるようになりますね。
この記事がどなたかの参考になれば幸いです。