Tech Hotoke Blog

IT観音とは私のことです。

AWS SESの通知ステータスを環境別に振り分ける方法 #AWS #SES #Lambda #Ruby #技術メモ

これは何?

STG/PRD環境で、AWSアカウントを共有している時、AWS SESの通知ステータスを環境別に振り分ける場合の対処法の一つをメモ

前提

Tips

  • 要件

    • STG/PRD環境で、AWSアカウントを共有している
    • SESで配信されたメールの通知ステータスをSlackに通知する
    • Slackの通知先はSTG, PRDで別チャンネルにする
    • SESのID(メールアドレス)はアカウントと1:1で紐づく
    • SESの通知に設定できるSNSも1:1で紐づく
    • Slack通知のエンドポイントはシステムごとにドメインが異なるため、以下の画像のように環境別にSNSを作成する必要がある

  • 課題

    • メールが発信された環境に応じて、SNSの通知先を振り分けられない
  • どうしたか?

    1. メールヘッダに環境を識別するカスタムヘッダX-Envを設定
    2. 新規SNSを作成し、SESの通知先に設定する
    3. 新規Lambda関数を作成し、先程作成したSNSをトリガーに設定する
    4. Lambda関数の中で環境を識別するヘッダを抽出して、publishするSNSを環境別に振り分けた

  • Lambda関数サンプルコード
# frozen_string_literal: true

require 'json'
require 'aws-sdk-sns'

def handle_target_sns(event:, context:)
// 中略
 env = custom_headers_value['X-Env']

  sns_topic_arn = sns_topic_arn(env)

  sns = Aws::SNS::Client.new(region: 'ap-northeast-1')
  
  sns.publish(topic_arn: sns_topic_arn, message: event.to_json)

  { statusCode: 200, body: JSON.generate('Message published to SNS') }

end

def sns_topic_arn(env)
  case env
  when 'staging'
    ENV.fetch('STG_SNS_TOPIC_ARN', nil)
  when 'production'
    ENV.fetch('PRD_SNS_TOPIC_ARN', nil)
  else
    raise "Unknown environment: #{env}"
  end
end