为什么 terragrun 会破坏之前创建的资源

why terragrunt destroy previous created resources

我将我们的地形代码组织如下:

     $ 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目录下运行 terrag运行t时,会破坏之前创建的ECS集群。如果我先创建 ECR 资源,然后 cd ecs 到 运行 terrag运行t,它会破坏 ECR 资源。即使我将 ECR 依赖项放在 ECS terraform.tfvars 文件中,它也有相同的结果。 我认为这是因为 terrag运行t 不包含 "infrastructure" 下所有子文件夹的资源定义。如果是这样,是否可以以这种方式构建 terraform 目录?

是的,我可以将基础结构组件分成不同的文件夹。但是,您必须让每个组件保持不同的密钥,这样不同的组件之间就不会共享状态。这是我找的零钱。

$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
    }
  }
}

修改后,我可以在子文件夹下运行 terrag运行t 而不会互相影响。