繁体   English   中英

使用 IAM 角色时的 AWS boto3 InvalidAccessKeyId

[英]AWS boto3 InvalidAccessKeyId when using IAM role

我使用预先签名的帖子/网址上传到 S3 并从 S3 下载。 预签名的 url/post 使用 Lambda function 中的 boto3 生成(它与 zappa 一起部署)。

当我添加我的AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID作为环境变量时,效果很好。 然后我删除了我的凭证,并将一个 IAM 角色添加到 lambda 以完全访问 S3 存储桶。 After that the lambda return with the presigned URL and getObject is working well, however when i want to upload object through the URL, it returns an InvalidAccessKeyId error. 使用的密钥 ID ASIA...这意味着这些是临时凭证。

好像 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 凭据以一种不明显的方式协同工作。

文档中,强调我的:

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM