2015-07-17 16 views

cevap

57

Evet, bir SNS konusunu yayımlayan bir Lambda işlevi yazabilirsiniz. Lambda'da çalışan kod, işlevinizin hangisini kullanıyorsa Java veya Javascript için tam AWS SDK'ya erişebilir. Konuya yayınlamak için işlev erişimini çalıştıran IAM rolünü verdiğinizden emin olmanız yeterlidir. JavaScript:

console.log("Loading function"); 
var AWS = require("aws-sdk"); 

exports.handler = function(event, context) { 
    var eventText = JSON.stringify(event, null, 2); 
    console.log("Received event:", eventText); 
    var sns = new AWS.SNS(); 
    var params = { 
     Message: eventText, 
     Subject: "Test SNS From Lambda", 
     TopicArn: "arn:aws:sns:us-west-2:123456789012:test-topic1" 
    }; 
    sns.publish(params, context.done); 
}; 

O Lambda fonksiyonları kullanarak SNS iletileri işlemek için de mümkündür. aracılığıyla sunulan sns-message fonksiyon planına bir göz atabilirsiniz. Lambda konsolu üzerinde bir Lambda fonksiyonu düğmesi oluşturun.

+0

Ben Lambda fonksiyonu SNS bildirim çağrısı iznine sahip olmadığı bir istisna alıyorum, ben Python kullanıyorum ve ben TargetArn' 'bir bildirim göndermeye çalışıyorum, ancak. Bu sadece 'TopicArn' ile mümkün mü ya da AWS LAmbda kullanarak Kişisel Uç Noktalara Bildirim gönderebilir miyiz? –

+0

Denemedim, ancak EndpointArn'ı [create_platform_endpoint()] 'dan almışsanız, belirli son noktaya gönderebileceğinize inanıyorum (https://boto3.readthedocs.org/en/latest/reference/services/sns.html# SNS.Client.create_platform_endpoint), daha sonra [yayınlama()] (https://boto3.readthedocs.org/en/latest/reference/services/sns.html#SNS.Client.publish) EndicArn alanında ToppointArn alanında arama yapın. . – James

+0

Yanıt için teşekkürler, son nokta ARN vardı, ama benim lambda işlevi SNS erişmek için izin yoktu, o zaman ben de bahsettiğim gibi amazon IAM'ı kullanarak lambda işlevinin rolünü ona erişim vermek olduğunu öğrendim @kixorz cevabının ilk yarısı. Sonra iyi çalıştı. –

28

Öncelikle, uygun IAM policy kullanarak sizin SNS topic yayınlanacağını Lambda IAM role izinleri vermek gerekir.

{ 
    "Action" : [ 
     "sns:Publish", 
     "sns:Subscribe" 
    ], 
    "Effect" : "Allow", 
    "Resource" : [ 
     { "Ref" : "<your SNS topic ARN>" } 
    ] 
} 

Sonra diğer Lambda veya Node.js kodundan senin SNS topic için SNS publish için aşağıdaki kodu kullanabilirsiniz.

var message = {}; 
var sns = new AWS.SNS(); 
sns.publish({ 
    TopicArn: "<your SNS topic ARN>", 
    Message: JSON.stringify(message) 
}, function(err, data) { 
    if(err) { 
     console.error('error publishing to SNS'); 
     context.fail(err); 
    } else { 
     console.info('message published to SNS'); 
     context.done(null, data); 
    } 
}); 
+1

Rolünüzde neden "sns: Abone ol" a ihtiyacınız olduğunu düşünüyorsunuz? –

+0

Pek çok kısıtlamanın hayranı değilim. Bu, hem yayıncılar hem de aboneler için aynı politikayı kullanmamı sağlıyor. Bu durumda, sadece 'sns: Publish' ile sorun değil. – kixorz

+1

'.done' '.succeed' yerine geçmek için gerekliydi ama benim için çalıştı –

İlgili konular