🦕

Deno DeployからDynamoDBを使う場合にはaws-sdkのバージョンに注意

2021/08/20に公開

Deno Deployにはいくつか公式のチュートリアルが用意されています。そのうちのひとつに、AWS DynamoDBを使用するものがあります。

https://deno.com/deploy/docs/tutorial-dynamodb

これを試していた際に、ローカルで上手く動作しない問題が発生したため、公式のfeedbackリポジトリで質問しました。

https://github.com/denoland/deploy_feedback/issues/78

解決策に関してはこのissueを見ていただければ問題ありませんが、備忘録も兼ね[1]、本記事にまとめます。

事象:Deno DeployのDynamoDBチュートリアルがローカルで動作しない

チュートリアルのファイルは https://deno.com/examples/dynamo.js に公開されており、Deno Deployでこれを直接動かすこともできます。しかし実際はリージョンを自分の環境に合わせる必要があるため、こちらのGistにファイルを配置しました。

これを使うことでDneo Deploy上では動かせたのですが、ローカルでdeployctl runしようとしたところ、以下のようにエラーが出てしまいました。

❯ deployctl run --env=.env https://gist.githubusercontent.com/kawarimidoll/2230d4bf701b80561b69badaea52dcd3/raw/43d077b851423fa6a85fcb1e042b5c33bd524f83/dynamo_sample.js
error: Relative import path "@aws-sdk/types" not prefixed with / or ./ or ../ from "https://cdn.skypack.dev/-/@aws-sdk/smithy-client@v3.25.0-1TsnNZL4ee56yRTknh6t/dist=es2020,mode=types/dist/types/index.d.ts"

@aws-sdkのパス解決でミスっているようでした。
しかしDeno Deploy上では同じファイルでも動いていたので、解決方法がわからず、前掲のissueで質問した次第です。

解決:インポートしているaws-sdkのバージョンを下げる

既に記事タイトルと見出しで答えを出していますが、バージョンを指定する必要があります。
チュートリアル作成当時の最新版では動作したため、バージョンを明示的に指定しなくても(暗黙的に最新版を使っても)問題なかったようですが、本記事作成時の最新版では動作しませんでした。

いくつかバージョンを変えて試したところ、動作する最新版はv3.22.0でした。
具体的には、インポート部を以下のように修正すると動作します。

  import {
    DynamoDBClient,
    GetItemCommand,
    PutItemCommand,
- } from "https://cdn.skypack.dev/@aws-sdk/client-dynamodb?dts";
+ } from "https://cdn.skypack.dev/@aws-sdk/client-dynamodb@3.22.0?dts";

実際、aws-sdkのv3.23.0のリリースノートにはsmithy-client: export type explicitlyとあり、ここで何らかの変更が入ったようです。
https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.23.0

こうなると、Deno Deployで動いていた理由のほうがわからないのですが、いちおうローカルでも確認できるようになったので良しとしました。

おわりに

公式のチュートリアルも、時間が経って関連ツールのバージョンが変わってしまうと動作しなくなる恐れがあるという話でした。

本件はaws-sdkおよびskypackの仕様によるものなので、将来的に再び状況が変化するかもしれません。

また、Deno Deploy公式のKVSも作りたいと考えられているようです。いつになるかはわかりませんが…。
https://github.com/denoland/deploy_feedback/issues/76

実際にDeno DeployでDynamoDBを使った例は以下の記事で紹介しています。
https://zenn.dev/kawarimidoll/articles/e00d79b97042ee

脚注
  1. 日本語で検索された場合の情報提供という意味もあり ↩︎

Discussion