在Terraform for AWS中,我可以对资源创建进行重试吗?

在Terraform for AWS中,我可以对资源创建进行重试吗?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,地形0.12.x 我正在将EBS卷连接到我的EC2 resource "aws_volume_attachment" "dev_xvdf" { device_name = "/dev/xvdf" instance_id = aws_instance.jenkins_master.id skip_destroy = var.skip_att_ebs_destroy volume_id = var.ebs_id }

地形0.12.x

我正在将EBS卷连接到我的EC2

resource "aws_volume_attachment" "dev_xvdf" {
  device_name  = "/dev/xvdf"
  instance_id  = aws_instance.jenkins_master.id
  skip_destroy = var.skip_att_ebs_destroy
  volume_id    = var.ebs_id
}
但我明白了

module.ec2_blue.aws_volume_attachment.dev_xvdf: Still creating... [10s elapsed]
module.ec2_blue.aws_volume_attachment.dev_xvdf: Still creating... [20s elapsed]

Error: Error waiting for Volume (vol-123456abcedf) to attach to Instance: i-123456abcdef, error: unexpected state 'detached', wanted target 'attached'. last error: %!s(<nil>)
module.ec2_blue.aws_volume_attachment.dev_xvdf:仍在创建。。。[10秒后]
module.ec2_blue.aws_volume_attachment.dev_xvdf:仍在创建。。。[20秒过去]
错误:等待卷(vol-123456abcedf)连接到实例时出错:i-123456abcedf,错误:意外状态为“已分离”,需要目标为“已连接”。最后一个错误:%!s()

我可以重试还是增加超时?

Terraform中的重试和超时由提供程序作为实现细节处理(或不处理),因此您无法在Terraform配置中直接控制它们,除非提供程序开发人员公开了这样做的方法

某些资源类型遵循接受的约定,可以选择缩短或延长特定操作的超时时间:

 timeouts {
   create = "1m"
 }
相反,aws\u卷\u附件似乎不支持这一点

但是,我们可以看到,在您的案例中,问题似乎并不是实际超时,因为操作仅在20秒后失败,问题似乎是它进入了意外状态,而不是达到预期状态需要很长时间

我不太熟悉卷附件的状态机,但从AWS提供程序代码的阅读来看,提供程序似乎希望附件最初处于“附加”状态,然后最终达到“附加”状态。它在这里失败是因为它实际上进入了“分离”状态,该状态既不是提供者认为的“未决”状态,也不是表示“成功”的状态


尽管如此,我认为这是一个真正的错误,而不是超时。我不知道是什么原因导致了错误,但您可以通过尝试使用web控制台或AWS CLI手动执行相同的操作来找出原因。如果您能够收集更多的信息,我希望有人能够对一个新问题给出更有用的答案,包括附加的信息。

您知道为什么没有附加这些信息吗?你能把它连接到AWS控制台上进行验证吗?很高兴知道。您解决了超时问题,重试如何?我的意思是,如果我再次执行计划,卷将连接。这似乎不是一种通常意义上的“重试”会有所帮助的情况,因为开始连接卷的请求成功,启动了一个异步操作,然后以某种方式失败。Terraform只是在接收它,因为它轮询
descriple…
端点以等待异步操作完成。如果异步操作无法完成,我不知道有什么方法可以让提供者尝试发出新的请求。