3

我正在使用 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
        )

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

4

1 回答 1

0

由于 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……

于 2021-06-24T19:24:44.727 回答