在根模块中使用 aws_vpc 数据源的 Terraform 鸡/蛋问题

Ale*_*vey 3 terraform

我有一个根 Terraform 模块,它声明了 VPC 模块和其他模块,例如要在 VPC 中启动的 EC2 实例。

\n\n

在 EC2 模块中,我使用以下类型读取 VPC aws_vpc

\n\n
data "aws_vpc" "vpc" {\n  filter {\n    name  = "tag:Name"\n    values = [var.name_tag]\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,如果我独立声明模块,则效果很好。

\n\n

但是当声明一个单独声明这些其他模块的根模块时,我遇到了这个失败:

\n\n
\xe2\x96\xb6 terraform apply\nmodule.cloudwatch.data.aws_ami.ami: Refreshing state...\nmodule.backend.data.aws_vpc.vpc: Refreshing state...\nmodule.backend.data.aws_ami.ami: Refreshing state...\n\nError: no matching VPC found\n\n  on .terraform/modules/backend/main.tf line 1, in data "aws_vpc" "vpc":\n   1: data "aws_vpc" "vpc" {\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以这里就存在先有鸡还是先有蛋的问题。

\n\n

我很困惑。这怎么可能行得通呢?如果一个根模块不能既声明一个VPC,又不能在aws_vpc以后使用该数据源将其读入其他模块,那么这些数据源有什么用呢?我希望得到有关最佳实践的建议。我是否应该不使用aws_vpcVPC ID,而是将其作为输出读取到其他地方?

\n

Fal*_*zky 6

对我来说,这听起来像是您在声明两个资源,例如

resource "aws_vpc" "example" {}
Run Code Online (Sandbox Code Playgroud)

和数据提供者一样

data "aws_vpc" "example" {}
Run Code Online (Sandbox Code Playgroud)

为了从数据中访问某些内容,例如data.aws_vpc.example.arn. 这是不需要的,实际上会导致您的错误。如果两者处于相同的 terraform 状态,您可以简单地删除data "aws_vpc" "example" {}并通过例如引用资源resource.aws_vpc.example.arn

实际上,仅当您引用在其他地方创建的资源(例如通过不同的配置引擎(或也通过 terraform,但在不同的层中)手动创建的资源)时,才需要数据提供程序。

  • 在这种情况下,我建议向模块 B 添加一个参数,该参数采用 vpc 的 arn 等。通常最好不要在模块中引用 terraform 状态,而是使用参数来提供此类信息。 (2认同)