Amazon web services boto3:S3 bucket put事件通知使用IAM角色失败

Amazon web services boto3:S3 bucket put事件通知使用IAM角色失败,amazon-web-services,boto3,aws-iam,Amazon Web Services,Boto3,Aws Iam,我陷入了这样一种情况:我试图使用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

我陷入了这样一种情况:我试图使用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)
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)
client=boto3.client(
“s3”,
aws\u访问\u密钥\u id='XXXXXXXXXXXXX',
aws_secret_access_key='xxxxxxxxxxxxx'
)
bucket\u通知\u配置={
“队列配置”:[{
“事件”:[“s3:ObjectCreated:*”],
'Id':'Test',
“QueueArn”:”
}]
}
client.put\u bucket\u通知\u配置(
Bucket=Bucket\u名称,
NotificationConfiguration=存储桶\通知\配置)
但是出于安全原因,我们正在尝试使用IAM角色而不是IDs来实现相同的结果,我找不到任何有效的方法。尝试使用“sts”,仍然没有运气。获取错误-“未授权在资源上执行:sts:AssumeRole:”

不起作用:

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)
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)
client=boto3.client(
“s3”,
角色\u arn=
)
bucket\u通知\u配置={
“队列配置”:[{
“事件”:[“s3:ObjectCreated:*”],
'Id':'Test',
“QueueArn”:
}]
}
client.put\u bucket\u通知\u配置(
Bucket=Bucket\u名称,
NotificationConfiguration=存储桶\通知\配置)
还尝试在初始化客户端时,在不提供访问/密钥或角色的情况下,为运行此lambda的角色提供完全的s3访问权限。但它抱怨访问被拒绝


有人能帮忙吗?

如果您提供了IAM角色ARN,那么您用来担任该角色的凭据需要有担任该角色的权限。是吗

除此之外,听起来您正在Lambda中运行此代码。如果这是真的,那么为什么要在Lambda代码中显式地承担角色呢?通常,您会为Lambda分配一个IAM角色,该角色已经包含放置bucket通知配置的权限,然后您就不需要假设任何内容


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

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

您不能使用根凭据调用假定角色。您必须使用IAM凭据或临时凭据。您正在使用的凭据必须具有“信任关系”才能担任角色

注意:因为您使用的是Lambda,所以实现这个错误。您需要为Lambda函数分配IAM角色,然后在
boto3.client('s3')
函数调用中自动检测您的凭据

下面的代码将显示如何在示例中使用
假定_角色
,忽略我刚才提到的关于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)
client=boto3.client(
“sts”,
aws\u访问\u密钥\u id='XXXXXXXXXXXXX',
aws_secret_access_key='xxxxxxxxxxxxx')
response=client.aspect\u角色(
RoleArn='arn:aws:iam::012345678901:角色/示例角色',
RoleSessionName='ExampleSessionName')
session=bot3.session(
aws_access_key_id=响应['Credentials']['AccessKeyId'],
aws_secret_access_key=response['Credentials']['SecretAccessKey'],
aws_会话_令牌=响应['Credentials']['SessionToken'])
s3=会话。客户端('s3')
bucket\u通知\u配置={
“队列配置”:[{
“事件”:[“s3:ObjectCreated:*”],
'Id':'Test',
“QueueArn”:
}]
}
s3.put_bucket_通知_配置(
Bucket=Bucket\u名称,
NotificationConfiguration=存储桶\通知\配置)

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


另外,确保S3存储桶存在于lambda试图修改的AWS环境中。否则您将获得拒绝访问错误。如果您的S3没有权限将消息发送到您尝试添加以进行通知的SQS队列,它将抛出错误消息-无法验证目标配置。

我正在将IAM角色(具有完全S3访问权限)分配给AWS lambda,因此理想情况下它不需要任何更多访问权限。但我有一个错误。此lambda不会经常被调用,更像是一次执行以设置环境。您是否已授予S3服务向SQS队列发送消息的权限?当我手动添加事件通知时,查看它是否有效。所以权限设置正确。@Bharat这个答案告诉您不要将
角色\u arn=
传递给构造函数。如果Lambda执行角色具有必要的权限,则会自动使用该角色。在这里,您似乎试图显式地指定它,这是不正确的。只有当你想扮演一个不同的角色时,才会这样做。谢谢你的回复!我将适当的IAM角色分配给Lambda函数,但获取AccessDenied错误。即使它具有完全的S3访问权限。您的意思是说client=boto3.client('sts')?确切的错误消息来自代码的哪一部分?这很可能意味着您没有正确设置角色,或者没有正确配置Lambda。详细信息帮助调试。