我使用预先指定的帖子/网址上传到 S3 并从 S3 下载。预签名的 url/post 是使用 Lambda 函数中的 boto3 生成的(它是使用 zappa 部署的)。
当我添加我的AWS_SECRET_ACCESS_KEY
and AWS_ACCESS_KEY_ID
因为 env 变量工作得很好。然后,我删除了凭证,并向 lambda 添加了 IAM 角色,以完全访问 S3 存储桶。之后 lambda 返回带有预先签名的 URL 和getObject
运行良好,但是当我想通过 URL 上传对象时,它会返回一个InvalidAccessKeyId
错误。使用的密钥 IDASIA...
这意味着这些是临时凭证。
看来lambda没有使用IAM角色,或者是什么问题?
class S3Api:
def __init__(self):
self.s3 = boto3.client(
's3',
region_name='eu-central-1'
)
def generate_store_url(self, key):
return self.s3.generate_presigned_post(FILE_BUCKET,
key,
Fields=None,
Conditions=None,
ExpiresIn=604800)
def generate_get_url(self, key):
return self.s3.generate_presigned_url('get_object',
Params={'Bucket': FILE_BUCKET,
'Key': key},
ExpiresIn=604800)
我的结果为sts:getCallerIdentity
:
{
'UserId': '...:dermus-api-dev',
'Account': '....',
'Arn': 'arn:aws:sts::....:assumed-role/dermus-api-dev-ZappaLambdaExecutionRole/dermus-api-dev',
'ResponseMetadata': {
'RequestId': 'a1bd7c31-0199-472e-bff7-b93a4f855450',
'HTTPStatusCode': 200,
'HTTPHeaders': {
'x-amzn-requestid': 'a1bd7c31-0199-472e-bff7-b93a4f855450',
'content-type': 'text/xml',
'content-length': '474',
'date': 'Tue, 09 Mar 2021 08:36:30 GMT'
},
'RetryAttempts': 0
}
}
dermus-api-dev-ZappaLambdaExecutionRole 角色附加到 dermus-api-dev lambda。