web-dev-qa-db-ja.com

AWS SQS + SNS + Lambda

メッセージをSQSキューに送信し、SNSトピックをサブスクライブしてラムダをトリガーしてメールを送信できるかどうかを考えていました。

SQS-> SNS->(ラムダ)-> SES

SNSメッセージをSQSに送信できることは知っていますが、逆の方法が可能かどうか知りたいです。

11
Chida

私がしたことの1つは、ApproximateNumberOfMessagesVisible>= 1 for 5 minutes)SQSキュー用。アラームは、ラムダ機能をトリガーするSNSトピックに発行されます。ラムダ関数は、キューがクリアされるまでループします。

アラームからトリガーされるまで最大5分かかる場合がありますが、キューをポーリングする必要がなく、バッチスケジュールされたタスクに対しては非常に効果的に機能します。 (アクティブなキューの場合、アラームの粒度は5分です。)

11
squidpickles

SQS -> SNSには行けません。SNS -> SQSのみです。

Lambda 現在はスケジューリングをサポートしています したがって、1つのオプションは、Lambda関数にSQSポーラーを実装して頻繁に実行することです。

考慮すべきもう1つのオプションは、実際にキューが必要かどうかです。 Lambdaは(Event呼び出しモードを介して)非同期処理をサポートし、並列呼び出しを処理するために水平方向に透過的にスケーリングする必要があります。ラムダ関数が、並列実行を制約する可能性のある中央状態ストアへのアクセスを必要としない場合、おそらくすべての呼び出しを並列で実行するだけで済みます。ただし、アカウントあたりの同時実行数には100の制限があると思います。そのため、メッセージをバッチ処理する必要がある場合があります。

7
thexacre

SQSキューはSNSトピックにサブスクライブできるため、受信したSNSメッセージを処理できます。現在、追加のコーディングなしでは他の方向で実行することはできません(たとえば、 Lambda FAQ を参照)。

その方法はいくつかありますが、より一般的なイベント駆動型システムを使用するほどエレガントではありませんAWS event->SQS->Lambda。それ以外の場合は、SQSキューの処理方法をコードをカスタマイズ/実装する必要がある場合があります。

  1. 独自のイベントソースを実装できます
  2. いくつかの 中間EC2インスタンスSQSキューをリッスンし、SQSイベントでLambdaをトリガーすることができます
1
dsmsk80

少し前に質問と回答がありましたが、自分で考えただけで、アプローチを追加したいと思いました。

前述のように、ここでは Event Sources が最適です。または、これをテストしたことも、これを試したこともありませんでした(したがって、これは一種の学術的なものです)が、次のようにSNSでファンアウトパターンを使用してこれを実現できる可能性があります。

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

この構成を使用して、SNSトピックにメッセージを送信すると、メッセージがSQSキューにエンキューされると同時に、関連するLambda関数がトリガーされます。そのLambda関数は、まったく同じSQSキューを読み取るように書き込まれますが、Long Pollingが有効になっているため(最大20秒)、エンキューが完了する前にキューに入れます(つまり、競合状態)。

本質的に、このスキームはジャストインタイムで、エンキューされたSQSメッセージごとに1つのLambda関数を呼び出します。同時ロングリーダーがSQSでどのように動作するかはわかりません(...ドロップされますか?)。これは、これを解決するためのもう1つの方法です。 = :)

0
NYCeyes