AWS CDK で CloudFormation スタックの SNS 通知をスタック定義内に指定可能になりました

AWS CDK で CloudFormation スタックの SNS 通知をスタック定義内に指定可能になりました

Clock Icon2024.09.27

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最新のリリースである v2.160.0 で、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.160.0

core: configure Stack SNS notification ARNs on the Stack construct (#31107) (1593500), closes #8581

「CloudFormation スタックの SNS 通知」とは、ダッシュボード上だとスタックの詳細の以下のセクションで設定できる通知先のことです。

今まではこの通知設定は CDK デプロイコマンドの --notification-arns オプションで指定する必要がありましたが、今回のアップデートによりスタック定義内にコードで指定できるようになりました。

試してみた

CDK パッケージのアップデート

AWS CDK パッケージを v2.160.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

スタック定義内で通知を設定する

まず、通知を設定したいスタックのコンストラクターの第三引数が StackProps interface を持つようにします。

lib/cdk-sample-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

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

そしてスタックの初期化を行う定義で、第三引数に通知先に使用したい SNS トピックの ARN を指定します。

bin/cdk_sample_app.ts
import { App } from 'aws-cdk-lib';
import { CdkSampleStack } from '../lib/cdk-sample-stack';

const app = new App();

const accountId = process.env.CDK_DEFAULT_ACCOUNT;
const region = process.env.CDK_DEFAULT_REGION;

new CdkSampleStack(app, 'CdkSampleStack', {
  notificationArns: [`arn:aws:sns:${region}:${accountId}:test`], // SNS トピックの ARN を指定
});

上記をデプロイすると Notification options に SNS の ARN が追加されました。

また以下のようなメールが SNS トピックのサブスクリプション経由で早速五通届きました。

メール内容によるとスタックの次の五つのステータス変更の通知が立て続けに行われたことが分かります。

  1. ResourceStatus が UPDATE_IN_PROGRESS に変更
  2. ResourceStatusReason が User Initiated から空に変更
  3. ResourceStatus が UPDATE_COMPLETE に変更
  4. ResourceStatus が UPDATE_COMPLETE_CLEANUP_IN_PROGRESS に変更
  5. ResourceStatus が UPDATE_COMPLETE に変更

通知をフィルターしたい場合

前述の通りデフォルトではすべてのステータス変更のたびに通知が行われますが、特定のステータスへの変更のみ通知をさせたい場合もあると思います。

その場合は下記のサブスクリプションフィルターを使用するか、
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-subscription-filter-policies.html

そもそも別の仕組みとして EventBridge Rule を使ってステータスの変更を検知するという方法もあります。
https://repost.aws/knowledge-center/cloudformation-rollback-email

CDK コマンドの --notification-arns オプションを組み合わせた場合

前述の CDK コードの記載は変えずに、--notification-arn をオプションを指定したコマンドで再度デプロイしてみるとどうなるでしょうか。スタック定義では test、コマンドのオプションでは test2 が指定されています。

npx cdk deploy --notification-arns "arn:aws:sns:${CDK_DEFAULT_REGION}:${CDK_DEFAULT_ACCOUNT}:test2"

するといずれの SNS トピックも通知先に設定されました。どちらかが片方を上書きするのではなく、両方の組み合わせとなるようです。

おわりに

AWS CDK で CloudFormation スタックの SNS 通知をスタック定義内に指定可能になったのでご紹介しました。

コマンドのオプションではなくスタック定義内に直接指定できるようになったことで、別スタックで作成したトピックをクロススタック参照で指定するなど、通知先の管理もしやすくなったのではないでしょうか。

ただ前述の通りデフォルトだとすべてのステータス変更が通知されるため、通知の適度なフィルタリングは行いたいところです。

参考

https://github.com/aws/aws-cdk/issues/8581

以上

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.