2017-06-28 17 views
2

AWSを使用してラムダを連鎖させ、第2ラムダを第1ラムダのSNSフィードにサブスクライブしています。 2番目のラムダは最初のラムダから何も受信していませんでした。また、SNSイベントがトリガーされたCloudWatch(または私が購読した私の個人的な電子メール)には通知もありません。だから、私は疑問に思っています:私のラムダ発射から私のSNSがイベントを受け取るようにするにはどうすればいいですか?ラムダはSNSイベントをトリガーしません。 SNSでAWS lambdaを連鎖する

SNS Web UIを使用すると、これらのログが取得され、ラムダログにはそれらが表示されたことが示されますが、手動でメッセージを送信したときに限ります。私は私のラムダはそれで許可が役割だ公開、しかし、それは唯一のIAMに表示し、私はGUI上のラムダ自体の内部方針を表示したとき、私はちょうどラムダ発射を参照してください与えてくれた

{ 
"notification": { 
    "messageMD5Sum": "e9a72884afc5d9568f2748e34a4e50a4", 
    "messageId": "04f4a199-cd25-5a45-a877-f054df9b2adf", 
    "topicArn": "arn:aws:sns:us-east-1:xxxxxxxxxxxx:first-lambda", 
    "timestamp": "2017-06-28 02:12:14.098" 
}, 
"delivery": { 
    "deliveryId": "173dca7a-7b31-55a2-8ee9-9bb7698f35f6", 
    "destination": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:second-labmda", 
    "providerResponse": "{\"lambdaRequestId\":\"33972992-5ba7-11e7-b363-09e0f6dc8594\"}", 
    "dwellTimeMs": 134, 
    "attempts": 1, 
    "statusCode": 202 
}, 
"status": "SUCCESS" 

}

ラムダ自体のパーミッション。また私のSNSはラムダに書き込む権限を持っていると確信しています。なぜならラムダをセットアップすると(昨日何度もやったように)SNSトピックに特権を与えるように頼むからです。しかし、SNSのトピックをテストしても、ラムダには決して到達しませんが、私は自分のメールアカウントを購読すればメールを受け取ります。

tl; dr 最初のラムダは、2番目のラムダがサブスクライブするSNSイベントをトリガーする必要があります。 SNSイベントは、2回目のラムダに行ったことのない夜中の2つのログを除いて、最初のラムダからのデータを受信して​​いません。 SNSが私のラムダ発射からイベントを受け取るようにするにはどうすればよいですか?

+3

Lambdaが最初にSNSトピックに何かを公開するために使用しているコードを教えてください。 – MaiKaY

+0

ラムダ内のSNSに明示的にメッセージを送信する必要がありますか?私のラムダを作成したときに、ラムダ用のSNSの中にトピックが自動的に作成され、それを購読することによって、それが起動するたびに自動的に戻り値が得られると思いました。 –

+1

はい。あなたはFirstLambda内の既存のSNSトピックに何かを公開する必要があります。 – MaiKaY

答えて

0

は、メッセージを送信するために、私のラムダにサービスを追加することでこれを解決しました。

import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.sns.AmazonSNSClient; 
import com.amazonaws.services.sns.model.PublishRequest; 

public class SNSPublishService { 

private static final String ACCESS_KEY = "credential1"; 
private static final String SECRET_KEY = "credential2"; 
private static final String ARN = "arn:aws:sns:<region>:<id>:<topicname>"; 

public static void publish(String body) throws InterruptedException { 
    AmazonSNSClient service = new AmazonSNSClient(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY)); 
    PublishRequest publishRequest = new PublishRequest() 
      .withTargetArn(ARN) 
      .withMessage(body); 

    service.publish(publishRequest); 
}} 
+0

クール! 2つの質問:1)あなたはコードをどこで見つけましたか?私が見つけた最高のものはhttps://gist.github.com/bkizzy/2705156でした。 2)資格情報のコーディングを避けるためにロールを使用する方法はありますか。(あるいは、私はそれらを環境変数に入れます)。ああ、私はC#で、上記はJavaですか? – NealWalters

+0

遅れて申し訳ありません。はい、これはJavaです。 –

0

これはOPのために解決されましたか?私は現時点で同じ問題を経験しています。青いところから起こっています。実際にはAWSに問題があると思っています。私は私たちの東1にいます。

(私がコメントしたかったが、私はそのための十分な評判ポイントを持ってい...いない)

+0

私はこれを解決して、最初のラムダにパブリッシュサービスを追加しました。 'public static void publish(String body)はInterruptedExceptionをスローします{ AmazonSNSClientサービス=新しいAmazonSNSClient(新しいBasicAWSCredentials(ACCESS_KEY、SECRET_KEY)); PublishRequest publishRequest = new PublishRequest() .withTargetArn(ARN) .withMessage(body); service.publish(publishRequest); ' –

+0

以下の回答を参照してください。 –

+0

ありがとうございます。私の問題は、イベントのサイズが大きすぎるという別の問題であることが判明しました。 Lambdaは128KBのイベントサイズしか許されませんが、SNSは256KBのメッセージを許可します。また、オーバーヘッド。 :) このリンクを参照してください:https://stackoverflow.com/questions/35462855/aws-lambda-not-invoked-when-subscribed-sns-message-is-large – Sandyman

関連する問題