AWS JS SDK S3 HeadObject 命令抛出错误“检查您是否已显式安装“@aws-sdk/signature-v4-crt”包”

问题描述 投票:0回答:1

我正在通过 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-lambda aws-sdk-nodejs sigv4
1个回答
0
投票

找到了问题的原因 - 实际上是两个问题。 首先,我需要将

aws-crt
包含在 NodeJsFunction CDK 构造的
bundlingOptions.nodeModules
属性中。这告诉 CDK 在 lambda 中安装包,而不是将其构建到 CDK 包中。有趣的是,我根本不需要在我的
aws-crt
中包含
package.json

这导致调用 HeadObject 命令时抛出

UnknownError
。这是因为 lambda 缺少授予
S3:GetObject
的策略。

一旦我完成了这两个修复,问题就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.