[小ネタ]AWS Lambda(Node.js)から別リージョンのSNSへPublish(APIをCall)する方法

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