AWS SDK for JavaScript (v2) 将于今年 (2023 年) 进入维护模式。 v3 已经发布了一段时间,它是 Node18 的较新 lambda 运行时中包含的版本,也是当前的 LTS 节点版本。
因此,如果您想将 lambda 更新到 Node18 Lambda 运行时,则必须将 SDK v2 添加到当前的 lambda 函数或保留在 Node16 中(您可以推出自己的运行时,但这是另一个主题)。
新 SDK 版本的优点是更加模块化,包括您所需要的、直接在较新的 lambda 映像上提供的更小的包大小、Typescript 支持以及用于自定义某些 SDK 行为的自定义中间件堆栈(我尚未使用)。
迁移并不太困难;你可以按照这个文档。然而,我遇到了一些一开始并不明显的细节,这将为您节省一些谷歌搜索/提示的时间。
拉姆达
v2:
const AWS = require('aws-sdk'); const lambda = new AWS.Lambda(options); const result = await lambda.invoke(invokeParams).promise(); const resultPayload = JSON.parse(result.Payload)
v3:
const { LambdaClient, InvokeCommand } = require('@aws-sdk/client-lambda'); const { toUtf8 } = require('@aws-sdk/util-utf8-node'); const command = new InvokeCommand(invokeParams); const result = await lambda.send(command); const resultPayload = JSON.parse(toUtf8(result.Payload));// Now the result payload is a Uint8 array that needs to be decoded
在撰写本文时,包@aws-sdk/util-utf8-node被标记为已弃用,转而使用@aws-sdk/util-utf8 。但在 lambda 运行时中,nodejs18.x 尚未包含在内,因此如果您想使用它,则必须将其添加到项目生产依赖项中。
动态数据库
v2:
const AWS = require('aws-sdk'); dynamoDbClient = new AWS.DynamoDB.DocumentClient(options); await dynamoDbClient.put(params).promise(); await dynamoDbClient.get(params).promise(); await dynamoDbClient.update(params).promise(); await dynamoDbClient.update(params).promise(); await dynamoDb.delete(params).promise(); await dynamoDb.scan(params).promise(); await dynamoDb.query(params).promise();
v3:
const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); const { DynamoDBDocument, GetCommand, PutCommand, DeleteCommand, QueryCommand, UpdateCommand, ScanCommand, } = require('@aws-sdk/lib-dynamodb'); const dynamoDbClient = new DynamoDBClient(options); const docClient = DynamoDBDocument.from(dynamoDbClient); await docClient.send(new PutCommand(params)); await docClient.send(new GetCommand(params)); await docClient.send(new UpdateCommand(params)); await docClient.send(new UpdateCommand(params)); await docClient.send(new DeleteCommand(params)); await docClient.send(new ScanCommand(params)); await docClient.send(new QueryCommand(params));
如果您曾经处理 DynamoDB 表中的一些流并使用unmarshall函数 v2:
const AWS = require('aws-sdk'); const {unmarshall} = AWS.DynamoDB.Converter;
v3:
const { unmarshall } = require('@aws-sdk/util-dynamodb');
S3
v2:
const AWS = require('aws-sdk'); const s3Client = new AWS.S3(options); s3Client.upload(params, callBack);
v3:
const { S3Client } = require('@aws-sdk/client-s3'); const { Upload } = require('@aws-sdk/lib-storage'); const s3Client = new S3Client(options); const parallelUploads3 = new Upload({ client: s3Client, params }); const result = await parallelUploads3.done();
社交网络服务
v2:
const AWS = require('aws-sdk'); const snsClient = new AWS.SNS(options); await snsClient.publish(data).promise();
v3:
const { SNSClient, PublishCommand } = require('@aws-sdk/client-sns'); const snsClient = new SNSClient(options); await snsClient.send(new PublishCommand(data));