如果您尝试操作当前正在操作的对象,S3 会抛出什么异常?

What exception does S3 throw if you try to manipulate an object that is current being manipulated?

我正在编写一段代码,将 S3 对象从一个键复制到另一个键。此代码位于 API 端点后面,因此在复制操作进行时可能会多次调用它。

据我了解,S3 复制操作是原子的(根据 https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html)。

所以我假设如果我尝试对当前正在复制到的键启动复制操作,将会抛出异常。那可能是什么例外?

我能找到的最接近的东西是“OperationAborted”,但我想确定并且我自己没有触发这种情况的好方法。

根据 S3 文档:

Updates to a single key are atomic. For example, if you PUT to an existing key, a subsequent read might return the old data or the updated data, but it never returns corrupted or partial data.

另请注意:

Amazon S3 does not currently support object locking for concurrent updates. If two PUT requests are simultaneously made to the same key, the request with the latest timestamp wins. If this is an issue, you will need to build an object-locking mechanism into your application.

More on the S3 consistency model.

这也可以解释,截至目前,您只能通过 botocore 捕获少数客户端异常(而不是资源)。它们是:

  • S3.Client.exceptions.BucketAlreadyExists
  • S3.Client.exceptions.BucketAlreadyOwnedByYou
  • S3.Client.exceptions.NoSuchBucket
  • S3.Client.exceptions.NoSuchKey
  • S3.Client.exceptions.NoSuchUpload
  • S3.Client.exceptions.ObjectAlreadyInActiveTierError
  • S3.Client.exceptions.ObjectNotInActiveTierError

有关上述内容的更多详细信息,请参阅 here

换句话说,只要复制的密钥在,应该不会有任何异常,因为您可以同时访问它并复制到您需要的地方。

另一方面,如果您继续更新复制的密钥,如上所述,您最终可能会复制过时的数据,因为 S3 为所有区域中的覆盖 PUTS 和 DELETES 提供了最终一致性。