当前位置: 首页 > 知识库问答 >
问题:

使用IAM角色时AWS boto3 InvalidAccessKeyId无效

江展
2023-03-14

我使用预先签名的post/url上传到S3并从S3下载。预签名的url/post是通过Lambda函数中的boto3生成的(它是通过zappa部署的)。

当我添加我的AWS\u SECRET\u ACCESS\u KEYAWS\u ACCESS\u KEY\u 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。

共有1个答案

齐昆
2023-03-14

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

从文档中,强调我的:

>

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

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

    >

    AWS安全令牌服务:使用永久凭据(如AWS帐户根用户或IAM用户的凭据)签名时,最长有效期为36小时

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

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

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

    底线:如果您等待的时间太长,URL可能会过期,因为Lambda函数凭据已经过期。

  •  类似资料:
    • 我想知道PySpark是否支持使用IAM角色进行S3访问。具体来说,我有一个业务限制,我必须承担AWS角色才能访问给定的存储桶。使用boto时可以这样做(因为它是API的一部分),但我无法找到关于PySpark是否支持开箱即用的明确答案。 理想情况下,我希望能够在本地以独立模式运行时扮演一个角色,并将我的SparkContext指向该s3路径。我发现非IAM呼叫通常会随之而来: 是否存在提供IAM

    • 我正尝试使用IAM角色从spark读取s3桶中的csv文件,但在上获得 我安装了没有hadoop的Spark 2.4.4,安装了hadoop 3.2.1以及hadoop-aws-3.2.1.jar和aws-java-sdk-1.11.655.jar。我必须安装一个没有hadoop的spark版本,因为作为spark构建一部分的hadoop jars是来自2016年的2.7.3版本。 附加到角色的“

    • 场景:我在同一个帐户下有一个EC2实例和一个S3 bucket,我在该EC2上的web应用程序希望访问该bucket中的资源。 在官方文档之后,我使用创建了一个IAM角色,并将其分配给EC2实例。根据我的理解,现在我的web应用程序应该可以访问桶。但是,经过试验,我似乎必须添加桶策略,如下所示: 否则我就被禁止进入。 但是,既然我已经向EC2实例授予了IAM角色,为什么还要使用这个桶策略呢?

    • 我很难使用Condition元素根据cognito-identity.amazonaws.com:子键为用户分配IAM角色。 当使用AWS Cognito设置标识池时,您可以指定一个通过身份验证的角色,我在其中选择了通过应用程序身份验证的角色。 app-authenticated_admin 问题是,无论谁登录,他总是得到app-authenticated的角色,也是一个具有sub ̄555540

    • 我正在尝试使用已附加到EC2实例的IAM角色来生成一组AWS SES SMTP凭据。但是,在尝试通过django发送电子邮件时,使用Amazon提供的脚本从IAM角色的密钥生成SMTP密码,并使用IAM角色的访问密钥ID。果心邮件,我收到错误。 这是我发送邮件的方式: 我如何生成密码: SMTP密码生成脚本如下所示:https://docs.aws.amazon.com/ses/latest/De

    • 我试图根据在OAuth2凭证中设置的角色来限制Spring boot服务上的特定endpoint。 这是endpoint 然后使用SecurityConfiguration bean对其进行保护 我调试了委托人,可以在属性列表中看到正确的 IAM 列表 然而,当我点击endpoint时,我得到一个HTTP 403未授权。这意味着用户已经成功地通过了身份验证,但是Spring不能识别或理解属性或者如