[アップデート] Amazon SNSのサブスクリプションにAmazon Kinesis Data Firehoseがサポートされました

こんにちは。サービスグループの武田です。pub/sub形式のメッセージングサービスAmazon SNSで、メッセージの配信先として新しくAmazon Kinesis Data Firehoseを指定できるようになりました。
2021.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

pub/sub形式のメッセージングサービス、Amazon SNSにアップデートがありました。SNSはメッセージの配信先としてAmazon SQSやAWS Lambda、メールが指定できましたが、新しくAmazon Kinesis Data Firehoseを指定できるようになりました。

やってみた

というわけでさっそくやってみました。手順は次の5ステップです。

  1. Firehoseの配信先となるS3バケットの作成
    • FirehoseはRedshiftやElasticsearchなども選択できますが、今回はS3としました
    • なお今回の手順ではS3バケットは作成済みとします
  2. Firehose配信ストリームの作成
  3. SNSトピックの作成
  4. SNSが使用するIAMサービスロールの作成
  5. SNSサブスクリプションの作成

S3バケットの作成については、特段設定などはないため今回は省略します。

Firehose配信ストリームの作成

Kinesisのページにアクセスし、Kinesis Data Firehoseを選択して[配信ストリームを作成]をクリック。

配信ストリームの名前はsns-integration-testとしました。

他はデフォルトのまま[Next]をクリック。

次の画面もすべてデフォルトで[Next]をクリック。

配信先の指定ではAmazon S3を選択します。

FirehoseにアタッチするIAMロールが必要ですが、今回は既存のロールが存在しないため新しく作ってもらいます。選択できたら[Next]をクリック。

最後に設定の確認をし、問題なければ[Create delivery stream]をクリック。

配信ストリームが作成できました。

SNSトピックの作成

次にSNSのページにアクセスし、SNSトピックを作成します。

スタンダードトピックを選択し、トピック名はFirehoseTopicとしました。

SNSが使用するIAMサービスロールの作成

SNSからFirehoseに対してメッセージを書き込むための権限が必要です。具体的にはSNSからスイッチできるIAMサービスロールを作成し、そのロールに対して、Firehoseに書き込めるポリシーをアタッチします。

今回はSNSToFirehoseRoleという名前でIAMロールを作成し、ポリシーとしてAmazonKinesisFirehoseFullAccessをアタッチしています。スクリーンショットは省略していますが、このロールの信頼関係としてsns.amazonaws.comを指定しています。なお今回は検証目的なのでFullAccessのポリシーをアタッチしていますが、実際には権限を絞ったポリシーをアタッチするべきです。

SNSサブスクリプションの作成

SNSトピックおよびFirehoseの作成ができましたので、Firehoseを宛先とするSNSサブスクリプションを作成します。

プロトコルは新しく追加されたAmazon Kinesis Data Firehoseを選択します。エンドポイントには先ほど追加したFirehose配信ストリームのARNを入力。なおプルダウン形式ではないため、配信ストリームの一覧画面でARNをコピーしてくるとよいでしょう。サブスクリプションロールのARNには先ほど作成したIAMサービスロールのARNを入力。こちらもプルダウン形式ではないためIAMロールの画面からARNをコピーしてきましょう。

メッセージを発行してみる

設定が完了しましたので、最後のSNSからメッセージを発行し、S3に保存されるか確認をしましょう。

SNSのページからFirehoseTopicに対してメッセージを発行します。件名およびメッセージ本文は適当な文言を入力しましょう。

今回はFirehoseのバッファリング設定をデフォルトとしていたため、メッセージ発行から約5分後に、S3バケットにオブジェクトが作成されていました。

オブジェクトの中身を確認してみると、きちんとSNSメッセージとなっていました!

まとめ

これまでSNSメッセージをS3などに保存しようとした場合、一度Lambda関数をとおす必要がありました。今回のアップデートによりFirehoseがサポートしている宛先に対してよりシームレスに連携できます。SNSは昔からあるサービスのため利用しているシステムは多いと思われます。ぜひこの機会に既存のアーキテクチャを見直してみるのもよいのではないでしょうか。