terraform - 在根模块中使用 aws_vpc 数据源的 Terraform 鸡/蛋问题
问题描述
我有一个根 Terraform 模块,它声明了一个 VPC 模块和其他模块,例如要在 VPC 中启动的 EC2 实例。
在 EC2 模块中,我使用以下aws_vpc
类型读取 VPC:
data "aws_vpc" "vpc" {
filter {
name = "tag:Name"
values = [var.name_tag]
}
}
现在,如果我独立声明模块,这可以正常工作。
但是当声明一个单独声明这些其他模块的根模块时,我得到了这个失败:
▶ terraform apply
module.cloudwatch.data.aws_ami.ami: Refreshing state...
module.backend.data.aws_vpc.vpc: Refreshing state...
module.backend.data.aws_ami.ami: Refreshing state...
Error: no matching VPC found
on .terraform/modules/backend/main.tf line 1, in data "aws_vpc" "vpc":
1: data "aws_vpc" "vpc" {
所以这里有一个鸡/蛋的问题。
我很困惑。这怎么可能奏效?如果一个根模块不能同时声明一个VPC,然后再使用aws_vpc
数据源将其读入其他模块,那么这些数据源有什么用呢?我会很感激关于这里的最佳实践的建议。我是否应该干脆不使用aws_vpc
VPC ID 作为其他地方的输出读入?
解决方案
对我来说,这听起来像是你在声明一个资源,比如
resource "aws_vpc" "example" {}
和数据提供者,如
data "aws_vpc" "example" {}
为了从数据中访问一些东西,比如data.aws_vpc.example.arn
. 这不是必需的,实际上是导致您的错误。如果两者都处于相同的 terraform 状态,您可以简单地删除data "aws_vpc" "example" {}
并通过 eg 引用资源resource.aws_vpc.example.arn
。
数据提供者实际上仅在您指的是在其他地方创建的资源时才需要,例如手动创建的资源,由不同的供应引擎(或也由 terraform,但在不同的层)。
推荐阅读
- javascript - 如何解析网页并获取指示内容
- rust - 当第一个编译器无法构建板条箱时,您可以使用不同的编译器吗?
- java - PasswordField 'bullets' 没有在使用 Gluon 客户端插件构建的 Android 应用程序中正确显示
- flutter - 如果产品尺寸不同,颤振添加到新购物车
- wildfly - Wildfly 24、Java 11.0.11 添加外部安全提供程序
- react-slick - react-slick 最后一张幻灯片在加载时首先显示
- shared-libraries - 在 Yocto 中将 .so 和符号链接添加到 .so
- docker - Rabbitmq 没有从集群配置开始
- javascript - 'Router' 不能用作 JSX 组件
- google-apps-script - 为不属于我的域的特定用户发布/安装 gmail 插件