【问题标题】:How to deploy a Terraform module with many roles?如何部署具有多个角色的 Terraform 模块?
【发布时间】:2019-12-01 06:05:57
【问题描述】:

我目前正在处理一个 AWS terraform 项目,其中我有一组用于不同帐户的 ROLE ID(作为变量)。

variable "slave_account_id" {
 default = ["5686435678", "9889865446"]
}

这些角色中的每一个都允许我当前的 AWS 账户(与 terraform 链接)在这些账户上部署模块(假设每个账户都有角色 ID)

因此,我想根据变量数组“slave_account_id”为每个角色创建不同的提供者。

我试着这样做:

provider "aws" {
  counter = "${length(var.slave_account_id)}"

  alias  = "aws-assume-${counter.index}"
  region = "eu-west-1"

  assume_role {
    role_arn     = "arn:aws:iam::${var.slave_account_id[counter.index]}:role/slave_role_for_master"
    session_name = "${var.slave_session_name[counter.index]}"
    external_id  = "EXTERNAL_ID"
  }
}

这样我就打算在我的模块中使用这个代码:

module "my_super_module" {
 counter = "${length(var.slave_account_id)}"
 providers = {
   aws = "aws.aws-assume-${counter.index}"
 }

 [...]
}

但这不起作用(据我了解,我不能在提供者的别名内“连接”变量,因为必须先定义提供者,然后才能进行插值)。 以下是执行结果(提供者别名部分的错误):

Error: Invalid provider configuration alias

An alias must be a valid name. A name must start with a letter and may contain
only letters, digits, underscores, and dashes.


Error: Duplicate provider configuration

  on main.tf line 5:
   5: provider "aws" {

A default (non-aliased) provider configuration for "aws" was already given at
main.tf:1,1-15. If multiple configurations are required, set the "alias"
argument for alternative configurations.


Error: Unsuitable value type

  on main.tf line 8, in provider "aws":
   8:   alias  = "aws-assume-${counter.index}"

Unsuitable value: value must be known


Error: Variables not allowed

  on main.tf line 8, in provider "aws":
   8:   alias  = "aws-assume-${counter.index}"

Variables may not be used here.


Error: Invalid provider configuration reference

  on main.tf line 33, in module "my-lambda":
  33:     aws = "aws.aws-assume-${counter.index}"

A provider configuration reference must not be given in quotes.

所以我有点失落……

如何部署具有角色 ID 列表的模块(每个帐户一个模块)?

【问题讨论】:

  • 您可以在提供程序定义中进行插值,尽管我没有尝试在此处使用 count 元参数,因此这可能不起作用。当您尝试使用该集合运行时,您会收到错误吗?如果是这样,您可以编辑您的问题以包含它吗?我还想问您是否真的想一开始就同时部署到多个 AWS 账户。 AWS 账户在事物之间提供了很好的分离,并有助于最大限度地减少爆炸半径,所以我很惊讶您想避免这种分离。
  • @ydaetskcoR 我已经添加了执行结果(错误)。这些错误似乎都与提供程序部分中的别名有关。是的,我真的很想部署到多个 AWS 账户 :'( 也许还有另一种方式可以在没有“提供者”的情况下担任角色,但我没有找到......

标签: amazon-web-services module terraform


【解决方案1】:

Terraform 中的提供者配置不是动态可构造的(即根据值决定创建哪个),因为 Terraform 需要在生命周期的早期、图形构建期间和表达式评估可能之前将提供者与资源相关联。

相反,我们可以重构问题,使每个模块采用固定数量的 AWS 提供商(通常是一个,但在某些情况下,如果模块的目的是在两个区域或两个账户之间建立对等互连,则为两个),然后在根目录中多次实例化模块:

provider "aws" {
  alias = "eu-west-1_5686435678"

  region = "eu-west-1"
  assume_role {
    role_arn     = "arn:aws:iam::acct5686435678:role/admin"
    session_name = "whatever_session_name"
    external_id  = "EXTERNAL_ID"
  }
}

provider "aws" {
  alias = "eu-west-1_9889865446"

  region = "eu-west-1"
  assume_role {
    role_arn     = "arn:aws:iam::acct9889865446:role/admin"
    session_name = "whatever_session_name"
    external_id  = "EXTERNAL_ID"
  }
}

module "acct5686435678" {
  source = "./modules/aws-account"

  providers = {
    aws = aws.eu-west-1_5686435678
  }
}

module "acct9889865446" {
  source = "./modules/aws-account"

  providers = {
    aws = aws.eu-west-1_9889865446
  }
}


module "peering_5686435678_9889865446" {
  source = "./modules/aws-account-peering"

  providers = {
    aws.from = aws.eu-west-1_5686435678
    aws.to   = aws.eu-west-1_9889865446
  }
}

对于必须在多个 AWS 账户或多个 AWS 区域创建相同基础设施的情况,多次实例化同一模块是一种常用技术。

话虽如此,如果多个 AWS 账户代表单独的环境而不是环境中的单独组件,通常最好在每个环境使用单独的根配置同时仍共享模块,以便对每个环境的更新完全分开,每个环境都有自己的状态等。

【讨论】:

  • 非常感谢@martin-atkins 的精彩解释 :) 因此,据我了解,如果我想在为每个帐户部署相同模块时假设 100 个角色(每个帐户 1 个角色),我会必要需要创建 100 个不同的提供程序并实例化 100 个模块(每次只更改提供程序部分)。从开发人员的角度来看,这是一个遗憾(大量冗余代码......)。
  • 确实,尽管我认为在那个规模(超过几个帐户)是时候考虑分解问题的方法了。在单个配置中管理数百个帐户的内容似乎试图用一个巨大的 Terraform 配置来管理您的整个世界,但不建议这样做,因为它会使错误的“爆炸半径”变得很大。相反,拥有大型系统的团队通常会以一种或多种方式分解它(每个环境、每个应用程序、每个帐户、每个更改频率、每个层的任何组合......)并根据需要将它们与外部自动化连接。
  • 很抱歉跳到这里。你能解释更多关于分解问题的信息吗?或者将我指向一个资源?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2019-12-08
  • 2020-06-30
  • 2014-01-31
相关资源
最近更新 更多