AWS RDS DescribeDbInstances - ограничить список результатов только конкретным экземпляром, использующим IaaC - PullRequest
1 голос
/ 01 мая 2019

Я пытаюсь предоставить архитектуру Terraform и обеспечить, чтобы приложения знали как можно меньше информации о том, что происходит вокруг них.

Моя цель - создать приложение, использующее Amazon SDK, чтобы узнать, какие экземпляры RDS доступны для него, а затем подключиться к одному из них. Таким образом, никакая внешняя информация (db-instance-identifier или Tag) не требуется.

Приложение будет просто описывать экземпляры RDS, и, поскольку EC2, на котором оно работает, Terraform предоставил бы разрешения только для конкретной RDS, он получил бы только один результат из describe-db-instances. Затем, используя механизм аутентификации RDS IAM, приложение подключается к БД и выполняет свое предназначение.

Хотя из того, что я видел, например, в этом вопросе SO и документации AWS RDS describe-db-instances - это команда типа "все или ничего". Политика IAM, предоставленная роли IAM в профиле экземпляра EC2, должна иметь Resource: "*". Но затем описание содержит все экземпляры RDS, а не только тот, к которому EC2 должен быть подключен. Приложение не может отличить, какой из n результатов из списка экземпляров должен использоваться.

С другой стороны, когда вы ограничиваете describe-db-instances конкретным ресурсом, единственный способ описать без ошибок - добавить db-instance-identifier к запросу:

aws rds describe-db-instances --db-instance-identifier databasename

Но тогда приложению необходимо извлечь db-instance-identifier извне, и это тоже не отвечает моим требованиям.

Возможно, я ошибаюсь в некоторых своих рассуждениях, но возможно ли это даже достичь?

1 Ответ

0 голосов
/ 01 мая 2019

Если экземпляры RDS предоставляются с использованием того же развертывания Terraform, вы можете сделать что-то вроде следующего:

locals {
  allowed_rds_nodes = aws_db_instance.foo.*.id
}

Это базовая абстракция высокого уровня, но вы можете передать список идентификаторов узлов БД в модуль / код Terraform, отвечающий за создание экземпляров EC2.

Если узлы RDS уже существуют, а код Terraform отвечает только за экземпляры EC2, это немного сложнее.

Вы правы в том, что единственный действительный механизм запросов или фильтров для экземпляров RDS (в настоящее время) основан на имени. Вам нужно будет использовать источник данных и применить некое элементарное регулярное выражение имен для узлов вашей БД.

data "aws_db_instance" "allowed_rds_nodes" {
  db_instance_identifier = "some-foo-bar"
}
...