【发布时间】:2021-06-26 08:21:05
【问题描述】:
我想知道如果给定的资源是否已经创建,是否可以设置 Terraform 变量的值。
我的 Terraform 项目管理许多无状态资源,但也管理一种有状态资源:数据库。基础设施第一次到位时,我们想要初始化(导入)数据库,但不是下一次(当根据 Terraform 声明升级无状态资产时)。此导入由 EC2 实例的 User Data 脚本完成(编辑:EC2 实例是无状态的,为了方便我们将 DB 导入命令放在其 user_data 中并限制从 EC2 实例对 RDS DB 的访问)。
我们在用户数据脚本中检测是否是第一次并不明显(这需要开发)。所以现在我可以看到两个选项:
- 在调用
terraform apply的脚本中,我可以查询 Terraform 状态 (terraform state list) 以确定 DB 是否已经存在,并将其作为变量传递给terraform apply。 - 但如果可以直接在 Terraform 声明中确定 DB 资源的当前状态(它是否存在)会更简单,所以我可以将它传递给我的用户数据脚本(因此它会初始化 DB或不)。我没有看到如何做到这一点。我看不到任何函数,看起来当我引用资源的属性(例如:RDS DB 的 ID)时,它将在创建资源后计算。
你知道我的第二点是否可行吗?
【问题讨论】:
-
没有。 tf 中没有确定某物是否存在的功能,除非您为此实施了一些自定义解决方案。
-
这个问题有点过于抽象,缺乏其他相关信息。如果您唯一的托管有状态资源是 RDS,那么为什么会有
user_data?这意味着一个实例也被管理,这是有状态的。此外,大概可以由提供者或在 Terraform 配置中为无状态资源赋予状态以确保它们的幂等性,然后您将有更多可用选项。 -
EC2 实例本身是无状态的(我们的服务器应用程序正在其上运行,它不会在其磁盘上存储任何数据并且可以销毁/重新创建)。我们目前使用它的
user_data来运行初始导入(以及其他初始化,例如为实例本身定制配置文件)。
标签: terraform