SESとSNSとSQSを連携させ、バウンスメール処理を行う

Last-modified: Thu, 28 Jan 2016 00:29:50 JST (632d)

SESのバウンスメール処理のため、SNSという通知サービス、SQSというキューサービスを組み合わせて、バウンスメール処理を行う仕組みを構築します。

SNSの作成

  1. AWSコンソールからSNSをクリックする。(リージョンはバージニア)
    SNS01.jpg
  2. Create Topicをクリック。
    SNS02.jpg
  3. Topicの名前をつけます。ここでは「SESBounce」としました。
    SNS03.png
  4. Topicが作成されました。ここで表示されているTopic ARNを控えておきます。
    後でSQSの連携で必要になります。
    SNSでは、ひとつのトピックに複数のサブスクリプション(ようは通知先)を登録出来ます。
    まずはテストも兼ねて、メールに通知するようにします。
    Create Subscriptionボタンをクリックします。
    SNS04.jpg
  5. ProtocolはEmailを選択、Endpointは通知するメールアドレスを設定します。
    SNS05.png
  6. 登録したメールアドレス宛に確認のメールが来ます。メール本文内にあるURLをクリックすると、次のような画面が表示され、承認されます。
    なお、ここにあるclick here to unsubscribeのリンクをクリックすると登録が解除されますので注意です。
    SNS06.png

SESとSNSの連携(メール通知)

  1. SNSの通知が飛ぶことを確認できましたので、SESと連携させます。
    SESの画面を開き、View Detailsをクリックします。
    SEStoSNS01.jpg
  2. 次に、Notificationsの中にあるEdit configurationボタンを押します。
    SEStoSNS02.jpg
  3. SNS Topic Configuration内にある、Bouncesで先ほど設定したSNSトピックである「SESBounce」を選択します。
    SEStoSNS03.png
  4. 設定したら、SES->SNS経由で通知メッセージが着ます。
    SEStoSNS04.png

SQSの作成

SNSはプッシュ型のサービスなので、非同期で通知が来ます。
たとえばAPIを作成し、そこに対してSNSから通知を投げて処理することも出来ますが、通知をキューに格納すれば、複数台のサーバで分散処理できたり、外部からAPIに対し悪戯されることも有りません。(ぉ
というわけで、SNSの通知先としてSQSを指定し、キューイングさせます。

  1. AWSコンソールからSQSをクリックする。(リージョンはバージニア)
    SQS01.jpg
  2. まだ何も無いので、はじめにボタンを押します。
    SQS02.jpg
  3. 新しいキューを作成します。今回は「SESBounceSQS」という名前で作成しました。
    それ以外のパラメタについてはとりあえずデフォでOKです。
    SQS03.png
  4. キューが作成されました。
    ここにあるARNは後でSNSと連携したり、IAMを作成するときに使うので控えておきます。
    SQS04.jpg
  5. キューを作成しただけでは何処からもアクセスできないので、アクセス権の設定を行い、SNSから書き込みが出来るようにします。
    アクセス許可のタブからアクセス許可の追加ボタンをクリックします。
    SQS05.jpg
  6. プリンシパルは横の全員にチェックを入れます。
    アクションはSendMessageにチェックを入れます。
    その下にある条件の追加(オプション)をクリックすると条件が追加できます。
    条件としてAmEquals、キーはaws:SourceArn、値はSNSで控えておいたSNSのARNをコピペします。
    これにより、バウンス処理用のSNSからのみメッセージを送信権限を付与するという設定になります。
    下にある条件の追加ボタンを押してからアクセス許可の追加ボタンを押します。
    条件の追加ボタンを押さずに、アクセス許可の追加ボタンを押すとデッドロックします(汗
    SQS06.png
  7. こんな感じになればOKです。
    これで、SQSの準備は終了です。
    SQS07.jpg

SNSの通知をSQSにする。

  1. SNSの画面を開き、SESBounceのトピックを開き、CreateSubscriptionボタンを押します。
    SNStoSQS01.jpg
  2. ProtocolにAmazon SQSを、Endpointに、SQSで控えていたSQSのARNをコピペします。
    Emailのときと違い、特に承認作業などは不要です。
    SNStoSQS02.png

IAMの作成

  1. SQSで作成したキューを処理するプログラムが使用するアカウントを作成します。
    作成するアカウントはバウンス処理用のキューのみにしかアクセス権がない設定にし、万一漏洩しても被害が最小ですむようにします。
    AWSコンソールからIAMをクリックする。(リージョンはバージニア)
    IAM01.jpg
  2. ユーザより新規ユーザの作成をクリックします。
    IAM02.jpg
  3. ユーザ名(というかIAMで識別する識別子)を入力します。ここではSQSAPIとしました。
    IAM03.jpg
  4. アカウントが作成されます。
    必ず下の認証情報のダウンロードボタンを押して、アクセスキーとシークレットキーの記載されたCSVファイルを取得しておきます。
    IAM04.jpg
  5. 作成したユーザは何も権限を持っていないので、設定します。
    作成したユーザを選択し、アクセス許可タブからユーザポリシーの作成をクリックします。
    IAM05.jpg
    Policy Generatorにチェックを入れ、選択ボタンを押します。
    IAM06.jpg
  6. 使用するSDKのAPIによるのですが、ここでは全てのアクションを許可しています。
    AWSサービスはAmazon SQSを、ARNにはSQSのところで控えていてARNをコピペします。
    入力が終わったらステートメントを追加ボタンを押します。
    IAM07.png
  7. こんな感じでポリシーが追加されます。次のステップボタンを押します。
    IAM08.jpg
  8. ユーザポリシーが設定されました。
    ポリシーのシミュレートをクリックすると、AWSのAPIのうちどのAPIが許可あるいは拒否されているのかをテストすることが出来ます。
    IAM09.jpg

プログラムからSQSにアクセスして処理する。

SQSのキューにSESからのバウンスメールアドレスがSNS経由でたまっていきますので、それを取得してDBから消し込むなどの処理が必要になります。
プログラムの参考にAWS SDK for Rubyで書いたサンプルプログラムです。
設定したIAMのアクセスキー、シークレットキーをセットして実行します。
SESからバウンスメールのテストを行うには、SESのSend a Test Emailよりbounce@simulator.amazonses.com宛にメールを送ると、バウンスメール扱いになります。
なお、サンドボックスモードの場合、登録したメールアドレス以外送信することは出来ないのですが、ここに記載があるテスト用のメールアドレスは使用できます。


Counter: 2728, today: 3, yesterday: 4

このページの参照回数は、2728です。