如何解决terraform provider 块中的动态变量
我有这个片段:
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
}
}
我可以使用数据块获取此信息,但不能在提供程序内部获取,因为它会导致循环(这是有道理的),但提供程序在执行任何操作之前必须执行该角色的假设角色。
有没有办法在提供者实例化后立即触发代入角色?
p.s 由于某些架构原因,我无法修改 terraform 的触发方式,因此从命令行传递角色 arn 作为参数不是可行的方法。
谢谢!
解决方法
如果您使用来自 AWS 提供商的数据源,则您必须拥有 IAM 角色才能访问该账户。所以这条路是不可行的。
将这些 ARN 放在文件或变量中怎么样,您可以获取它们。如果您在每个环境中拥有不同的 AWS 账户,并且您希望基础设施保持干燥。您可以使用 Terragrunt。
,对 AWS 的任何 API 请求都需要某种凭证,因此不可能完全消除对凭证的假设。
但是,这里有一个可能的妥协:您可以为所有有权担任此角色的用户/角色提供一个额外的限制策略,该策略仅允许查找角色。我认为这将是一个 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,因此总是需要单独提供,例如通过输入变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。