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はまた別のブログで書きます。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWS Organizationsでタグポリシーを設定しようとしました
Organizationsで[タグポリシーを有効にする]ボタンを押下しました。 …
-
-
iPad ProのWorking CopyでAWS CodeCommitのリポジトリを使う
iPad Proを導入しましたので、原稿執筆や校正でフル活用しようと思いまして。 …
-
-
RocketChatの匿名登録時のtoo many requestsエラー対応
匿名ユーザー登録時のtoo many requestsエラー RocketCha …
-
-
特定AWSアカウント特定リージョンのSNSトピックを削除するLambda(Python)
やりたいこと 特定アカウント内特定リージョン内のSNSトピックを全部削除したいで …
-
-
Amazon Pinpoint Workshopの1(Eメール)
Amazon Pinpoint Workshop ここ数年、AWS re:Inv …
-
-
プライベートサブネットのEC2でセッションマネージャを使うようVPCエンドポイントを構成する
インターネットゲートウェイへのルートがないルートテーブルに関連付けられたプライベ …
-
-
別アカウントのVPCからAWS PrivateLinkを使う
VPC エンドポイントサービス (AWS PrivateLink)を参考にしまし …
-
-
AWS DeepLensセットアップの儀
AWS DeepLensのセットアップを開始します。 AWS DeepLensを …
-
-
AWS コスト最適化ハブを有効にしました
新しいコスト最適化ハブは、推奨アクションを一元化してコストを節約します 2023 …
-
-
RDSの証明書をrds-ca-2019に更新しました
クライアント接続で署名書使ってないので、必要ないのですが、古いままなのも気持ち悪 …





















