Jan 01, 1970
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');
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));