尝试将对象放入 s3 存储桶时,配置中缺少凭据

Posted

技术标签:

【中文标题】尝试将对象放入 s3 存储桶时,配置中缺少凭据【英文标题】:Missing credentials in config when trying to put object to s3 bucket 【发布时间】:2022-01-02 14:02:55 【问题描述】:

我有一个快速服务正在尝试将对象写入 s3 存储桶,但我收到以下错误:

配置中缺少凭据

我在本地担任我的 AWS 角色,它将我的凭据设置在 .aws/credentials 中,然后在我的 Dockerfile 中我将它们复制到我的容器中。

RUN mkdir "/home/node/.aws" && touch "/home/node/.aws/config" && touch "/home/node/.aws/credentials"
RUN echo "$AWS_CREDENTIALS" > "/home/node/.aws/credentials"

文档说:

开发工具包会自动检测 AWS 凭证设置为您的变量 环境并将它们用于 SDK 请求,无需 在您的应用程序中管理凭据。环境变量 您设置为提供您的凭据是:

AWS_ACCESS_KEY_ID

AWS_SECRET_ACCESS_KEY

AWS_SESSION_TOKEN(可选)

所以我在使用 sdk 时不必手动管理我的凭据?

目前写入s3桶的代码:

import s3 from 'aws-sdk/clients/s3';

const s3Client = new s3(region: process.env['region']);

async upload() 
   const params = 
      Bucket: process.env['bucket'],
      Key: 'test.json',
      Body: somejsonfile
   

   const res = s3Client.upload(params).promise();
   return results;

【问题讨论】:

【参考方案1】:

node是执行此代码的正确用户吗?

文件/home/node/.aws/credentials 是不是像这样:

[default]
aws_access_key_id = <AAK>
aws_secret_access_key = <ASK>

要调试,您可以尝试以下操作: 您可以尝试直接在代码中添加您的 AWS 凭证:

AWS.config.update(
    accessKeyId: "<AAK>",
    secretAccessKey: "<ASK>",
    "region": "<REGION>"
);

或者,您可以尝试删除 /home/node/.aws/credentials 文件并将凭据移至 /home/node/.aws/config 文件:

[default]
region=<REGION>
output=json
aws_access_key_id = <AAK>
aws_secret_access_key = <ASK>

另外,您可以尝试在 Dockerfile 中添加凭据和区域作为环境变量:

ENV AWS_ACCESS_KEY_ID=<AAK>
ENV AWS_SECRET_ACCESS_KEY=<ASK>
ENV AWS_DEFAULT_REGION=<REGION>

【讨论】:

以上是关于尝试将对象放入 s3 存储桶时,配置中缺少凭据的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 PUT 将 PDF 作为 blob 上传到 S3 存储桶时被禁止 403

上传到 S3 存储桶时出错,与 EndPoint 相关

当用户上传到 S3 存储桶时收到通知? [复制]

将对象上传到 S3 存储桶时如何触发 AWS Cloudformation 堆栈的更新?

为啥我的 lambda 函数在尝试访问 S3 存储桶时会被拒绝访问?

Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”