0

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

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

但是,当一个新对象上传到 S3 存储桶时,Lambda 一开始无法访问它。botocoreSDK在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 日志流中,这似乎与 Lambda 容器相关联)。所以,这似乎不是因为需要一个新的 Lambda 容器/实例。

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

4

1 回答 1

2

Amazon S3 是对象存储系统,而不是文件系统。它可以通过执行诸如 和 之类的操作的 API 调用GetObjectPutObject访问ListBucket

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

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

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

于 2020-07-06T21:29:25.337 回答