[英]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
賬戶有兩個其他人沒有的目錄:
_global/dns
- 由於 AWS 中的 Route 53 是一個全球實體(不是區域性實體),因此您不想將其嵌套在us-east-1
下。 它只存在於master
帳戶中,因為您聲明要從主帳戶控制 DNS。 (我還建議將其命名為route53
而不是dns
,但我離題了。)
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.