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認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
関連記事
-
-
Route 53のホストゾーンにサブドメインを登録する
親ドメインを移行しないでサブドメインの DNS サービスを Amazon Rou …
-
-
静的と動的って何ですか?と営業さんに聞かれたので端的に説明してみました
AWS認定クラウドプラクティショナーの勉強をしている営業さんに、「S3で静的オブ …
-
-
Amazon Quantum Ledger Database(QLDB)でサンプル台帳の作成と検証
Quantum Ledger Database(QLDB)を触ったことなかったの …
-
-
API Gateway 作成済REST APIの定義をSwaggerの形式でエクスポート
SAMで似たようなAPIを作りたくて、エクスポートしました。 Swaggerは、 …
-
-
Lambda関数をPython3.6から3.9に変更
CodeGuru ProfilerでLambda関数(Python 3.9)のパ …
-
-
Cloud9でSAMローカルテスト
せっかくテストするので、Amazon CloudSearchからAmazon E …
-
-
IAMアクセス許可の境界でIAMロールの権限を制御する
IAMユーザー自身の権限はIAMポリシーで制御できますが、IAMユーザーにIAM …
-
-
EC2 Auto ScalingカスタムメトリクスのモニタリングにCloudWatch検索式が便利でした
EC2 Auto Scalingで起動したインスタンスのカスタムメトリクス この …
-
-
EC2 プレイスメントグループを試してみました
やったことないのでやってみたやつです。 プレイスメントグループの作成 まず、EC …
-
-
Amazon Connectのパスワードどころかユーザー名も忘れたのでEmergency accessした
長い間放置していたAmazon Connect環境にアクセスしようとしたところ、 …





















