Terraform是否与S3和DynamoDB具有很强的一致性?

时间:2017-12-11 07:56:24

标签: amazon-web-services amazon-s3 amazon-dynamodb terraform

Terraform提供a few different backend types来保存其状态。 AWS S3可能是最受欢迎的,但它只提供eventual read-after-write consistency for overriding objects。这意味着,当两个人在大约两个时候应用一个变形。同时,他们可能会创建两次资源或者因为资源在此期间被删除而出错。

Terraform是否使用DynamoDB解决了这个问题? DynamoDB中的WRITES非常一致。默认情况下,READS仅为eventually consistent

所以问题是当使用S3作为Terraform的后端时是否存在强烈的一致性。

1 个答案:

答案 0 :(得分:3)

tl; dr:如果读取不一致,使用DynamoDB锁定状态可以保证强一致性读取或至少出错。如果没有状态锁定,你有可能最终的一致性咬你,但不太可能。

Terraform目前不提供DynamoDB作为remote state backends的选项。

使用S3 backend时,它允许使用DynamoDB锁定状态,以便多个apply操作不会同时发生。因为锁被天真地尝试作为具有锁已经不存在的条件的放置,这为您提供了确保它不会写两次所需的强烈一致的动作(同时也避免了比赛读取表后写入的条件。

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

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秒重试一次,持续10秒直到它们匹配或失败超过超时)但我认为在最终一致的读取系统中技术上仍然可能只显示第二次读取的更新,以便在它到达另一个节点时不显示更新。根据我的经验,这肯定发生在IAM中,这是一种具有最终一致性的全局服务,导致最终的一致性时间慢得多。

所有这一切都说我从来没有看到由S3桶的最终一致性引起的任何问题,并且由于类似的事情,预计会看到很多孤立的资源,特别是在我们执行大量Terraform作业的先前工作中同时并且时间紧迫。

如果您想更加确定这一点,您可以通过让Terraform使用Terraform生成的UUID /时间戳的键创建一个对象来测试这一点,以便每个apply都将删除旧对象并创建一个新对象然后以紧凑的循环运行,检查存储桶中的对象数量,如果存储桶中有2个对象则退出。