繁体   English   中英

generate_presigned_post 中的 Boto3 InvalidAccessKeyId

[英]Boto3 InvalidAccessKeyId in generate_presigned_post

我正在使用 Python 的 Chalice 库创建 AWS Lambda 和 API。 我的 AWS 凭证是使用 github 工作流 aws-actions 注入的,并且它能够chalice deploy 端点正在运行,并且完美地部署到 AWS。

问题是:

我使用 Boto3 使用其位于文档中的generate_presigned_post函数创建一个预先签名的上传表单: https ://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html

但是当我使用该函数的响应并用它生成一个 html 时,在提交要上传的文件后,它返回给我

<Error>
<Code>InvalidAccessKeyId</Code>
<Message>
The AWS Access Key Id you provided does not exist in our records.
</Message>

我检查了所有内容,似乎它使用了错误的 AWS_ACCESS_KEY 但如果它完美地部署到 AWS,我认为这不是问题(至少现在是这样)。 我使用 boto3 客户端,它似乎可以自动找到 aws 凭据,但它似乎没有找到我的(或正在发生的任何事情)并提供了错误的 AWS_ACCESS_KEY。

import boto3

S3_CLIENT = boto3.client('s3')
BUCKET = 'bucket_name'

response = S3_CLIENT.generate_presigned_post(
            BUCKET,
            Key="{$filename}",
            Fields=None,
            Conditions=None,
            ExpiresIn=3600
        )

它返回正确的响应,但是当与表单集成并使用时,表单返回错误。

由于 lambda 和临时键的性质,这实际上比看起来要复杂一些。 可以说您应该遵循以下步骤:

  1. 创建一个有权为相关存储桶生成预签名 URL 的 IAM 角色。

  2. 获取 lambda 基本执行角色并为该角色添加权限以代入第 1 步中的角色。

  3. 在您的 boto3 代码中,在生成签名 url 之前添加一个步骤以承担步骤 1 中的角色。 像这样的东西:

    导入 boto3

    sts_client = boto3.client('sts')

    假定的角色对象 = sts_client.assume_role( RoleArn='arn_of_role_to_assume' )

    凭证 = 假定_角色对象['凭证']

    s3_client = boto3.client('s3', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'],)

    s3_client.generate_presigned_url ......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM