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,因此始终需要单独提供,例如通过输入变量。
我有这个片段:
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,因此始终需要单独提供,例如通过输入变量。