您可以在地形子目录之间共享父资源吗?



我正在考虑使用以下地形目录结构将应用程序分解为微服务:

/staging
/global
/service1
/service2
/prod
/global
/service1
/service2

假设我希望每个微服务都有自己的 AWS Apigateway 终端节点:

myurl.com/service1
myurl.com/service2

这两个服务可以是同一父 AWS apigateway 资源的一部分:

#creates the api (a parent of all resources), 
resource "aws_api_gateway_rest_api" "api" {
name        = "API root parent"
description = "Contains all endpoints"
}

我的理解是,每个顶级 AWS REST API 都是它自己的 cloudfront,因此我的所有微服务只需要其中一个,而不是每个微服务一个 REST api。 我想将 REST api 声明放在/global文件夹中,因为它将由所有微服务共享。

然后在 service1 子目录中,我将开始定义需要引用父级的资源:

resource "aws_api_gateway_resource" "service1" {
rest_api_id = "${aws_api_gateway_rest_api.api.id}"
parent_id   = "${aws_api_gateway_rest_api.api.root_resource_id}"
path_part   = "service1"
}

但是,由于 service1 子目录未在同一目录中定义,因此如何访问api资源?

对于每个微服务子目录,我也许可以将现有资源的状态导入到子目录中,但这似乎一团糟。

更新:看起来 AWS api 网关只收取使用费,所以我毕竟可以为每个子目录创建单独的 rest api 资源。 但我可能仍然需要知道如何跨子文件夹收集资源变量,以便将相应的 api 部署阶段添加到公共自定义域。 是否有一种技术或模式能够主要按文件夹分隔项目,但能够提取变量并将它们粘合在一起,而不是特定于每个子目录的/global

terraform 中的远程状态是您要查找的 https://www.terraform.io/docs/state/remote.html https://www.terraform.io/docs/providers/terraform/d/remote_state.html

由于您位于 AWS 中,因此您可以使用 S3 作为远程状态的存储。

data "terraform_remote_state" "prod_service1" {
backend = "s3"
config {
region = "eu-west-1"
bucket = "uservices_terraform_bucket_name"
key    = "/states/prod/service1/terraform.tfstate"
access_key = "${var.aws_access_key}"
secret_key = "${var.aws_secret_key}"
token      = "${var.aws_session_token}"
}
}

然后,您将能够在另一个微服务中使用 terraform 状态的输出,使用

"${data.terraform_remote_state.prod_service1.api_id}"

最新更新