Terraform - 具有使用实例配置文件启动EC2实例的计时问题

时间:2016-04-22 20:20:39

标签: amazon-ec2 terraform

我使用Terraform创建我的AWS基础架构。

我创建了一个模块,用于创建" aws_iam_role"," aws_iam_role_policy"以及" aws_iam_instance_profile"然后使用该aws_iam_instance_profile启动EC2实例。

" terraform plan"按预期工作,但使用" terraform适用"我一直都会遇到这个错误:

* aws_instance.this: Error launching source instance: InvalidParameterValue:   IAM Instance Profile "arn:aws:iam::<deleted>:instance-profile/<deleted>" has no associated IAM Roles

如果我立即重新运行&#34; terraform apply&#34;,它会毫无问题地启动EC2实例。如果我运行&#34; terraform graph&#34;,它确实显示该实例依赖于配置文件。

自第二个&#34;申请&#34;是成功的,这意味着instance_policy及其所需的一切都是正确创建的,不是吗?

我已尝试添加&#34; depends_on&#34;并且它没有帮助,但由于图表已经显示了依赖性,我不确定这是否可行。

有人有这个问题吗?

2 个答案:

答案 0 :(得分:0)

种族之间的条件在服务之间非常普遍-状态由于规模而最终最终保持一致。对于IAM尤其如此,您通常会创建一个角色并为EC2之类的服务提供信任关系,以将该角色用于EC2实例,但是由于IAM在整个AWS上传播,因此该角色将对EC2不可用服务创建后几秒钟。

我使用的解决方案虽然不是一个很好的解决方案,但是可以完成工作,它是在每个IAM角色或策略附件上放置以下预配置程序,以使更改时间得以传播:

resource "aws_iam_role" "some_role" {
    ...
    provisioner "local-exec" {
    command = "sleep 10"
}

答案 1 :(得分:0)

在这种情况下,您可以使用操作超时。超时完全由提供程序中的资源类型实现处理,但是提供这些功能的资源类型遵循以下定义:定义一个名为timeout的子块,该子块具有一个嵌套参数,该嵌套参数以具有可配置超时值的每个操作命名。这些参数中的每个参数都以字符串形式表示持续时间,例如“ 60m”表示60分钟,“ 10s”表示10秒,或“ 2h”表示两个小时。

resource "aws_db_instance" "example" {
  # ...

  timeouts {
    create = "60m"
    delete = "2h"
  }
}

参考:https://www.terraform.io/docs/configuration/resources.html