【问题标题】:boto3: S3 bucket put event notification failing using IAM Roleboto3:使用 IAM 角色的 S3 存储桶放置事件通知失败
【发布时间】:2019-02-17 15:23:11
【问题描述】:

我陷入了尝试使用 IAM 角色在 S3 存储桶上为 SQS 配置事件通知的情况。

它适用于 aws_access_key_id 和 aws_secret_key_id,但不适用于角色 ARN。

作品:

client = boto3.client(
    's3',
    aws_access_key_id='XXXXXXXXXXXX',
    aws_secret_access_key='XXXXXXXXXXXXXXX'
)

bucket_notifications_configuration = {
    'QueueConfigurations': [{
        'Events': ['s3:ObjectCreated:*'],
        'Id': 'Test',
        'QueueArn':'<SQS ARN>'
    }]
}

client.put_bucket_notification_configuration(
    Bucket=bucket_name,
    NotificationConfiguration=bucket_notifications_configuration)

但出于安全原因,我们正在尝试使用 IAM 角色而不是 ID 来实现相同的结果,但我找不到任何可行的方法。尝试使用'sts',仍然没有运气。出现错误 - “未授权执行:sts:AssumeRole on resource:”

不起作用:

client = boto3.client(
    's3',
    role_arn = <IAM Role ARN>
)

bucket_notifications_configuration = {
    'QueueConfigurations': [{
        'Events': ['s3:ObjectCreated:*'],
        'Id': 'Test',
        'QueueArn':<SQS ARN>
    }]
}

client.put_bucket_notification_configuration(
    Bucket=bucket_name,
    NotificationConfiguration=bucket_notifications_configuration)

还尝试在初始化客户端时为运行此 lambda 的角色提供完整的 s3 访问权限,而无需提供访问/密钥或角色。但它抱怨访问被拒绝。

有人可以帮忙吗?

【问题讨论】:

    标签: amazon-web-services boto3 aws-iam


    【解决方案1】:

    如果您提供 IAM 角色 ARN,那么您用于代入该角色的凭证需要具有代入该角色的权限。是吗?

    除此之外,听起来您正在 Lambda 中运行此代码。如果这是真的,那么您为什么要在您的 Lambda 代码中明确承担角色?您通常会为 Lambda 分配一个 IAM 角色,该角色已包含放置存储桶通知配置的权限,然后您无需承担任何责任。

    最后,在 Lambda 函数(通常是经常调用的函数)中配置事件通知似乎很奇怪。你确定这是对的吗?

    【讨论】:

    • 我正在将 IAM 角色(具有完全 S3 访问权限)分配给 AWS lambda,因此理想情况下它不需要更多访问权限。但我收到 AccessDenied 错误。这个 lambda 不会被频繁调用,更像是一次执行来设置环境。
    • 您是否已授予 S3 服务向您的 SQS 队列发送消息的权限?见docs.aws.amazon.com/AmazonS3/latest/dev/…
    • 手动添加事件通知时有效。所以权限设置正确。
    • @Bharat 这个答案告诉你 notrole_arn = &lt;IAM Role ARN&gt; 传递给构造函数。如果您的 Lambda 执行角色具有必要的权限,则会自动使用它。在这里,您似乎试图明确指定它,这是不正确的。仅当您想担任 不同的 角色时才会这样做。
    【解决方案2】:

    要使用角色获取临时凭证,您需要调用assume_role。这意味着您还需要经过身份验证和授权。

    您不能使用 root 凭据调用承担角色。您必须使用 IAM 凭证或临时凭证。您使用的凭据必须具有“信任关系”才能担任角色。

    注意:由于您使用的是 Lambda,因此您执行此错误。您需要为您的 Lambda 函数分配一个 IAM 角色,然后在您的 boto3.client('s3') 函数调用中自动检测您的凭证。

    AWS Lambda Permissions Model

    以下代码将展示如何在您的示例中使用 assume_role,忽略我刚才提到的有关 Lambda IAM 角色的详细信息。

    client = boto3.client(
        'sts',
        aws_access_key_id='XXXXXXXXXXXX',
        aws_secret_access_key='XXXXXXXXXXXXXXX')
    
    response = client.assume_role(
            RoleArn='arn:aws:iam::012345678901:role/example-role',
            RoleSessionName='ExampleSessionName')
    
    session = boto3.Session(
        aws_access_key_id=response['Credentials']['AccessKeyId'],
        aws_secret_access_key=response['Credentials']['SecretAccessKey'],
        aws_session_token=response['Credentials']['SessionToken'])
    
    s3 = session.client('s3')
    
    bucket_notifications_configuration = {
        'QueueConfigurations': [{
            'Events': ['s3:ObjectCreated:*'],
            'Id': 'Test',
            'QueueArn':<SQS ARN>
        }]
    }
    
    s3.put_bucket_notification_configuration(
        Bucket=bucket_name,
        NotificationConfiguration=bucket_notifications_configuration)
    

    【讨论】:

    • 感谢您的回复!我为 Lambda 函数分配了适当的 IAM 角色,但出现 AccessDenied 错误。即使它具有完整的 S3 访问权限。你的意思是说client = boto3.client('sts'?
    • 代码中哪一部分的确切错误消息?这很可能意味着您没有正确设置角色,或者您没有正确配置 Lambda。详情帮助调试。
    【解决方案3】:

    终于搞定了!!似乎您只需要为执行 Lambda 时分配的角色提供足够的权限(感谢@Michael-sqlbot)。如果您从本地计算机运行它可能无法正常工作,因为您无法以这种方式分配角色。

    此外,请确保 S3 存储桶存在于您的 lambda 尝试修改的同一 AWS 环境中。否则,您将收到拒绝访问错误。如果您的 S3 无权将消息发送到您尝试添加的通知的 SQS 队列,它会抛出错误消息 - 无法验证目标配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2016-12-23
      • 2021-06-22
      • 1970-01-01
      • 2020-06-24
      • 2019-08-15
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多