AmazonSAMから既存SQSにメッセージ送信

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にアクセスできるようになります。

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32にmicroSD接続

ESP32でデバッグ