我正在尝试使用Terraform来提供体系结构,并确保应用程序对周围的事物了解得尽可能少。
我的目标是拥有一个使用Amazon SDK的应用程序,询问哪些RDS实例可用,然后再连接到其中一个实例。这样,不需要外部信息(db-instance-identifier
或Tag
)。
该应用程序将仅描述RDS实例,并且由于Terraform仅将其运行所在的EC2授予了特定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
,这也无法满足我的要求。
也许我在推理的某些部分上犯了错误,但是否有可能实现?
答案 0 :(得分:0)
如果使用相同的Terraform部署来配置RDS实例,则可以执行以下操作:
locals {
allowed_rds_nodes = aws_db_instance.foo.*.id
}
这是基本的高级抽象,但是您可以将数据库节点ID的列表传递给负责创建EC2实例的Terraform模块/代码。
如果RDS节点已经存在,并且Terraform代码仅负责EC2实例,那就有些麻烦了。
您是正确的,因为(当前)RDS实例唯一有效的查询或过滤机制是基于名称的。您将需要使用数据源,并在您的数据库节点上实施某种基本的命名正则表达式。
data "aws_db_instance" "allowed_rds_nodes" {
db_instance_identifier = "some-foo-bar"
}