イベントデータを取得してSNSトピックにメッセージを送信することになっている単純なLambda関数があります。
ランタイムはNode.js 8.10です。
Lambdaコード全体を次に示します。
const AWS = require("aws-sdk");
exports.handler = async (event) => {
const sns = new AWS.SNS();
const emailBody =
`
New Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
return data;
}
});
};
関数を実行するたびに、常に応答としてnullが返されます。エラーは返されませんが、SNSからメールでメッセージを受信することはないため、問題が発生しています。なんだかわからない。
SNSコンソールから、およびNode SDKからローカルコンピューターに)からメッセージをSNSトピックに正常に公開できます。これらは完全に機能します。環境変数のsnsTopicArnが私の成功したローカルコードとSNSコンソールから直接コピーして貼り付けることで正しいです。
Lambda関数に実行ロールがあり、自分のアカウントのトピックに関するSNSに公開できます。すべてをテストするためだけにLambdaのロールを構成するときに、デフォルトの「SNSPublish」オプションを選択しました。ただし、参考までに、ここに私の実行ロールのポリシーを示します。
{
"roleName": <MyRoleName>,
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:*:*:*"
}
]
}
...
}
ここで何が問題になっていますか?どんな助けでも間違いなくありがたいです。
わかりました、それで私はそれを理解しました。
2つの問題がありました。 1つ目は、Lambda for Nodeによって暗黙的に使用される「コールバック」パラメーターを使用していなかったことです。 2つ目は、関数はデフォルトで非同期であるため、後で「待機」することを想定しています。 「非同期」を削除して同期的に実行することを決定しました。これは単純な関数であり、とにかくそれを必要としないからです。
これが私の更新された作業コードです:
const AWS = require("aws-sdk");
const sns = new AWS.SNS();
exports.handler = (event, context, callback) => {
const emailBody =
`
Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
callback(null, JSON.stringify(data));
}
});
};