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

How to diagnose inconsistent S3 permission errors

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

权限似乎设置正确,桶策略允许 Lambda 的执行角色对桶中的任何对象执行任何操作。大多数时候 Lambda 可以 访问所有内容。正在通过 pandass3fs 加载对象:pandas.read_csv(f's3://{s3_bucket}/{object_key}').

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

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

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

Amazon S3 是一个对象存储系统,而不是文件系统。它可以通过执行 GetObjectPutObjectListBucket.

等操作的 API 调用访问

s3fs 等实用程序允许将 Amazon S3 存储桶 'mounted' 作为文件系统。然而,在幕后,s3fs 像任何其他程序一样进行正常的 API 调用。

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

因此,不推荐使用s3fs之类的工具来'mount'S3作为文件系统,尤其是Production使用。最好直接调用AWSAPI