Python 如何诊断不一致的S3权限错误

Python 如何诊断不一致的S3权限错误,python,amazon-s3,aws-lambda,python-s3fs,Python,Amazon S3,Aws Lambda,Python S3fs,我正在AWS Lambda函数中运行Python脚本。它由SQS消息触发,该消息告诉脚本从S3存储桶加载某些对象以进行进一步处理 权限设置似乎是正确的,具有一个bucket策略,允许Lambda的执行角色对bucket中的任何对象执行任何操作。而Lambda大部分时间都可以访问所有内容。对象通过pandas和s3fs加载:pandas.read_csv(f's3://{s3_bucket}/{object_key}') 然而,当一个新对象被上传到S3 bucket时,Lambda首先无法访问它。

我正在AWS Lambda函数中运行Python脚本。它由SQS消息触发,该消息告诉脚本从S3存储桶加载某些对象以进行进一步处理

权限设置似乎是正确的,具有一个bucket策略,允许Lambda的执行角色对bucket中的任何对象执行任何操作。而Lambda大部分时间都可以访问所有内容。对象通过
pandas
s3fs
加载:
pandas.read_csv(f's3://{s3_bucket}/{object_key}')

然而,当一个新对象被上传到S3 bucket时,Lambda首先无法访问它。调用HeadObject操作时,
botocore
SDK抛出一个错误(403):在尝试访问对象时被禁止。在几分钟内(通过SQS)重复调用Lambda(甚至50+)会产生相同的错误。但是,当使用不同的SQS消息(从S3加载不同的对象)调用Lambda,然后使用原始消息重新调用时,Lambda可以突然访问S3对象(以前每次都失败)。随后所有从Lambda访问此对象的尝试都将成功

我不知道这是什么原因造成的。这个可重复的三步过程(1)在新上载的对象上失败,2)与其他对象一起运行3)在原始对象上成功)可以全部发生在一个Lambda容器上(它们都在一个CloudWatch日志流中,似乎与Lambda容器相关)。因此,它似乎并不需要一个新的Lambda容器/实例


关于如何进一步调试的想法或想法?

Amazon S3是一个对象存储系统,而不是文件系统。它可以通过执行操作的API调用访问,如
GetObject
PutObject
ListBucket

s3fs
这样的实用程序允许将AmazonS3存储桶作为文件系统“装载”。然而,s3fs在幕后像其他任何程序一样进行正常的API调用

这有时(通常?)会导致问题,尤其是在快速创建、更新和删除文件的情况下。s3fs可能需要一些时间来更新S3,以匹配本地文件系统的预期内容


因此,不建议使用s3fs之类的工具将S3作为文件系统“装载”,特别是在生产环境中。最好直接调用AWS API。

Amazon S3是一个对象存储系统,而不是文件系统。它可以通过执行操作的API调用访问,如
GetObject
PutObject
ListBucket

s3fs
这样的实用程序允许将AmazonS3存储桶作为文件系统“装载”。然而,s3fs在幕后像其他任何程序一样进行正常的API调用

这有时(通常?)会导致问题,尤其是在快速创建、更新和删除文件的情况下。s3fs可能需要一些时间来更新S3,以匹配本地文件系统的预期内容


因此,不建议使用s3fs之类的工具将S3作为文件系统“装载”,特别是在生产环境中。最好直接调用AWS API。

我不确定是什么导致了这个问题,但我建议使用另一种方式来设置访问权限。您应该直接在分配给AWS Lambda函数的IAM角色中授予S3权限,而不是使用Bucket策略授予对IAM角色的访问权限。此过程中不应涉及桶策略。Bucket策略通常用于授予公共或范围广泛的访问权限,而不是对特定用户/角色的访问权限。@JohnRotenstein谢谢,了解这一点很有帮助。我已经检查了IAM角色(原来它已经有S3访问权限)并删除了bucket策略。行为与以前相同(包括不一致的禁止错误),但这简化了我的设置。这听起来有点像问题,但在新对象上不应该发生。你能给我们展示一些最小的代码,这样我们就可以尝试重现这个问题吗?在尝试创建一个最小的可重现的示例时,当我直接使用
bot3
时,我不理解这个问题。主代码库使用
s3fs
获取对象,因此这可能就是问题所在!您没有提到您正在使用
s3fs
。AmazonS3是一个对象存储系统,而不是一个文件系统。不建议使用像
s3fs
这样的工具将S3作为文件系统“装载”,特别是在生产使用时。最好直接调用AWS API。我不确定是什么导致了这个问题,但我建议使用另一种方式来设置访问权限。您应该直接在分配给AWS Lambda函数的IAM角色中授予S3权限,而不是使用Bucket策略授予对IAM角色的访问权限。此过程中不应涉及桶策略。Bucket策略通常用于授予公共或范围广泛的访问权限,而不是对特定用户/角色的访问权限。@JohnRotenstein谢谢,了解这一点很有帮助。我已经检查了IAM角色(原来它已经有S3访问权限)并删除了bucket策略。行为与以前相同(包括不一致的禁止错误),但这简化了我的设置。这听起来有点像问题,但在新对象上不应该发生。你能给我们展示一些最小的代码,这样我们就可以尝试重现这个问题吗?在尝试创建一个最小的可重现的示例时,当我直接使用
bot3
时,我不理解这个问题。主代码库使用
s3fs
获取对象,因此这可能就是问题所在!您没有提到您正在使用
s3fs
。AmazonS3是一个对象存储系统,而不是一个文件系统。不建议使用像
s3fs
这样的工具将S3作为文件系统“装载”,特别是在生产使用时。最好直接调用AWSAPI。