预先签名的 POST URL 在本地工作,但不在 Lambda 中

Bre*_*ter 5 amazon-s3 boto amazon-web-services boto3 aws-lambda

我有一些 Python 可以请求预先签名的 POST URL 将对象上传到 S3 存储桶。它可以在我的具有管理员权限的 IAM 用户下在本地运行,我可以使用 Postman 和 cURL 将内容上传到存储桶。但是,当尝试在 Lambda 中运行相同的代码时,它会显示“您提供的 AWS 访问密钥 ID 在我们的记录中不存在。”。

唯一的区别是 Lambda 函数在没有管理员权限的情况下运行(但它确实具有允许它在存储桶上运行任何 S3 操作的策略)并且使用的是不同(旧)版本的 Boto3。

这是我尝试使用的代码:https : //boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload -一份文件

我尝试以与使用本地返回的详细信息完全相同的方式使用从 Lambda 函数返回的详细信息,但 Lambda 详细信息不起作用。

Kev*_*chs 0

好问题。您没有描述如何获取 Lambda 函数的凭据。你的代码,具体来说是这样的:

s3_client = boto3.client('s3')
Run Code Online (Sandbox Code Playgroud)

期望使用 ~/.aws/credentials 文件查找默认凭证。您不会(也不应该)在 Lambda 执行环境中拥有该文件,但您的本地环境中可能有它。我怀疑您根本没有获得 Lambda 函数的凭据。

在 Lambda 中可以使用两个选项来获取凭证。

  1. 不使用凭证,而是使用 Lambda 函数的 IAM 角色来提供所需的 S3 访问权限。这是最佳实践。如果您这样做,您将不需要凭据。这是最佳实践。
  2. 将凭据设置为 lambda 函数的环境变量。您可以直接定义 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,然后上面的代码应该选择它们并使用它们。