Terraform 提供程序块中的动态变量

Dynamic variable in terraform provider block

我有这个片段:

provider "aws" {
   region = "eu-west-1"
   
   assume_role {
       role_arn = "arn:aws:iam::123456789011:role/MyRole"
   }

}

我想知道是否有某种方法可以从创建它的 cloudformation 堆栈中动态获取此角色 arn。澄清一下,像这样(我知道这行不通)

    data "aws_iam_role" "myrole" {
      name = "MyRole"
    }

    provider "aws" {
   region = "eu-west-1"
   
   assume_role {
       role_arn = data.aws_iam_role.myrole.arn
   }

}

我可以通过数据块获得它,但不能在提供者内部获得,因为它会导致循环(这是有道理的),但提供者必须先完成该角色的 assume_role做任何事情。

有没有一种方法可以在提供程序实例化后立即触发承担角色?

p.s 由于某些架构原因,我无法修改触发 terraform 的方式,因此从命令行将角色 arn 作为参数传递是不可行的方法。

谢谢!

如果您使用来自 AWS 供应商的数据源,您必须拥有 IAM 角色才能访问该帐户。所以这条路不可行。

将这些 ARN 放在文件或变量中怎么样,您可以获取它们。如果您在每个环境中拥有不同的 AWS 账户,并且您希望让基础设施保持干爽状态。您可以使用 Terragrunt.

对 AWS 的任何 API 请求都需要某种凭据,因此不可能完全 消除对凭据的假设。

但是,这里有一个可能的折衷方案:您可以为所有有权担任此角色的 users/roles 提供一个额外的有限策略, 允许查看上角色。我认为那将是一项 IAM 政策,其行动具体 iam:GetRole。然后您可以仅针对该查找使用替代(别名)提供程序配置,然后使用结果填充默认提供程序配置:

provider "aws" {
  alias = "role_lookup"

  region = "us-west-1"
}

data "aws_iam_role" "assume" {
  provider = aws.role_lookup

  name = "MyRole"
}

provider "aws" {
  region = "us-west-1"

  assume_role {
    role_arn = data.aws_iam_role.assume.arn
  }
}

这不是典型的 Terraform 模式——一个提供者配置依赖于自身的另一个实例的情况并不常见——但它应该作为 Terraform 如何处理提供者之间依赖关系的逻辑扩展。

还值得注意的是,角色 ARN 完全系统地派生自角色名称和账户 ID,因此如果您愿意硬编码该假设(这似乎不太可能改变),那么还有另一个变体以上不需要主凭据具有特殊访问权限来查找 IAM 角色:

provider "aws" {
  alias = "identity"

  region = "us-west-1"
}

data "aws_caller_identity" "current" {
  provider = aws.identity
}

provider "aws" {
  region = "us-west-1"

  assume_role {
    role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/MyRole"
  }
}

这个方法的工作原理是获取与主要凭据关联的账户 ID,然后将该账户 ID 插入到 ARN 中,同时对角色名称进行硬编码。

在这两种情况下,我假设您担任的角色与担任该角色的原则属于同一帐户。跨账户承担角色不会以这种方式工作,因为无法自动推断目标账户 ID,因此始终需要单独提供,例如通过输入变量。