Amazon EventBridge 通知に対する、Amazon Simple Notification Service (Amazon SNS) メールのデフォルト件名である "AWS Notification Message" をカスタマイズしたいと考えています。
簡単な説明
Amazon SNS は、メール配信のイベントソースとして機能する AWS サービスで作成された EventBridge ルールからの通知をメールで受信します。メールサブスクリプションが設定された Amazon SNS トピックをトリガーする AWS サービスが存在する場合は、メール件名 AWS Notification Message を直接変更できません。
解決策
デフォルトのメール件名をカスタマイズするための AWS Lambda 関数を作成します。EventBridge ルールのターゲットには、Amazon SNS トピックではなく Lambda を指定します。次に、この Lambda 関数を使用し、カスタムのメール件名を含むメッセージを、サブスクライバーが存在する Amazon SNS トピックに発行します。
SNS トピックとメールサブスクリプションを作成する
SNS トピックを作成した後、メールサブスクリプションを作成します。
Lambda 関数用の IAM ロールを作成する
Lambda 関数用の AWS Identity and Access Management (IAM) ロールを作成するには、次の手順を実行します。
- IAM コンソールを開きます。
- ナビゲーションペインで [ロール] を選択し、[ロールを作成] を選択します。
- [サービスまたはユースケース] ドロップダウンリストで Lambda を選択し、[次へ] を選択します。
- [権限の追加] ページで AWSLambdaBasicExecutionRole と AmazonSNSFullAccess の各ポリシーをロールに追加し、[次へ] を選択します。
重要: AmazonSNSFullAccess マネージドポリシーは、Amazon SNS へのフルアクセスを許可します。最小特権の原則に準拠することをおすすめします。
- [ロール名] にロール名を入力し、[ロールの作成] を選択します。
Lambda 関数を作成する
次の手順を実行します。
-
Lambda コンソールの [関数] ページを開きます。
-
[関数の作成] を選択します。
-
[最初から作成] を選択します。
-
[関数名] に関数名を入力します。
-
[ランタイム] ドロップダウンリストを選択し、[Python 3.13] を選択します。
-
[デフォルトの実行ロールの変更] を展開し、[既存のロールを使用] を選択します。
-
[既存のロール] ドロップダウンリストを選択し、先ほど作成したロールを選択します。
-
[関数の作成] を選択します。
-
次の Python スニペットを関数のコードエディタに入力します。
import boto3
import json
sns_arn = "sns_topic_arn"
def lambda_handler(event, context):
client = boto3.client("sns")
resp = client.publish(TargetArn=sns_arn, Message=json.dumps(event), Subject="This is the customized subject line")
注: sns_topic_arn を「SNS トピックとメール通知を作成する」で作成したトピックの Amazon リソースネーム (ARN) に置き換えてください。"This is the customized subject line" を独自の件名に置き換えてください (引用符で囲みます)。
-
[デプロイ] を選択します。
EventBridge ルールを作成する
EventBridge ルールを作成するには、次の手順を実行します。
注:
- AWS ドキュメントのステップ 11 では、先ほど作成した Lambda 関数を [ターゲットの選択] で選択します。
- Lambda 関数で目的のペイロードメッセージを指定します。
EventBridge ルールが呼び出されると、Lambda 関数は Amazon SNS に対して publish API コールを行います。イベントルールのメッセージが転送され、メッセージの配信に使用する件名が変更されます。サブスクライバーのメールボックスには、カスタマイズされた件名のメールが届きます。
関連情報
Lambda と Amazon SES を使用してメールを送信する方法を教えてください。