背景
- 急にCloudWatchのログにバージョン切り替えましょうね的なエラーロクが出るようになった。
Node.jsのバージョンを16から18へバージョンをあげると何が起こるのか
- AWS SDK for JavaScript v2だったが18からはAWS SDK for JavaScript v3になる
→これにより、全体的にAWSのサービスの実装の書き方が変わる
対応が必要なこと
- ①サービスごとにモジュールをインストールする必要がある
- ②AWS SDK for JavaScript v2の書き方から18からはAWS SDK for JavaScript v3の書き方に変更
- ③AWS Lambdaの場合はランタイムバージョンを変更する
①サービスごとにモジュールをインストールする必要がある
このようにサービスごとにインストールを行う。
※以下はssmの例
npm install @aws-sdk/client-ssm
もし、sqsやdynamoがあるなら「npm install @aws-sdk/client-サービス名」でダウンロードを行う
※S3なら「client-s3」だしDynamoなら「dynamo-db」だったりするので公式リポジトリを見て確認する。
②AWS SDK for JavaScript v2の書き方から18からはAWS SDK for JavaScript v3の書き方に変更
v2とv3の書き方の比較
- v2の書き方
import * as AWS from 'aws-sdk'
const s3 = new AWS.S3()
- v3の書き方
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
const s3 = new S3Client({})
v3の対応は慣れれば簡単
★どのawsサービスも、クライアントとコマンドを用意して、最後にsendするだけ。全て同じやり方でできる。
※DynamoでのPutItemのような登録処理では登録するデータには型まで指定しなくてはならなくなったりしているが、他のサービスのほとんどは今までと同じパラメータを渡してうまくいく。
①importの中には、クライアントと~Commandを指定
※今回はS3を例にしているがもしDynamoのBatchWriteを使う場合は「BatchWriteItemCommand」というものが用意されている(from後はdynamoのモジュールを指定)
②from後は、さっきのnpm install例であったモジュール名を指定
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
③ 各AWSサービスに必要ないつものパラメータを用意して、それを引数にクライアント.send()で実行。
s3.send(new PutObjectCommand(data)
③AWS Lambdaの場合はランタイムバージョンを変更する
ラムダの設定画面で実行バージョンは変更可能。わいの場合はNode.jsを16から18にした。
必ずv3にしないと動かないわけではないが、将来的にはやるしかない
v2のやり方をそのまま使う方法もあるが、将来的には削除されるっぽい。
https://aws.amazon.com/jp/blogs/developer/modular-packages-in-aws-sdk-for-javascript/