Terraform是否可以与S3和DynamoDB保持强大的一致性



Terraform提供了一些不同的后端类型来保存其状态。AWS S3可能是最受欢迎的,但它仅提供最终的读取后对象的一致性。这意味着,当两个人施加地形更改时。在同一时间,他们可能会两次创建资源或获得错误,因为在此期间删除了资源。

Terraform是否可以使用DynamoDB解决该问题?在DynamoDB中写入非常一致。默认情况下,读取最终只是一致的。

因此,问题是与S3一起作为Terraform的后端时是否有很强的一致性。

tl; dr:使用dynamodb锁定状态提供了强烈一致的读取或至少如果读取不一致的情况,则提供了错误。没有状态锁定,您最终有机会咬您,但不太可能。

Terraform当前不提供DynamoDB作为远程状态后端的选项。

使用S3后端时,它确实允许使用DynamoDB锁定状态,以便不能同时进行多个apply操作。因为锁定为锁定的锁定条件,即锁定尚未存在,这为您提供了强烈一致的动作,您需要确保不会写两次(同时还避免了种族条件阅读表,然后是写)。

因为您无法在锁定时运行计划/申请,这允许在链条中第一个申请在允许第二个链条读取状态之前完成。锁定表还包含状态文件的MD5摘要,因此,如果在计划时间尚未更新中,则不匹配MD5 Digest,因此在以下错误时会遇到难以失败:

Error refreshing state: state data in S3 does not have the expected content.
This may be caused by unusually long delays in S3 processing a previous state
update.  Please wait for a minute or two and try again. If this problem
persists, and neither S3 nor DynamoDB are experiencing an outage, you may need
to manually verify the remote state and update the Digest value stored in the
DynamoDB table to the following value: 9081e134e40219d67f4c63f4fef9c875

如果出于某种原因,您不使用状态锁定,那么Terraform确实会从S3中读取状态以检查它的期望(并且目前每2秒恢复每2秒钟10秒钟,直到匹配或失败,超出了超时),但是我认为,在最终一致的系统中,在技术上仍然可以使用读取更新,以显示更新仅需读取一个读取,以在命中另一个节点时不显示更新。以我的经验,这肯定发生在IAM中,这是一项最终一致性的全球服务,导致最终的一致性时间较慢。

所有说我从未见过S3存储桶中最终一致性造成的任何问题,并且希望看到很多孤儿资源,尤其是在以前的工作中,我们正在执行大量的Terraform工作同时并紧迫。

如果您想更确定此功能,则可以通过使用Terraform创建一个对象使用Terraform生成的UUID/TIMESTAMP的键来测试此对象,以便每个应用程序都会删除旧对象并创建一个新对象,然后将其紧密循环运行,检查存储桶中的对象量,如果您在存储桶中有2个对象,请退出。

最新更新