我正在使用 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 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 和临时键的性质,这实际上比看起来要复杂一些。我只想说您应该遵循以下步骤:
-
创建一个 IAM 角色,该角色有权为相关存储桶生成预签名 URL。
-
获取 lambda 基本执行角色并添加该角色的权限以代入步骤 1 中的角色。
-
在您的 boto3 代码中,添加一个步骤以在生成签名 URL 之前承担步骤 1 中的角色。像这样的事情:
import boto3
sts_client = boto3.client('sts')
assumed_role_object = sts_client.assume_role(
RoleArn='arn_of_role_to_assume'
)
credentials = assumed_role_object['Credentials']
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......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)