Lambda PutObjectCommand 失败,"Resolved credential object is not valid"



我有一个lambda,它试图将一个对象放入S3 bucket中。

配置s3客户端的代码如下:

const configuration: S3ClientConfig = {
region: 'us-west-2',
};
if (process.env.DEVELOPMENT_MODE) {
configuration.credentials = {
accessKeyId: process.env.AWS_ACCESS_KEY!,
secretAccessKey: process.env.AWS_SECRET_KEY!,
}
}
export const s3 = new S3Client(configuration);

上传文件的代码如下:

s3.send(new PutObjectCommand({
Bucket: bucketName,
Key: fileName,
ContentType: contentType,
Body: body,
}))

这在本地有效。lambda的角色包括一个策略,该策略又包括以下语句:

{
"Action": [
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME/*"
],
"Effect": "Allow"
}

然而,当我调用这个lambda时,它会失败,出现以下堆栈跟踪

Error: Resolved credential object is not valid
at SignatureV4.validateResolvedCredentials (webpack://backend/../node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/signature-v4/dist-es/SignatureV4.js?:307:19)
at SignatureV4.eval (webpack://backend/../node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/signature-v4/dist-es/SignatureV4.js?:50:30)
at step (webpack://backend/../node_modules/tslib/tslib.es6.js?:130:23)
at Object.eval [as next] (webpack://backend/../node_modules/tslib/tslib.es6.js?:111:53)
at fulfilled (webpack://backend/../node_modules/tslib/tslib.es6.js?:101:58)

我使用的是(目前的(最新的javascript aws-sdk,版本3.165.0。我在这里错过了什么?

问题是我试图从环境变量加载配置凭据,而不是依赖IAM角色。结果process.env.DEVELOPMENT_MODE解析为字符串'true',而不是布尔值true

if (process.env.DEVELOPMENT_MODE === 'true') {
configuration.credentials = {
accessKeyId: process.env.AWS_ACCESS_KEY!,
secretAccessKey: process.env.AWS_SECRET_KEY!,
}
}

这个答案是关于@cscan的问题。

作为未来的访问者,我能够发现这个问题是由于我的脚本没有为凭据赋值造成的。

如果遇到此错误,请确保凭据已正确分配,如果使用的是.env文件,请确保在脚本中导入并配置了dotenv,然后再使用process.env读取.env文件。

require 'dotenv'
//configure dotenv
dotenv.config()
//use process.env after configuring and importing dotenv
configuration.credentials = {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
}

如果问题来自process.env,您可以尝试手动分配这些值以确认您的问题

configuration.credentials = {
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',
}

您可以随时尝试记录process.env的值,以验证问题的根本原因

console.log(process.env.AWS_ACCESS_KEY_ID) //undefined or Some real value

我希望这能帮助

相关内容

  • 没有找到相关文章

最新更新