我使用弹性beanstalk部署了一个节点应用程序。我正在尝试使用我的应用程序中的sdk发布到SNS主题。我的理解是,将为我的应用程序从与我的eb ec2实例关联的IAM角色进行的所有api调用提供凭据。这是尝试发布SNS消息的代码:
var arn = process.env.EVENT_ALARM_ARN;
if(arn){
var sns = new AWS.SNS();
console.log("the sns: " + JSON.stringify(sns));
sns.publish({
TopicArn:arn,
Message:JSON.stringify(event),
Subject:"Event Check"},
function(err, data) {
if(err){
console.log("Error sending SNS message for alarm check: " + err);
} else {
console.log("Queued SNS message " + JSON.stringify(data));
}
});
} else {
console.log("No SNS with ARN: " + arn);
}
来自sns的日志输出:
"the sns: {\"config\":{\"credentials\":null,\"credentialProvider\":{\"providers\":[null,null,null,null]},\"logger\":null,\"apiVersions\":{},\"apiVersion\":null,\"endpoint\":\"sns.undefined.amazonaws.com\",\"httpOptions\":{\"timeout\":120000},\"maxRedirects\":10,\"paramValidation\":true,\"sslEnabled\":true,\"s3ForcePathStyle\":false,\"s3BucketEndpoint\":false,\"s3DisableBodySigning\":true,\"computeChecksums\":true,\"convertResponseTypes\":true,\"correctClockSkew\":false,\"customUserAgent\":null,\"dynamoDbCrc32\":true,\"systemClockOffset\":0,\"signatureVersion\":\"v4\",\"signatureCache\":true,\"retryDelayOptions\":{\"base\":100},\"useAccelerateEndpoint\":false},\"isGlobalEndpoint\":false,\"endpoint\":{\"protocol\":\"https:\",\"host\":\"sns.undefined.amazonaws.com\",\"port\":443,\"hostname\":\"sns.undefined.amazonaws.com\",\"pathname\":\"/\",\"path\":\"/\",\"href\":\"https://sns.undefined.amazonaws.com/\"},\"_clientId\":121}"
这似乎表明我没有凭据。我没有明确地做任何事情来获取它们,因为我知道这会自动发生。我没有发送SNS,但出现以下错误:
发送SNS消息以进行警报检查时出错:ConfigError:缺少区域 在配置
我认为实例会知道它所在的区域,理想情况下,如果我必须在某种配置调用中指定它,我将能够动态地获取它的值。我只是对我需要提供什么以及如何从环境中获取它感到困惑。所以我的问题是如何正确指定成功调用发布到SNS主题的api所需的凭据和任何其他数据,因为这些实例是弹性beanstalk实例并且具有与之关联的正确IAM角色?谢谢。
更新:
如果我像这样实例化sns对象:
var sns = new AWS.SNS({
region: 'us-east-1' //change to your region
});
我成功发布了SNS主题。所以现在我只想弄清楚如何从我可以访问的任何环境数据中导出区域字符串以传递给该构造函数