🫠

ローカルのSQSがAWS-SDKの2.1491.0から動かなくなった

2024/02/09に公開2

概要

serverless-offline-sqs を利用して開発環境での検証をしています。
基本的にはAWS上にデプロイして、動作確認をしていたのですが、久しぶりにserverless localを使ったところ、SQS周りの処理が上手く動作しませんでした。

ちょっと短い内容ですが、メモとして残しておきます。

結論

package.jsonに以下を追加することで解決しました。

  "peerDependencies": {
    "aws-sdk": "<2.1491.0"
  },

原因

該当のエラーによるものでした。
https://github.com/aws/aws-sdk-js/issues/4523

詳細としては以下の部分がわかりやすいと思います。

Recently the SQS service moved from XML wire protocol to a more modern JSON RPC protocol. Since the SQS service changed the protocol, the SQS Client now sends the requests in JSON format. Since you mentioned Localstack, its likely that Localstack did not implement this change on their service side.

SQSは元々、XMLでリクエストを送っていたようなのですが、このバージョンからSDKのリクエストがJSONに変更されたようです。
おそらく、AWS側では両方のリクエストを受けられるようになっているため問題がないのですが、ローカルでの検証用のSQSはJSONに対応していないため、エラーが発生しているものと思われます。

↑の部分ではLocalStackについての言及なので、LocalStackでも同様の現象が発生する場合があるようです。

詳細

serverless-offline-sqsは内部的には ElasticMQ を使用しています。
私の利用している環境では、dockerで利用できるsqsのリポジトリがあったので利用していました。
https://github.com/vsouza/docker-SQS-local

該当のDockerfileはElasticMQの1.3.9のバージョンを利用していました。
aws-sdk-jsの対象のバージョンは2023年11月、elasticmqの対象のバージョンは2022年7月のリリースなので、まあ、対応されてませんよね。

JSONのプロトコルへの対応はv1.4.0からされているようでした。
https://github.com/softwaremill/elasticmq/releases/tag/v1.4.0

最後に

自分で利用しているaws-sdkはv3なので、気にしてなかったのですが、思わぬ部分ではまることがありますね

おまけ

serverless offline startをすると以下のようなエラーが発生していました。
エラーからは何にもわからん。

Error:
UnknownError: Not Found
    at Request.extractError (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/protocol/json.js:80:27)
    at Request.callListeners (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:686:14)
    at Request.transition (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:688:12)
    at Request.callListeners (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at Request.emit (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:686:14)
    at Request.transition (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/request.js:688:12)
    at Request.callListeners (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at callNextListener (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
    at IncomingMessage.onEnd (/home/merutin/workspace/xxx-monorepo/node_modules/aws-sdk/lib/event_listeners.js:417:13)
    at IncomingMessage.emit (node:events:526:35)
    at IncomingMessage.emit (node:domain:489:12)
    at endReadableNT (node:internal/streams/readable:1359:12)
    at processTicksAndRejections (node:internal/process/task_queues:82:21)
DELTAテックブログ

Discussion

merutinmerutin

マージされていて、docker hubでも反映されていました。ありがたい。
見てなくて気が付かなかった。。