我在 AWS Lambda 函数中运行 Python 脚本。它由 SQS 消息触发,这些消息告诉脚本某些对象从 S3 存储桶加载以进行进一步处理。
权限似乎设置正确,存储桶策略允许 Lambda 的执行角色对存储桶中的任何对象执行任何操作。并且 Lambda可以在大多数时间访问所有内容。对象正在通过pandas
和s3fs
:加载pandas.read_csv(f's3://{s3_bucket}/{object_key}')
。
但是,当一个新对象上传到 S3 存储桶时,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 日志流中,这似乎与 Lambda 容器相关联)。所以,这似乎不是因为需要一个新的 Lambda 容器/实例。
关于如何进一步调试的想法或想法?