API GatewayからLambdaを介さずにSNSトピックへ送信
2020/05/09
目次
やりたいこと
APIリクエストをまずLambdaで受けて、SNSトピックへ送信するという処理をしています。
特に加工は必要ありません。
コードはPythonだとこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def lambda_handler(event, context): logger.info(event) try: sns = boto3.client('sns') snsTopicArn = [t['TopicArn'] for t in sns.list_topics()['Topics'] if t['TopicArn'].endswith(':topic_name')][0] sns.publish( TopicArn=snsTopicArn, Message=json.dumps(event), Subject='question' ) except: logger.error(traceback.format_exc()) |
このLambdaなくてもいいんじゃ、と教えてもらったので試してみました。
こちらを目指します。
ライブ配信カレンダーのバックエンド処理向けに作成
何かで実装したほうが理解早まりそうなので、こちら「ライブ配信のカレンダーをGoogle Apps Scriptとかで作りました」のライブ配信カレンダーの機能拡張の一環として作成してみます。
こちらの記事を参考に作成しました。
- Amazon API GatewayにSNSをプロキシさせ複数処理を並列に行ってAWS IoTっぽくする
- Connect AWS API Gateway directly to SNS using a service integration
- チュートリアル: AWS 統合を使用して API Gateway API をビルドする
SNSトピックの作成
マネジメントコンソールSNSでトピックを新規作成しました。
SQSキューの作成
マネジメントコンソールSQSでキューを新規作成しました。
まずデッドレターキュー(DLQ)用のキューを作成しました。
メッセージ保持期間のみ、14日に変更しました。
他はデフォルトのままです。
処理用のキューを新規作成しました。
とりあえずTwitter向けのキューを作成して、メッセージが受信できるまでを確認します。
先入れ先出しに厳密ではないし、1回以上Tweetされても全然いいので、標準キューで作成しました。
メッセージ保持期間を14日間、メッセージ受信待機時間(ロングポーリング)を20秒、事前に作成したDLQを設定しました。
再試行回数は5回にしました。
作成したキューを選択して、[キュー操作]-[SNSトピックへのキューのサブスクライブ]からサブスクリプションを作成しました。
事前に作成した、SNSトピックを選択しました。
IAMロールの作成
API Gatewayのメソッドに割り当てるIAMロールを作成しておきます。
AWSサービスロールで、API Gatewayを選択しました。
CloudWatch Logsへの書き込みポリシーがアタッチされてたいので、そのままにしました。
今回のワークロード向けとわかるタグにしておきました。
できました。
インラインポリシーを追加しておきました。
1 2 3 4 5 6 7 8 9 10 11 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-1:12345678012:LiveDelivery" } ] } |
事前に作成したSNSトピックにパブリッシュできるポリシーにしました。
API Gatewayの作成
マネジメントコンソール API GatewayでREST APIの新規作成をしました。
LiveDeliveryという名前にしました。
リソースを作成しました。
live というリソースにしました。
CORSも有効にしておきました。
作成したliveリソースを選択してメソッドを作成しました。
AWSサービスを選択して、リージョン選択と、サービスはSNSを選択しました。
HTTPメソッドはPOSTで、アクションに”Publish”を入力しました。
事前に作成したIAMロールのARNを実行ロールに入力しました。
統合リクエストのURLクエリ文字列パラメータに、Messageと、TopicArnを設定しました。
TopicArnはシングルクォーテーションで囲むそうです。なるほど。
API Gatewayでテストをしてみます。
1 2 3 4 5 6 7 |
{ "title": "ライブタイトル", "startTime": "2020/5/5 18:30", "endTime": "2020/5/5 21:30", "description": "配信ライブです。\nhttps://example.com/" } |
実際に送信されそうな値を入れてみました。
予定どおりなら、SNS→SQSにメッセージが入る予定です。
受信されていました!
OKのようですので、デプロイしておきます。
GASからのAPI呼び出しと、LambdaからのTweet、DynamoDBはまた別のブログで書きます。
最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。
【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。
【PR】 「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWSエンコードされたエラーメッセージをデコードするコマンドのメモ
Stdout: couldn’t create ENI: Unaut …
-
-
AWS認定SAPの執筆開始にあたって環境を構築しました
AWS認定ソリューションアーキテクトプロフェッショナル対策本の執筆開始にあたりま …
-
-
ヤマムギ vol.10 (AWS)EC2モニタリングハンズオン 手順
このブログは2020/5/6に開催しました、「ヤマムギ vol.10 (AWS) …
-
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
-
AWS Organizations組織の移動
AWS Organizations組織の移動 やりたいことは、Organizat …
-
-
Amazon Connectから問い合わせ追跡レコード(CTR)をエクスポート
Amazon Connectから発信した電話に出たのか、出なかったのかを確認した …
-
-
Cloud9でSAMローカルテスト
せっかくテストするので、Amazon CloudSearchからAmazon E …
-
-
クロスリージョンでEFSをマウントしてみる
ニーズがあるかどうかはさておき、クロスリージョンでのEFSファイルシステムをマウ …
-
-
JAWS FESTA 2019 Sapporo 参加&当日スタッフ&企業サポーターで!
2019年のJAWS FESTA は札幌です! 今回もありがたいことに、所属して …
-
-
Amazon Auroraのスナップショットの暗号化とリージョン間コピーを改めて試しました
Amazon Auroraデータベースを暗号化して、スナップショットを作成、クロ …