この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS事業本部の梶原@福岡です。
連続して小ネタですが、Labmda(Node.js)から、別のリージョンのSNSに対してPublishしていて、以下のエラーがでて小ハマりしたので共有します。
{
"errorMessage": "Invalid parameter: TopicArn",
"errorType": "InvalidParameter",
"stackTrace": [
"Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/query.js:50:29)",
省略
]
}
コードは
var params = {
Message: message,
Subject: subject,
TopicArn: topicArn
};
var sns = new AWS.SNS();
var result = await sns.publish(params).promise(); // 当たり前ですけどこでエラー
になります、わかってる人は単純だとおもうのですが、Lambdaに権限もついてるし、(権限がない場合はerrorType: AuthorizationError
になります)
トピックの指定の仕方が違うのかといろいろしてみたのですが、エラーは解決せず。じゃあどうすりゃいいん?と、若干途方に暮れ、もしかしてLambdaから別のリージョンのSNSへpublishできない?とか思ったのですがそんなことは無く
別のリージョンのSNSを呼び出す場合、SNSのクライアントの初期化時にリージョンを指定して、Publish呼び出しを行うことが必要でした。
var params = {
Message: message,
Subject: subject,
TopicArn: topicArn // arn:aws:sns:us-east-1:XXXXXXXXXX:cm-hoge-topic
};
var SNS_REGION = topicArn.split(":")[3]; // topicのARN文字列からリージョンを取得しています
var sns = new AWS.SNS({region: SNS_REGION});
var result = await sns.publish(params).promise();
とすれば、特に問題なく、別リージョンのSNSにPublishを実施することができました。 SNSに限らず、他のAPIコールも基本的に同じだと思うので、小ハマりした人は試してみてください。 以上超小ネタでした。
参考
AWSJavaScriptSDK(SNS) https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#constructor-property
AWS ドキュメント » JavaScript SDK » SDK v2 開発者ガイド » SDK for JavaScript の設定 » AWS リージョンの設定 AWS リージョンの設定 https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-region.html