0

我陷入了尝试使用 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 访问权限,而无需提供访问/密钥或角色。但它抱怨拒绝访问。

有人可以帮忙吗?

4

3 回答 3

1

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

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

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

于 2018-09-12T22:57:58.897 回答
0

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

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

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

AWS Lambda 权限模型

以下代码将展示如何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)
于 2018-09-12T22:59:15.253 回答
0

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

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

于 2018-09-20T16:55:05.127 回答