我正在通过 CDK 部署 lambda 函数。该函数使用适用于 Nodejs 的 aws-sdk 将 HeadObject 请求发送到多区域接入点 (MRAP)。 当我发送这个 HeadObject 请求时,sdk 会抛出一个错误并显示以下消息:
Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly.
You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";].
For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt
我尝试按照 github 链接中提到的步骤进行操作,但错误仍然存在。奇怪的是,当我下载lambda源代码时,我可以清楚地看到node_modules里面的包
我的代码大致如下:
import '@aws-sdk/signature-v4-crt'
import { HeadObjectCommand, S3Client, NotFound } from '@aws-sdk/client-s3'
export const s3ObjectExists = async (): Promise<boolean> => {
const s3 = new S3Client()
const bucket = '{MRAP ARN}'
const key = 'key for s3 item'
try {
// throws
await client.send(
new HeadObjectCommand({
Key: key,
Bucket: bucket,
})
)
return true
} catch (e) {
if (e instanceof NotFound) {
return false
}
// This statement is logging, so it's -not- a NotFound error
log.error('Failed to check if object exists', { error: e })
throw e
}
}
如果有人问,s3 api 支持将存储桶作为 MRAP 的 ARN。我能够很好地运行与此代码等效的 AWS CLI。 (
aws s3api head-object --key {key} --bucket {MRAP arn}
)
找到了问题的原因 - 实际上是两个问题。 首先,我需要将
aws-crt
包含在 NodeJsFunction CDK 构造的 bundlingOptions.nodeModules
属性中。这告诉 CDK 在 lambda 中安装包,而不是将其构建到 CDK 包中。有趣的是,我根本不需要在我的 aws-crt
中包含 package.json
。
这导致调用 HeadObject 命令时抛出
UnknownError
。这是因为 lambda 缺少授予 S3:GetObject
的策略。
一旦我完成了这两个修复,问题就消失了。