我正在尝试使用Terraform配置一个架构,并确保应用程序尽可能少地了解周围的任何事情。
我的目标是让一个使用亚马逊SDK的应用程序询问哪些RDS实例可用于它,然后连接到其中一个。这样,就不需要外部信息(db-instance-identifier
或Tag
)。
该应用程序只会描述RDS实例,并且由于它运行的EC2将被Terraform仅授予特定RDS的权限,因此它只能获得describe-db-instances
的一个结果。然后,通过使用RDS IAM身份验证机制,应用程序将连接到数据库并实现其目的。
虽然从我所看到的,例如in this SO question和AWS RDS文档describe-db-instances
是“全有或全无”类型的命令。在EC2实例配置文件中赋予IAM角色的IAM策略必须具有Resource: "*"
。但是,描述包含所有RDS实例,而不仅仅是应该允许连接的EC2。应用程序无法区分哪个n
结果与实例列表一起使用。
另一方面,当您将describe-db-instances
限制为特定资源时,唯一可以无故障描述的方法是将db-instance-identifier
添加到请求中:
aws rds describe-db-instances --db-instance-identifier databasename
但是,应用程序需要从“外部”检索db-instance-identifier
,这也无法满足我的要求。
也许在我的推理的某些部分我弄错了,但它甚至可能实现吗?
如果使用相同的Terraform部署配置RDS实例,则可以执行以下操作:
locals {
allowed_rds_nodes = aws_db_instance.foo.*.id
}
这是一个基本的高级抽象,但您可以将DB节点的ID列表传递给负责创建EC2实例的Terraform模块/代码。
如果RDS节点已经存在,并且Terraform代码仅负责EC2实例,那就有点棘手了。
您是正确的,因为RDS实例(当前)的唯一有效查询或过滤机制是基于名称的。您需要使用数据源,并在数据库节点上强制执行某种基本的命名正则表达式。
data "aws_db_instance" "allowed_rds_nodes" {
db_instance_identifier = "some-foo-bar"
}