【问题标题】:Not receiving Amazon SNS push notification when publishing to topic from Amazon Lambda从 Amazon Lambda 发布到主题时未收到 Amazon SNS 推送通知
【发布时间】:2016-09-18 01:18:56
【问题描述】:

这是我发布到主题的代码(出于安全原因,我更改了目标和主题 arn):

var AWS = require("aws-sdk");
var sns = new AWS.SNS();
var targetArn = 'arn:aws:sns:us-east-1:4363657289:endpoint/GCM/APP_NAME/3185sfdnfe283925sgSeaa0e';
var topicArn = 'arn:aws:s-s:us-east-1:4363657289436:TOPIC_NAME';
var payload = {
    GCM: {
        data: {
            message: "test"
        }
    }
};
payload.GCM = JSON.stringify(payload.GCM);
payload = JSON.stringify(payload);
var params= { 
    TopicArn: topicArn,
    TargetArn: targetArn,
    Message: payload,
    MessageStructure: 'json'
};
var responsefromSNS = sns.publish(params , function(error, data) {
    if (error) {
        console.log("ERROR: " + error.stack);
    }
    else {
        console.log("SENT DATA: " + JSON.stringify(data));
        context.done(null, data);
    }
});
console.log(responsefromSNS);

我的问题是我从来没有看到来自 if 或 else 块的日志语句,并且推送通知永远不会到达移动应用程序。我已经咨询了AWS JavaScript SDK Documentation 和无数关于此的堆栈溢出帖子,但我没有尝试过任何工作。而且,我已授予 lambda 函数发布到该主题的权限。

---更新----- 我修改了一些代码,现在看起来像这样:

var AWS = require("aws-sdk");
AWS.config.update({region:'us-east-1'});
var topicarn = 'arn:aws:s-s:us-east-1:927579412028:alexapushdemo';
var targetarn = 'arn:aws:sns:us-east-1:927579412028:endpoint/GCM/automation.home.visa.com.homeautomation/3af761b2-1955-34d8-b66a-85e232e0aa0e'; 
var payload = {
    default: "test",
    GCM: {
        data: {
            message: "test"
        }
    }
};
payload.GCM = JSON.stringify(payload.GCM);
payload = JSON.stringify(payload);
var sns = new AWS.SNS();
console.log('start of sns function')
sns.publish({
    TargetArn: targetarn,
    Message: payload,
    MessageStructure: 'json'
}, function(err, data) {
    if (err) {
        console.log(err.stack);

        // Notify Lambda that we are finished, but with errors
        context.done(err, 'sns function finished with errors!');  
        return;
    }
    console.log('push sent');
    console.log(data);
    // Notify Lambda that we are finished 
    context.done(null, 'sns function finished!');  
});
console.log('end of sns functions');

我得到的错误是: ConfigError:配置中缺少区域\\n
在 Request.VALIDATE_REGION (/node_modules/aws-sdk/lib/event_listeners.js:81:45)\\n
在 Request.callListeners (/node_modules/aws-sdk/lib/sequential_executor.js:105:20)\\n
在 callNextListener (/node_modules/aws-sdk/lib/sequential_executor.js:95:12)\\n
在 /node_modules/aws-sdk/lib/event_listeners.js:75:9\\n
完成时 (/node_modules/aws-sdk/lib/config.js:228:7)\\n
在 /node_modules/aws-sdk/lib/config.js:268:9\\n
在 resolveNext (/node_modules/aws-sdk/lib/credentials/credential_provider_chain.js:84:9)\\n
在 /node_modules/aws-sdk/lib/credentials/credential_provider_chain.js:97:11\\n
在 /node_modules/aws-sdk/lib/credentials.js:123:23\\n
在 /node_modules/aws-sdk/lib/credentials/ec2_metadata_credentials.js:66:7\\"\",\"ip\":\"127.0.0.1\"}",

为什么我在调用 AWS.config.update 时还是会收到这个。

【问题讨论】:

  • 您的 lambda 代码是否包含在 exports.handler 函数调用中?
  • 这段代码实际上是在一个函数中,然后我在exports.handler调用中调用它。
  • 确保调用 AWS.config.update({region:'us-east-1'});在 var AWS = require("aws-sdk"); 之后还要确保您没有重复的行 "var AWS = require("aws-sdk");"

标签: javascript amazon-web-services push-notification amazon-sns aws-lambda


【解决方案1】:
const AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';

像这样指定 aws sdk 使用的区域

【讨论】:

    【解决方案2】:

    伊拉姆,

    如果我将您的确切代码粘贴到 Lambda Node.js 4.3 函数中并从 Lambda 控制台执行测试,结果如下:

    错误:无效参数:无效参数:TopicArn 原因:同时指定了 TopicArn 和 TargetArn。只使用一个或另一个

    这意味着在您的参数中,您需要注释掉 TopicArn 或 TargetArn 或放入一些逻辑来确定传入的有效负载是否包含作为目标端点或主题端点的 Arn。

    您仍然可能对 SNS 或 CW 日志的 Lambda 执行角色存在权限问题,但是,无论您是否有权从您的 Lambda 函数发布或发送日志到 CloudWatch,始终从控制台运行测试吐出一些正在发生的事情的日志

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多