AWS RDS DescribeDbInstances-使用IaaC仅将结果列表限制为特定实例

时间:2019-05-01 14:09:17

标签: amazon-web-services amazon-rds terraform

我正在尝试使用Terraform来提供体系结构,并确保应用程序对周围的事物了解得尽可能少。

我的目标是拥有一个使用Amazon SDK的应用程序,询问哪些RDS实例可用,然后再连接到其中一个实例。这样,不需要外部信息(db-instance-identifierTag)。

该应用程序将仅描述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,这也无法满足我的要求。

也许我在推理的某些部分上犯了错误,但是否有可能实现?

1 个答案:

答案 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"
}