5

Mam funkcję lambda AWS, którą utworzyłem poprzez wierzchołek. Stworzyłem także temat SNS i subskrypcję przez terraform.Dlaczego SNS nie uruchamia mojej lambda?

Mój temat to: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions

mam abonament: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86 z typem lambda i punkt końcowy jest: arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data

Ustaliliśmy to funkcja poprawna ARN. Wszystko wydaje się prawidłowo podłączone:

SNS picture

I wywołać SNS ręcznie:

aws sns publish 
    --topic-arn arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions 
    --message '{"endpoint": "https://us.api.battle.net", "realm": "spinebreaker"}' 

Zwraca identyfikator wiadomości, ale nie inwokacja dzieje. Czemu?

+0

Czy Lambda ** ** Monitoring zakładka pokazać liczyć inwokacja? Jeśli tak, czy pokazuje liczbę błędów? Czy próbowałeś umieścić kolejną subskrypcję na temacie SNS (np. E-mail), aby potwierdzić, że wiadomość jest wysyłana w SNS? –

+1

Czy funkcja Lambda ma uprawnienia do wywoływania przez SNS? Oto przykład: http://mobile.awsblog.com/post/Tx1VE917Z8J4UDY/Invoking-AWS-Lambda-functions-via-Amazon-SNS – at0mzk

+0

@BretzL Ah, to jest problem. Dzięki. –

Odpowiedz

5

dodałem politykę inline aby umożliwić lambda powoływać:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "Stmt1474873816000", 
      "Effect": "Allow", 
      "Action": [ 
       "lambda:InvokeFunction" 
      ], 
      "Resource": [ 
       "arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data" 
      ] 
     } 
    ] 
} 

I to teraz działa.

+1

Możesz także dodać '" Principal ":" sns.amazonaws.com "', aby pozwolić dowolnemu tematowi sns wywołać dowolną funkcję lambda. – Robo

+0

Daj mi chwilę na przekonanie się, że ta polityka inline powinna być zastosowana do _SNS topic_. –

0

Jak Robo wspomniano w komentarzach, dodając Principal na podstawie zezwolenia a jest najprostszym sposobem osiągnięcia tego celu:

"FooFunctionPermission" : { 
    "Type" : "AWS::Lambda::Permission", 
    "Properties" : { 
     "Action" : "lambda:InvokeFunction", 
     "FunctionName" : { "Ref" : "FooFunction" }, 
     "Principal" : "sns.amazonaws.com" 
    } 
} 
Powiązane problemy