使用 IAM 角色时 AWS boto3 InvalidAccessKeyId

2024-03-18

我使用预先指定的帖子/网址上传到 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。


预签名 URL 和 Lambda 凭证以一种不明显的方式协同工作。

来自docs https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html,强调我的:

  • 任何拥有有效安全凭证的人都可以创建预签名 URL。但是,为了成功访问对象,预签名 URL 必须由有权执行预签名 URL 所基于的操作的人员创建。

  • 可用于创建预签名 URL 的凭据包括:

    • IAM 实例配置文件:有效期最长为 6 小时

    • AWS Security Token Service :使用永久凭证(例如 AWS 账户根用户或 IAM 用户的凭证)签名后,有效期最长为 36 小时

    • IAM 用户:使用 AWS 签名版本 4 时有效期最长为 7 天

  • 要创建有效期最长为 7 天的预签名 URL,请首先为您正在使用的 SDK 指定 IAM 用户凭证(访问密钥和秘密访问密钥)。然后,使用 AWS 签名版本 4 生成预签名 URL。

  • 如果您使用临时令牌创建了预签名 URL,则该 URL 将在令牌过期时过期,即使该 URL 是使用较晚的过期时间创建的。

底线:如果您等待太久,URL 可能会过期,因为 Lambda 函数凭证已经过期。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IAM 角色时 AWS boto3 InvalidAccessKeyId 的相关文章

随机推荐