はじめに
Lambda関数からAmazon SQSにデータを送信する時、ハマったことがあったので備忘録として残しておく。
前提条件
- Lambda関数からAmazon SQSにデータを送信する
- Lambda関数はVPC内のプライベートサブネットに設置している
- Lambda関数のIAMロールはAmazon SQSに対してフルアクセス権限を付与している
- Lambda関数はNode.jsで作成
起こったこと
上記前提条件のもとLambda関数を実行するとタイムアウトしてしまった。
そのときのソースと実行結果はこちら
AWS公式サンプルソースのほぼコピペ
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sqs-examples-send-receive-messages.html
var AWS = require('aws-sdk');
AWS.config.update({region: 'ap-northeast-1'});
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
var params = {
DelaySeconds: 0,
MessageBody: "TestMessageBody",
QueueUrl: "https://sqs.ap-northeast-1.amazonaws.com/123456789012/TestSQS"
};
exports.handler = async (event) => {
try {
const data = await sqs.sendMessage(params).promise();
console.log("Success", data.MessageId);
} catch (e) {
console.log("Error", e);
}
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
原因
いろいろと調べた結果、プライベートサブネットからAmazon SQSにデータを送信するときは「VPCエンドポイント」を作成して、それを経由してデータ送信しなければいけないという事が分かった。
いつもありがとう、stack overflow。
https://stackoverflow.com/questions/54049143/sending-sqs-message-timeout
対処法
Lambdaのソースも以下のSQSインスタンスを作るところにエンドポイントを追記しました。
var sqs = new AWS.SQS({
apiVersion: '2012-11-05',
endpoint: 'https://vpce-088eXXXXXXXXXXXX.sqs.ap-northeast-1.vpce.amazonaws.com'
});
結果
現場からは以上です。