簡體   English   中英

Terraform 未部署到多個帳戶中

[英]Terraform not deploying into multiple accounts

我在將 terraform/terragrunt 部署到多個帳戶時遇到問題。 我想在我的“主”帳戶中管理 DNS 和 KMS,並將其他所有內容部署到我的 dev/uat/prod 環境中。

我已經使用提供商配置了多個 AWS 賬戶。 一個是通過 terragrunt 自動創建的,另一個是在我的 main.tf 文件中創建的。

我已經嘗試了許多不同的方法來讓它發揮作用。 為這兩個提供者設置別名,只為一個提供者設置別名,並從等式中完全刪除 terragrunt。 在每種情況下,terraform 都被應用到我的“主”帳戶中以獲取所有資源。

下面是我的代碼示例:

  backend = "s3"
#   generate = {
#       path = "backend.tf"
#       if_exists = "overwrite"
#   }
  config = {
    bucket                  = "arm-terraform-state"
    key                     = "${path_relative_to_include()}/terraform.tfstate"
    region                  = "us-west-2"
    dynamodb_table          = "arm-terraform-state-lock"
  }
  generate = {
    path = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
}
generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  alias                   = "main"
  region                  = "${local.aws_region}"
  profile                 = "${local.account}"
}
EOF
}
locals {
    region_vars = read_terragrunt_config(find_in_parent_folders("region.hcl"))
    account_vars = read_terragrunt_config(find_in_parent_folders("account.hcl"))
    aws_region   = local.region_vars.locals.aws_region
    account = local.account_vars.locals.aws_profile
}

以上是我的 Terragrunt 代碼。 這是我的模塊:

resource "aws_iam_role_policy" "logging_role_policy" {
  provider = aws.main
  name = format("aws-sftp-logging-policy-%s-%s",var.product_name,var.env)

  role= aws_iam_role.logging_role.id

  policy = data.aws_iam_policy_document.sftp_logging.json
}
############
# Route 53 #
############
resource "aws_route53_record" "sftp_record" {
  provider = aws.master
  zone_id = data.aws_route53_zone.facteus.zone_id
  name = format("%s-%s",var.product_name,var.env)
  type = "CNAME"
  ttl = "30"
  records = [aws_transfer_server.aws_transfer_service.endpoint]
}

您應該首先創建一個反映您所需帳戶結構的目錄結構。 根據您的問題,聽起來您可能想要這樣的東西:

├── dev
│   ├── terragrunt.hcl
│   └── us-east-1
├── master
│   ├── _global
│   │   └── dns
│   ├── terragrunt.hcl
│   └── us-east-1
│       └── kms
├── prod
│   ├── terragrunt.hcl
│   └── us-east-1
└── uat
    ├── terragrunt.hcl
    └── us-east-1

這里的master賬戶有兩個其他人沒有的目錄:

  1. _global/dns - 由於 AWS 中的 Route 53 是一個全球實體(不是區域性實體),因此您不想將其嵌套在us-east-1下。 它只存在於master帳戶中,因為您聲明要從主帳戶控制 DNS。 (我還建議將其命名為route53而不是dns ,但我離題了。)

  2. us-east-1/kms - 這包含 KMS 配置,也僅用於master

現在,在master/terragrunt.hcl中,設置你的remote_state配置:

remote_state {
  backend = "s3"
  config = {
    encrypt        = true
    bucket         = "master-terraform-state" # Just for example - must be a globally unique
    key            = "${path_relative_to_include()}/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
  }
}

或者,您還可以包含iam_role屬性

iam_role = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"

請注意,這是可選的,因為您也可以使用主帳戶的憑據簡單地執行 Terragrunt,或者您可以使用--terragrunt-iam-role CLI 選項,或者您可以設置TERRAGRUNT_IAM_ROLE 在所有情況下,您都將使用對主帳戶具有權限的角色執行 terragrunt。

現在,對於 dev/uat/prod 帳戶,您可以擁有類似的remote_state配置,為每個帳戶替換不同的存儲桶名稱。 然后,您可以使用適合每個帳戶的 IAM 角色,方法是在每個帳戶的terragrunt.hcl中將其定義為iam_role ,或者通過我提到的其他方法。

TL;DR 您不需要為此生成提供程序,也不需要在提供程序配置中命名配置文件。 您只需為每個賬戶使用正確的 IAM 角色執行 terragrunt。 Terragrunt 將在調用 Terraform 之前擔任該角色。 將提供程序配置放在 Terraform 模塊中,關閉配置文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM