SNS経由でLambdaを動かしてCloudWatchLogsにメッセージを書き込む

2018.07.07

こんにちは、カレーとRedbullが大好きな木田です。

システムからAWSのSimple Notification Service (SNS)にメッセージをパブリッシュしていて、実際にSNSにメッセージが届いているのか確認したい、メッセージの内容を確認したいということがありそうです。

ただ、開発者各自がSNSトピックからEmailのサブスクリプションを作成して確認するなんて非効率ですよね。

そんなときはSNSにパブリッシュされたメッセージ内容をCloudWatchLogsに書き込んであげれば、開発者が各自サブスクリプションを作成しなくて良いし、いつでも確認できるので作業が効率的になりますよね!

では、早速構築していきましょう。

作るもの

  • IAMロール
  • Lambda
  • SNS
  • CloudWatchLogs

SNSトピックを作成する

SNSサービス画面に遷移します。

  • トピックを作成する 「新しいトピックを作成」ボタンをクリックする。 トピック名と表示名を入力して、「トピックの作成」ボタンをクリックする。

IAMロールを作成する

今回作成するLambdaでやりたいことは、SNSにパブリッシュされたメッセージを受け取ってCloudWatchLogsに書き込むこと。

つまり、IAMロールにSNSとCloudWatchLogsの操作を許可する2つのポリシーをアタッチしてあげる必要があります。

それでは、Lambdaに設定するIAMロールを作成します。

  • IAMサービス画面に遷移する。
  • 「ロールを作成」ボタンをクリックする。

  • サービスを選択する
    • 信頼されたエンティティの種類を選択では「AWSサービス」を選択。
    • このロールを使用するサービスを選択では「Lambda」を選択。
    • 「次のステップ: アクセス権限」ボタンをクリックします。

 

  •  ポリシータイプを選択する
    • 「AmazonSNSFullAccess」を選択する。
    • 「CloudWatchLogsFullAccess」を選択する。
    • 「次のステップ: 確認」ボタンをクリックする。

 

  • 確認
    • 「ロール名」を入力する。
    • 「ロール説明」を入力する。
    • ポリシーには先ほど選択したポリシー2つが選択されているか確認する。
  • 問題なければ、「ロール作成」ボタンをクリックする。

Lambdaを作成する

LambdaではSNSにパブリッシュされたメッセージを受け取ってCloudWatchLogsに書き込む処理を書いていきます。 とはいっても、AWSで用意されている設計図がありますので、それを利用して少しだけ書き換えます。

※今回Lambda作成にはPythonを利用していきます。

それではLambdaを作成します。

  • Lambdaサービス画面から「関数の作成」ボタンをクリックする
  • 「テンプレート」を選ぶ
    • 「設計図」と選択する。
    • 「sns-message-python」でキーワード検索するとテンプレートが表示されるので選択する。
    • 「設定」ボタンがactiveになったらクリックする。
  • 関数を作成する
    • 基本的な情報
      • 「名前」を入力する
      • 「ロール」は「既存のロールを選択」を選択する。
      • 「既存のロール」で先ほど作成したロール名を選択する。
    • SNS トリガー
      • 「SNSトピック」には最初に作成したトピック名を選択する。
      • 「トリガーを有効化」のチェックボックスにチェックを入れる。

  • 「関数の作成」ボタンをクリックする

「関数の作成」が完了すると、Pythonのコードを編集できるようになります。 そこで、以下のようにlambda_handler関数の中身を書き換えてください。

def lambda_handler(event, context):
    message = event['Records']
    print("From SNS: " + json.dumps(message))
    return message

 

そして、「保存」ボタンをクリックします。

Lambdaをテストする

先ほど作成したLambdaが正しく動作するか確認した方が良いので、以下の手順でテストを行います。

  • テストイベントの設定のモーダルが表示
  • Lambda 関数の画面の「保存」ボタンの横に「テスト」ボタンがあるのでクリックすると、テストイベントの設定のモーダルが表示されます。
  • 「イベントテンプレート」で「SNS」を選択する。
  • 「イベント名」を入力する。
  • 「作成」ボタンをクリックする。

  • 作成されたテストイベントが選択された状態で、「テスト」ボタンをクリックする。

実行結果: 成功と表示されればOKです!

SNSにメッセージをパブリッシュしてCloudWatchLogsにログが書き込まれるか確認する

Lambdaを作成できたので、実際にSNSにメッセージがパブリッシュされたときにCloudWatchLogsに書き込まれるかを見ていきましょう。

  • SNSサービス画面に遷移して、作成したトピックを選択する。
  • 「トピックに発行」ボタンがアクティブになるのでクリックする。

  • メッセージを入力して、「メッセージの発行」ボタンをクリックする。

  • CloudWatchサービス画面に遷移して、「ログ」をクリックする。

  • /aws/lambda/[先ほど作成したLambda関数名] のロググループが表示されるのでクリックする。

  • ログストリームをクリックして、ログを確認する。

先ほど発行したメッセージの内容がログに書き込まれていればOKです!

まとめ

いかがでしたでしょうか?

長々と書きましたが、実際に構築してみるとボタンをポチポチしていくだけで早く簡単に構築できました。

興味があればぜひ試してみてください!