【问题标题】:Terraform - having timing issues launching EC2 instance with instance profileTerraform - 使用实例配置文件启动 EC2 实例时遇到时间问题
【发布时间】:2016-08-16 14:34:41
【问题描述】:

我正在使用 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”,但没有帮助,但由于图表已经显示了依赖关系,所以我不确定这是要走的路。

有人有这个问题吗?

【问题讨论】:

  • 你能张贴你的 tf 文件,展示它们是如何粘合在一起的。我在 terraform 中遇到了一些奇怪的时间问题,但这些问题与 SQS 相关,而不是 IAM...

标签: amazon-ec2 terraform


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    resource "aws_db_instance" "example" {
      # ...
    
      timeouts {
        create = "60m"
        delete = "2h"
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2020-03-10
      • 2015-09-05
      • 2021-04-04
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      相关资源
      最近更新 更多