通过 Amazon Lambda 触发 Amazon SNS 消息
Trigger Amazon SNS message via Amazon Lambda
我有一个 Amazon Lambda 实例和一个 Amazon SNS 实例。 Lambda 代码监视我们数据库中的更改,我希望它调用 Amazon SNS 以向我们的用户发送推送。例如:
当我们某个论坛上的用户收到新消息时,Lambda 代码会在每次 运行(每 10 分钟)时识别此更改,并应通过 SNS 向用户的智能手机发送推送。
当涉及到文档时,我运行陷入困境; Amazon 的文档只讲如何通过 SNS 触发 Lambda 代码,反之则没有。有没有人有我如何完成此操作的示例?
在 Lambda 上下文中推送 SNS 通知没有什么特别之处。我会认为它只是您与之交互的另一个外部服务。
您可以做的是在您的 lambda 代码中引入 AWS SDK,然后使用该代码进行 SNS 调用。您将需要注入正确的凭据才能调用 Amazon SNS API(但如果您正在与数据库对话,您可能会执行类似的操作来获取数据库端点和凭据)
是的,您可以使用AWS Lambda
来实现您想要的。您还需要提供适当的 IAM Permissions
允许您的 Lambda IAM Role
向您发布消息 SNS Topic
.
示例SNS Publish IAM Policy
:
{
"Statement":[ {
"Effect":"Allow",
"Action":"sns:Publish",
"Resource":"arn:aws:sns:*:<your account id>:<your topic id>"
} ]
}
您可以使用下面的 lambda 将 SNS 消息推送给用户,但您必须知道该用户的端点 ARN 是什么。例如,如果在 Android 应用程序中,当用户登录时,您将让该应用程序向您的后端发送一个 GCM(Google 云消息传递)令牌(通过触发的 API 调用一个 lambda,例如)。然后,连接到 GCM 的后端可以使用此令牌来查找与该用户对应的端点 ARN,并将其放入下面的 lambda 中。或者,您可以让应用程序将端点 ARN 直接发送到您的后端,但我认为这可能不太安全。确保您授予 IAM 权限以通过 SNS 发布到您的应用程序。您可以使用下面的 lambda 来推送消息:
var AWS = require('aws-sdk');
var sns = new AWS.SNS({apiVersion: '2010-03-31'});
exports.handler = (event, context, callback) => {
console.log(JSON.stringify(event))
var payload = {
"default": "The message string.",
"GCM":"{"+
"\"notification\":{"+
"\"body\":\"PUT NOTIFICATION BODY HERE\","+
"\"title\":\"PUT NOTIFICATION TITLE HERE\""+
"}"+
"}"
};
payload = JSON.stringify(payload);
var params = {
TargetArn: 'PUT THE ENDPOINT ARN HERE',
Subject: 'foo2',
MessageStructure: 'json',
Message: payload
}
sns.publish(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
};
我有一个 Amazon Lambda 实例和一个 Amazon SNS 实例。 Lambda 代码监视我们数据库中的更改,我希望它调用 Amazon SNS 以向我们的用户发送推送。例如:
当我们某个论坛上的用户收到新消息时,Lambda 代码会在每次 运行(每 10 分钟)时识别此更改,并应通过 SNS 向用户的智能手机发送推送。
当涉及到文档时,我运行陷入困境; Amazon 的文档只讲如何通过 SNS 触发 Lambda 代码,反之则没有。有没有人有我如何完成此操作的示例?
在 Lambda 上下文中推送 SNS 通知没有什么特别之处。我会认为它只是您与之交互的另一个外部服务。
您可以做的是在您的 lambda 代码中引入 AWS SDK,然后使用该代码进行 SNS 调用。您将需要注入正确的凭据才能调用 Amazon SNS API(但如果您正在与数据库对话,您可能会执行类似的操作来获取数据库端点和凭据)
是的,您可以使用AWS Lambda
来实现您想要的。您还需要提供适当的 IAM Permissions
允许您的 Lambda IAM Role
向您发布消息 SNS Topic
.
示例SNS Publish IAM Policy
:
{
"Statement":[ {
"Effect":"Allow",
"Action":"sns:Publish",
"Resource":"arn:aws:sns:*:<your account id>:<your topic id>"
} ]
}
您可以使用下面的 lambda 将 SNS 消息推送给用户,但您必须知道该用户的端点 ARN 是什么。例如,如果在 Android 应用程序中,当用户登录时,您将让该应用程序向您的后端发送一个 GCM(Google 云消息传递)令牌(通过触发的 API 调用一个 lambda,例如)。然后,连接到 GCM 的后端可以使用此令牌来查找与该用户对应的端点 ARN,并将其放入下面的 lambda 中。或者,您可以让应用程序将端点 ARN 直接发送到您的后端,但我认为这可能不太安全。确保您授予 IAM 权限以通过 SNS 发布到您的应用程序。您可以使用下面的 lambda 来推送消息:
var AWS = require('aws-sdk');
var sns = new AWS.SNS({apiVersion: '2010-03-31'});
exports.handler = (event, context, callback) => {
console.log(JSON.stringify(event))
var payload = {
"default": "The message string.",
"GCM":"{"+
"\"notification\":{"+
"\"body\":\"PUT NOTIFICATION BODY HERE\","+
"\"title\":\"PUT NOTIFICATION TITLE HERE\""+
"}"+
"}"
};
payload = JSON.stringify(payload);
var params = {
TargetArn: 'PUT THE ENDPOINT ARN HERE',
Subject: 'foo2',
MessageStructure: 'json',
Message: payload
}
sns.publish(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
};