AmazonSAMから既存SQSにメッセージ送信
AmazonSAMから既存SQSにメッセージ送信
普通なら結構簡単です。
Amazon SQS作って Policies に SQSSendMessagePolicy を追加してやります。
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs18.x
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Policies:
- SQSSendMessagePolicy:
QueueName: "MyQueueName"
で、後は @aws-sdk/client-sqs をインストールして。
$ npm install @aws-sdk/client-sqs
プログラムは以下のようにすればいいだけ。
import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs';
async function sendSQS(text) {
const messageParams = {
QueueUrl: "MyQueueUrl",
MessageBody: text,
DelaySeconds: 10
}
const sqsClient = new SQSClient()
const sendMessageCommand = new SendMessageCommand(messageParams)
const data = await sqsClient.send(sendMessageCommand)
}
lambdaならcredentialsとかregionなんかも設定する必要がありません。
SQSのキュー名だけ指定すれば送信できます。
VPC内でlambda動かしてる場合
「AmazonSAMから既存RDS」でやってるみたいにlambdaをRDSと同じVPS内で動かしてる場合に上述のやり方だけだと送信できません。
しかも例外もエラーも出さずにlambdaのタイムアウトまで応答を返さないという状況になります。丸一日くらい悩みました。
簡単に言うとSQSはVPC内で動作しておらず、VPC内からアクセスしようとしてもそのままだとできないんですね。
解決方法としてはVPCのエンドポイントを作ってやればOKです。
VPCのコンソールからエンドポイントを選択、「エンドポイントを作成」ボタンで作成します。
- 「AWSのサービス」を選択
- サービスで「サービス名 = com.amazonaws.ap-northeast-1.sqs」を選択
- VPCとサブネットはlambdaで指定したものを選択
- セキュリティグループはdefaultのものを選択

これだけでした。
これでVPC内からSQSにアクセスできるようになります。
コメント
コメントを投稿