【问题标题】:Terraform: depends_on for module not working as expected in AWSTerraform:depends_on 模块无法在 AWS 中按预期工作
【发布时间】:2020-12-25 17:54:16
【问题描述】:

我是 terraform 的新手。我之前使用的是 terraform v0.12,因为我想在模块之间引入依赖关系,所以我最近开始使用 terraform v0.13。我正在尝试创建一个 IAM 角色并将一些策略附加到创建的角色。但问题出现在对角色的政策依恋上。很少有策略附加到角色,但一些策略会抛出错误,指出不存在此类角色,而其他策略正确附加到角色。我的实现有什么问题吗?

模块.tf

provider "aws" {
  region = "ap-southeast-1"
}

#Control Plane role and policies

module "ControlPlane_Role" {

  source = "../../templates/IAM/roles"
  role_name = var.EKS-master-role
}

module "ControlPlane_Policy1" {

  source = "../../templates/IAM/aws_policy"
  role_name = var.EKS-master-role
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  depends_on = [module.ControlPlane_Role.role_create]
}

module "ControlPlane_Policy2" {

  source = "../../templates/IAM/aws_policy"
  role_name = var.EKS-master-role
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSServicePolicy"
  depends_on = [module.ControlPlane_Role.role_create]
}

模板/IAM/roles/role.tf

resource "aws_iam_role" "role_create" {
  assume_role_policy = data.aws_iam_policy_document.trusted_entity.json
  name               = var.role_name
}

aws_policy.tf

resource "aws_iam_role_policy_attachment" "aws_policy" {
  role       = var.role_name
  policy_arn = var.policy_arn
}

我将单独传递变量文件,这没有问题。

错误:

Error: Error attaching policy arn:aws:iam::aws:policy/AmazonEKSClusterPolicy to IAM Role EKS-master: NoSuchEntity: The role with name EKS-master cannot be found.

Error attaching policy arn:aws:iam::aws:policy/AmazonEKSServicePolicy to IAM Role EKS-master: NoSuchEntity: The role with name EKS-master cannot be found.

如果我在相同资源上再次运行命令 terraform apply 而不进行任何更改,则会附加策略。

【问题讨论】:

  • 重新运行 Terraform 使其成功的事实使我怀疑这是一个不幸的典型 AWS IAM 行为示例,其中更改可能需要几分钟才能在所有区域的所有 AWS 服务中传播。 IAM API 无法确认更改是否已完全传播,因此遗憾的是,有时 Terraform 移动得太快,试图利用它在创建传播到(在本例中为 EKS)之前成功创建的策略。因为这是底层 API 的限制,所以遗憾的是没有任何好的解决方法。
  • 是的@MartinAtkins,我同意你的观点。

标签: amazon-web-services terraform amazon-iam


【解决方案1】:

您不应该使用depends_on,除非有一些特殊情况。从templates/IAM/roles,定义一个作为角色名称的输出,并在其他模块中传递此输出(role_name = module.ControlPlane_Role.output_role_name)。通过此设置,依赖关系图清晰(创建角色,创建依赖于角色的事物),而不必使用 depends_on 手动定义依赖关系。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2019-12-24
    相关资源
    最近更新 更多