2

我组织了我们的 terraform 代码如下:

     $ tree infrastructure
    infrastructure
    ├── ecr
    │   └── terraform.tfvars
    ├── ecs
    │   ├── ecs-iam.json
    │   └── terraform.tfvars
    └── terraform.tfvars

    2 directories, 4 files
    $cat infrastructure/terraform.tfvars 
    terragrunt = {
     remote_state {
    backend = "s3"
    config {
      bucket     = "terraform-dev-state-west2"
      key        = "dev/terraform.tfstate"
      region     = "us-west-2"
      encrypt    = true
    }
  }
}

在每个组件目录下,我将定义共享模块的属性

$more infrastructure/ecr/terraform.tfvars
terragrunt = {
  include {
    path = "${find_in_parent_folders()}"
  }

  terraform {
    source = "git::ssh://git@git.xxx.xxx/deployment//modules/ecr"
  }
}

repository_names = [
  "web",
  "db",
  "cache",
  "log"
]

我可以转到 ecr 或 ecs 等单个目录,运行“terragrunt init; terragrunt apply”没有问题。它将创建 AWS ECR 或 AWS ECS 集群。但是当我在 ECR 目录中运行 terragrunt 时,它会破坏之前创建的 ECS 集群。如果我先创建 ECR 资源,然后 cd ecs 运行 terragrunt,它将破坏 ECR 资源。即使我将 ECR 依赖项放在 ECS terraform.tfvars 文件中,它也具有相同的结果。我认为这是因为 terragrunt 不包括“基础设施”下所有子文件夹的资源定义。如果是这种情况,是否可以以这种方式构建 terraform 目录?

4

1 回答 1

2

是的,我可以将基础设施组件分成不同的文件夹。但是,您必须为每个组件保留不同的键,以便不同的组件不会在彼此之间共享状态。这是我的零钱。

$cat infrastructure/terraform.tfvars 
    terragrunt = {
     remote_state {
    backend = "s3"
    config {
      bucket     = "terraform-dev-state-west2"
      key        = "${path_relative_to_include()}/terraform.tfstate"
      region     = "us-west-2"
      encrypt    = true
    }
  }
}

进行此更改后,我可以在子文件夹下运行 terragrunt 而不会相互影响。

于 2018-04-24T23:46:03.490 回答