微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

terraform 中多个 AWS 提供商的权限问题

如何解决terraform 中多个 AWS 提供商的权限问题

Terragrunt 使我们的模块、提供程序和后端保持干燥,这很整洁,但现在我正在为软件的局限性而苦苦挣扎。特别是关于在同一模块内的多个 AWS 账户中创建资源;在这种情况下,一个账户中的 aws_ec2_transit_gateway_vpc_attachment 名为“staging”,另一个账户中的 aws_ec2_transit_gateway_vpc_attachment_accepter 名为“shared”,中转网关本身所在的位置。不过请注意,这只是我的用例的一部分,我知道您可以配置中转网关以自动接受附件。我只是选择这个例子来说明我的问题。

为了实现这一点,我在我的 terragrunt.hcl 文件中为共享帐户设置了一个额外的提供程序,并在模块中需要的地方调用它。很像本指南:https://github.com/hashicorp/terraform-provider-aws/blob/master/examples/transit-gateway-cross-account-vpc-attachment/main.tf(虽然本指南不使用 terragrunt)

一个简短的前言是,我们假设在运行 terragrunt 的环境中使用“OrganizationAccountAccessRole”。此角色会在您创建 AWS 账户时自动创建,但只能由主 AWS 账户担任。

这是根 terragrunt.hcl 文件和模块本身的相关片段。不要担心变量引用,只要假设它们是正确的。

#live/terragrunt.hcl
...
iam_role = "arn:aws:iam::${local.account_id}:role/OrganizationAccountAccessRole"

generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  region = "${local.aws_region}"
  assume_role {
    role_arn = "arn:aws:iam::${local.account_id}:role/OrganizationAccountAccessRole"
  }
}
provider "aws" {
  alias = "shared"
  region = "${local.aws_region}"
  assume_role {
    role_arn = "arn:aws:iam::123456789012:role/OrganizationAccountAccessRole"
  }
}
EOF
}
...

用于在共享帐户中承担权限的角色被硬编码到提供者中。

#modules/networking/vpc-main
...
#The attachment is created using the default provider.
resource "aws_ec2_transit_gateway_vpc_attachment" "tgw" {
  vpc_id             = aws_vpc.main.id
  subnet_ids         = values(aws_subnet.private)[*].id
  transit_gateway_id = data.aws_ec2_transit_gateway.data.id
}

#The accepter is created using the aliased "shared" provider
resource "aws_ec2_transit_gateway_vpc_attachment_accepter" "tgw" {
  provider = aws.shared

  transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.tgw.id
}

当我在 live/environments/staging/networking/vpc-main 中运行 terragrunt apply 时收到此错误消息:

Error: error configuring terraform AWS Provider: IAM Role (arn:aws:iam::123456789012:role/OrganizationAccountAccessRole) cannot be assumed.

There are a number of possible causes of this - the most common are:
  * The credentials used in order to assume the role are invalid
  * The credentials do not have appropriate permission to assume the role
  * The role ARN is not valid

Error: NoCredentialProviders: no valid providers in chain. Deprecated.
    For verbose messaging see aws.Config.CredentialsChainVerboseErrors

这表明“共享”提供程序无法承担其需要的角色 (arn:aws:iam::123456789012:role/OrganizationAccountAccessRole)。

我将 AWS_PROFILE 环境变量设置为一个配置文件,该配置文件有权在所有账户中承担 OrganizationAccountAccessRole,我假设提供商将使用这些凭证,但似乎他们使用来自“iam_role ="的凭证terragrunt.hcl 文件中的配置。所以实际上正在发生以下事件:

  1. Terragrunt 本身承担 iam_role = "arn:aws:iam::${local.account_id}:role/${local.sts_assume_role}" 中指定的角色并启动代码段中未显示的 s3 后端。 Terragrunt 现在作为暂存帐户中的“OrganizationAccountAccessRole”工作。
  2. Terragrunt 尝试启动提供程序,但临时帐户中的“OrganizationAccountAccessRole”无权承担共享帐户中的“OrganizationAccountAccessRole”。

据我所知,我有 3 个选择:

  1. 停止使用“OrganizationAccountAccessRole”,而是创建有权在每个其他 AWS 账户中担任等效角色的新角色。通过这种方式,临时帐户可以承担共享帐户中的权限。出于多种原因,这是最不理想的解决方案。

  2. 我可以将附件和接受器模块拆分为自己的 2 个模块,然后 terragrunt 将它们应用到实时存储库文件夹结构中的自己的环境/帐户中。这将解决我的问题,但将两个资源放在同一个模块中会更可取。目标是能够应用和销毁整个 VPC,而不必担心操作顺序。

  3. 在具有我需要的权限的共享账户中创建一个 IAM 用户,然后在我的 .aws/credentials 文件中为该用户创建一个配置文件,并在共享提供程序中指定该配置文件。这可能是最好的解决方案,但感觉有点笨拙,因为它是一种边缘情况修复。

我还有什么选择?我对权限如何继承的假设是错误的吗? 我希望我创建的提供者在担任角色时使用我的凭据,而不是它从“iam_role = x” terragrunt 配置中获得的凭据。

我想要;

my credentials -> provider assume role

不是

my credentials -> terragrunt asumme role -> provider assume role.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。