使用IAM角色时的AWS boto3 InvalidAccessKeyId [英] AWS boto3 InvalidAccessKeyId when using IAM role
问题描述
我使用预先签名的帖子/url向S3上传和从S3下载。预先签名的url/post由lambda函数中的boto3生成(与zappa一起部署)。
而我将AWS_SECRET_ACCESS_KEY
和AWS_ACCESS_KEY_ID
添加为环境变量可以很好地工作。然后,我删除了我的凭据,并将IAM角色添加到lambda以完全访问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。
推荐答案
预签名URL和Lambda凭据以一种不明显的方式协同工作。
从docs,强调我的:
任何具有有效安全凭据的人都可以创建预签名URL。但是,为了成功访问对象,预签名URL必须由有权执行预签名URL所基于的操作的人创建。
可用于创建预签名URL的凭据包括:
IAM实例配置文件:有效期为6小时
AWS安全令牌服务:使用永久凭据(如AWS帐户root用户或IAM用户的凭据)签名时,有效期长达36小时
IAM用户:使用AWS Signature Version 4时有效期最长为7天
要创建有效期长达7天的预签名URL,请首先将IAM用户凭据(访问密钥和秘密访问密钥)指定给您正在使用的SDK。然后,使用AWS签名版本4生成预签名URL。
如果您使用临时令牌创建了预签名URL,则该URL将在令牌过期时过期,即使该URL是在较晚的过期时间创建的也是如此。
底线:如果等待时间过长,URL可能已过期,因为Lambda函数凭据已过期。
这篇关于使用IAM角色时的AWS boto3 InvalidAccessKeyId的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!