3

我正在使用 Terraform 创建我的 AWS 基础设施。

我有一个模块,它创建一个“aws_iam_role”、一个“aws_iam_role_policy”和一个“aws_iam_instance_profile”,然后使用该 aws_iam_instance_profile 启动一个 EC2 实例。

“terraform plan”按预期工作,但使用“terraform apply”我一直收到此错误:

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

如果我立即重新运行“terraform apply”,它会毫无问题地启动 EC2 实例。如果我运行“地形图”,它确实表明该实例依赖于配置文件。

由于第二个“应用”是成功的,这意味着 instance_policy 和它所需要的一切都被正确地创建了,不是吗?

我试过添加一个“depends_on”,但没有帮助,但由于图表已经显示了依赖关系,我不确定这是要走的路。

有人有这个问题吗?

4

2 回答 2

1

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

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

resource "aws_iam_role" "some_role" {
    ...
    provisioner "local-exec" {
    command = "sleep 10"
}
于 2018-07-31T05:05:35.820 回答
0

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

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

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

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

于 2019-03-07T12:02:15.067 回答