运行 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
同步时间