5

Tôi có một hàm lambda AWS mà tôi đã tạo thông qua đỉnh. Tôi cũng đã tạo chủ đề SNS và đăng ký thông qua terraform.Tại sao SNS không kích hoạt lambda của tôi?

chủ đề của tôi là: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions

Tôi có một thuê bao: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86 với một loại lambda và điểm cuối là: arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data

Tôi đã xác nhận đây là chức năng chính xác ARN. Tất cả mọi thứ dường như có dây lên một cách chính xác:

SNS picture

tôi kích hoạt SNS bằng tay:

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

Nó trả về ID tin nhắn nhưng không gọi xảy ra. Tại sao?

+0

Liệu Lambda ** Giám sát ** tab hiển thị một invocation đếm? Nếu vậy, nó có hiển thị số lỗi không? Bạn đã thử đặt một đăng ký khác về chủ đề SNS (ví dụ như email) để xác nhận rằng thư đó đang được gửi trong SNS chưa? –

+1

Chức năng Lambda có quyền được gọi bởi SNS không? Có một ví dụ ở đây: http://mobile.awsblog.com/post/Tx1VE917Z8J4UDY/Invoking-AWS-Lambda-functions-via-Amazon-SNS – at0mzk

+0

@BretzL Ah đó là vấn đề. Cảm ơn. –

Trả lời

5

tôi đã thêm một chính sách nội tuyến cho phép lambda được gọi:

{ 
    "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" 
      ] 
     } 
    ] 
} 

Và nó hiện đang làm việc.

+1

Bạn cũng có thể thêm '" Principal ":" sns.amazonaws.com "' để cho phép bất kỳ chủ đề SNS nào gọi bất kỳ hàm lambda nào – Robo

+0

Hãy cho tôi một chút thời gian để biết rằng chính sách nội dòng này nên được áp dụng cho _SNS topic_. –

0

Như Robo đề cập trong các ý kiến, thêm một Principal dựa phép là cách đơn giản nhất để làm điều này:

"FooFunctionPermission" : { 
    "Type" : "AWS::Lambda::Permission", 
    "Properties" : { 
     "Action" : "lambda:InvokeFunction", 
     "FunctionName" : { "Ref" : "FooFunction" }, 
     "Principal" : "sns.amazonaws.com" 
    } 
} 
Các vấn đề liên quan