Выполнение сценариев после развертывания в соответствии с вашими потребностями

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

В этой статье я объясню, как вы можете развернуть базу данных RDS и запустить скрипт после развертывания, такой как создание базы данных, таблиц… Я предполагаю, что у вас уже настроены учетные данные aws, а также установлен terraform, и вы также знаком с настройкой корзины S3 в качестве серверной части Terraform, поэтому я в основном сосредоточусь на разделах модулей и в конце кратко рассмотрю часть развертывания.

В проекте будет развернуто несколько элементов

  1. Одна группа хостов-бастионов, которая будет расположена в общедоступной подсети, что позволит вам туннелировать ssh к вашей базе данных + связанная группа безопасности
  2. Одна база данных RDS PostGres и связанные группы безопасности, чтобы разрешить доступ к базе данных только вашим подсетям VPC.
  3. Одна лямбда, развернутая в вашем VPC, потому что вы хотите, чтобы лямбда могла безопасно подключаться к базе данных.
  4. Некоторые параметры SSM, такие как имя пользователя/пароль для вашей базы данных сначала Lambda, а ваше приложение в будущем
  5. Триггер вызова Lambda после развертывания всех предыдущих элементов.

Создание ресурсов

Этот фрагмент блока кода (main.tf — папка module/rds-database-lambda) создаст для вас некоторые из элементов, о которых я упоминал ранее:

  • Группа безопасности вашего бастиона. Обратите внимание, что вам нужно будет разрешить ваш IP-адрес 17 вместо фиктивного — l5
  • Экземпляр ec2, который требует ввода пары ключей (здесь не автоматизирован, поскольку мы хотели бы, чтобы он был постоянным в нашей учетной записи AWS — необходимо обновить строку 39, так же, как и строку 37 AMI-ID) — l34
  • Сам ресурс RDS (обратите внимание, что тип t2.micro (уровень бесплатного пользования) не поддерживает последние версии postgres)— l52
  • Ваша группа безопасности БД, которая разрешает вашему бастиону доступ к БД PG — l72
  • Группа безопасности Lambda — l97 и правило группы безопасности, разрешающее функции доступ к базе данных — l115
  • Сама функция Lambda, которая загружает, использует очень хорошие данные terraform, которые создают архив на основе пути (это позволяет вам включать внешние зависимости в ваш код, такие как psycopg2 в нашем случае) — l124

Записи хранилища параметров находятся в другом модуле (то есть в подпапке) просто для лучшего понимания того, что применяется (обратите внимание, что мы также могли бы разделить наши группы безопасности, db и lambda в разных подпапках). Я просто оставлю один фрагмент кода ниже в качестве примера:

resource “aws_ssm_parameter” “db_master_pwd” {
    name = “/${var.project}/${var.env}/database/master-password”
    description = “Db master password”
    type = “SecureString”
    value = “${var.database_master_password}”
}

Теперь, когда мы поняли, какой элемент будет развернут нашим ТФ, важно понять, как функция Lambda может срабатывать при развертывании инфраструктуры, а также когда приходит время сэкономить немного денег, а значит уничтожить.

Ниже приведен полный код Lambda:

При создании такой лямбды очень важно помнить о некоторых спецификациях:

  1. Лямбда ДОЛЖНА что-то вернуть. Если нет, ваша терраформа будет ждать вывода (см., например, строку 33, где мы проверяем, существует ли уже БД. Мы используем это, когда уничтожаем инфраструктуру в качестве возврата)
  2. Не забудьте войти. Поскольку у вас может быть синтаксическая ошибка SQL или что-то еще, вам нужно иметь возможность быстро диагностировать с помощью журнала cloudwatch, где ваша Lambda дает сбой (пример строки 45, где мы перехватываем исключение, если мы не можем создать базу данных).
  3. Разделите задачи в разных операторах SQL, чтобы получить более понятный код (создайте/заполните/расширения, если есть…)
  4. Не забывайте о своей IAM-роли (разрешения в облачных службах, ssm…) — обратите внимание, что в качестве иллюстрации я привел два разных способа получения учетных данных: с помощью переменных среды или с помощью ssm. Всегда предпочитайте использовать SSM, так как вы можете зашифровать свои секреты

Теперь вы готовы развернуть новый свежий экземпляр RDS и настроить его таким образом, чтобы никогда не бояться разрушения инфраструктуры для снижения затрат. Этот способ работы очень удобен при работе в среде разработки, в которой вы можете создавать быстрые POC, которые не так дорого стоят!

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



Спасибо за чтение.