当我试图使用IAM角色在S3存储桶上为SQS配置事件通知时,我陷入了困境。
它适用于aws_access_key_id和aws_secret_key_id,但不适用于Role 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:”
无效:
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的Role提供s3的完全访问权限,而不提供访问/秘密密钥或Role。但它抱怨访问被拒绝。
有人可以帮忙吗?
答案 0 :(得分:1)
如果提供IAM角色ARN,则用于承担该角色的凭据需要具有承担该角色的权限。他们吗?
此外,听起来您正在Lambda中运行此代码。如果是这样,那么为什么要在Lambda代码中明确扮演角色?通常,您将向已经包含放置存储桶通知配置权限的Lambda分配一个IAM角色,然后您无需承担任何责任。
最后,在Lambda函数(通常被频繁调用)中配置事件通知似乎很奇怪。您确定这是正确的吗?
答案 1 :(得分:0)
要使用某个角色获取临时凭证,您需要调用assume_role
。这意味着您还需要经过身份验证和授权。
您不能使用root凭据调用承担角色。您必须使用IAM凭据或临时凭据。您要使用的凭据必须具有“信任关系”才能承担角色。
注意:由于您使用的是Lambda,因此您正在实现此错误。您需要为Lambda函数分配一个IAM角色,然后在您的boto3.client('s3')
函数调用中自动检测您的凭据。
以下代码将显示示例中的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)
答案 2 :(得分:0)
终于成功了!!看来您只需要给Lambda执行时分配的角色足够的权限(谢谢@ Michael-sqlbot)。如果从本地计算机运行它,则可能无法正常工作,因为您无法以这种方式分配角色。
此外,请确保S3存储桶与您的lambda尝试修改的AWS环境相同。否则,您将收到Access Denied错误。并且,如果您的S3没有权限将消息发送到您要添加以通知的SQS队列中,则会抛出错误消息-无法验证目标配置。