为什么 terraform 会出现“SignatureDoesNotMatch:签名已过期”的错误?

为什么 terraform 会出现“SignatureDoesNotMatch:签名已过期”的错误?

运行 terraform 命令时我开始收到以下信息:

$ terraform refresh
Error refreshing state: 1 error(s) occurred:

* SignatureDoesNotMatch: Signature expired: 20170226T035111Z is now earlier than 20170227T013047Z (20170227T014547Z - 15 min.)
        status code: 403, request id: 7626f995-fc8e-11e6-9b73-7990b2a1af41

这是什么意思?如何解决?

答案1

AWS API 使用一种身份验证机制,该机制要求客户端创建代表请求的签名。此签名包含发出请求的时间戳,以降低重放攻击的风险。

签名机制假设客户端和服务器都具有较为准确的系统时钟,即客户端的时间与服务器的时间相差不超过 15 分钟。

因此,任何使用 AWS API 的系统(无论是通过 Terraform 还是其他方式)都必须具有合理准确的系统时钟。虚拟机经常会因各种原因而受到系统时钟漂移的影响,因此最好运行ntpd在大多数虚拟机上,以防止其系统时钟漂移过多。

答案2

事实证明,安装了 terraform 的虚拟机时间完全不同步。使用 date 命令和当前时间解决了这个问题。

答案3

在 Ubuntu 中执行sudo chronyd -q同步时间

相关内容