使用IAM角色时的AWS boto3 InvalidAccessKeyId [英] AWS boto3 InvalidAccessKeyId when using IAM role

查看:21
本文介绍了使用IAM角色时的AWS boto3 InvalidAccessKeyId的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用预先签名的帖子/url向S3上传和从S3下载。预先签名的url/post由lambda函数中的boto3生成(与zappa一起部署)。

而我将AWS_SECRET_ACCESS_KEYAWS_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆