Рубрики
Uncategorized

Настройка Postgres и GraphQL API с Hasura на Azure

Я создал модель данных для хранения железнодорожных систем, услуг, запланированных моментов, времени и связанной информации, подробно описывающей схему «за пределами моделирования данных Crud N ‘Cruft с несколькими изменениями. Оригинал, который я создал для Apache Cassandra, и с тех пор переключился на Postgres, предоставляя возможность первичных и иностранных ключей, отношений и связанных соединений для модели. В этом посте я буду использовать эту схему, чтобы создать инфраструктуру в качестве решения кода с Terraform, используя Postgres и Hasura (OSS). Tagged с DevOps, Show Dev, Docker, как.

Ключевые технологии: Хасура , Postgres , Terraform , Docker и Azure Анкет

Я создал модель данных для хранения железнодорожных систем, услуг, запланированных, временных точек и связанной информации, подробно описывая схему «Помимо Crud N ‘Cruft-Modeling» с несколькими настройками. Оригинал, который я создал для Apache Cassandra, и с тех пор переключился на Postgres, предоставляя возможность первичных и иностранных ключей, отношений и связанных соединений для модели.

В этом посте я буду использовать эту схему, чтобы создать инфраструктуру в качестве решения кода с Terraform , используя Postgres и Hasura (OSS) Анкет

Предварительные условия

Docker сочиняет среду разработки

Для файла Docker Compose я только что поместил их в корень репозитория. Добавьте файл docker-compose.yaml, а затем добавил сервисы. Первой службой, которую я настройка была базой данных Postgres/PostgreSQL. Это использует стандарт Postgres Image на Docker Hub . Я выбрал версию 12, я хочу, чтобы она всегда перезагрузилась, если она выключается или сбой, а затем последним из очевидных настройков является порт, который карты от 5432 до 5432.

Для объема, поскольку я мог бы захотеть сделать резервное копирование или вонзаться с томом, я поместил местоположение DB_DATA, установленное на свое собственное Codez каталог. Все мои базы данных я склонен настраивать это на случай, если мне нужно отлаживать вещи локально.

Postgres_password является переменной среды, таким образом, синтаксис $ {Ppassword} Анкет Таким образом, никакие пароли не попадают в репо. Тогда я могу загрузить переменную среды через стандартный Экспорт Строка в моем сценарии запуска системы или с помощью других средств.

services:
  postgres:
    image: postgres:12
    restart: always
    volumes:
      - db_data:/Users/adron/Codez/databases
    environment:
      POSTGRES_PASSWORD: ${PPASSWORD}
    ports:
      - 5432:5432

Для тома DB_DATA вниз я добавляю настройку значения клавиши, чтобы ссылаться на его.

volumes:
  db_data:

Hasura API

Затем я добавил решение GraphQL с Hasura. Изображение для v1.1.0, вероятно, нужно обновить (я считаю, что мы сейчас на версии 1.3.x) Так что я сделаю это в ближайшее время, но получил пример, работающий с V1.1.0. Затем у меня есть порты, нанесенные на карту, чтобы открыть 8080 до 8080. Далее эта служба будет зависеть от уже подробной службы Postgres. Перезагрузите, также всегда устанавливайтесь так же, как сервис Postgres. Наконец, две переменные среды для контейнера:

  • Hasura_graphql_database_url — Эта переменная является базовой строкой подключения к URL Postgres.
  • Hasura_graphql_enable_console — это переменная, которая установит пользовательский интерфейс консоли для инициирования. Мы определенно захотим иметь это для среды разработки. Однако в производстве я, скорее всего, захотел, чтобы это отключилось.
  graphql-engine:
    image: hasura/graphql-engine:v1.1.0
    ports:
      - "8080:8080"
    depends_on:
      - "postgres"
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:logistics@postgres:5432/postgres
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"

На этом этапе команды для начала этого являются относительно минимальными, но, несмотря на это, мне нравится создавать сценарий начала и остановки оболочки. Мой сценарий начала и сценарий остановки просто выглядит так:

Начать/остановка

Запуск услуг.

docker-compose up -d

Для первого выполнения Сервисов вы можете пропустить -d, и вместо этого наблюдайте за стартапом, чтобы просто познакомиться с событиями и соединениями, когда они начинают.

Остановка услуг.

docker-compose down

🚀 Это все для базовой среды разработки, мы запускаем и готовы к разработке. С началом услуг перейдите к https://localhost: 8080/console Чтобы начать работу с пользовательским интерфейсом, который у меня будет более подробная информация о «Помимо Crud N ‘Cruft-Modeling» Обратите внимание на Hasura и Postgres в предстоящем сообщении в блоге.

Для полного синтаксиса Docker-Compose.yaml Проверьте эту суть: https://gist.github.com/adron/0b2ea637b5e00681f4d62404805c3a00

Терраформ производственная среда

Для развертывания производства этого стека я хочу развернуть в Azure , используйте Terraform Для инфраструктуры как кода и Служба базы данных Azure для Postgres во время работы Хасура Для моего уровня API GraphQL.

Для файлов Terraform я создал папку и добавил main.tf файл. Я всегда создаю папку для работы, в целом, чтобы сохранить файлы состояния и первоначальное прототипирование инфраструктуры в единственном месте. В конце концов я настрою место для хранения состояния и полностью автоматизировать процесс с помощью процесса Continutes Integration (CI) и непрерывной доставки (CD). На данный момент, просто единственная папка, чтобы держать все это в.

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

variable "database" {
  type = string
}

variable "server" {
  type = string
}

variable "username" {
  type = string
}

variable "password" {
  type = string
}

Еще одна переменная, которую я захочу, чтобы немного проще проверить, что такое информация о подключении к Hasura, будет выглядеть так.

output "hasura_url" {
  value = "postgres://${var.username}%40${azurerm_postgresql_server.logisticsserver.name}:${var.password}@${azurerm_postgresql_server.logisticsserver.fqdn}:5432/${var.database}"
}

Давайте немного разберем это. Здесь есть много объединенных и интерполированных переменных. Это в основном строка подключения Postgres, которая должна будет создать соединение. Он включает в себя имя пользователя и пароль, а также все соответствующие значения, сбежавшие и строку. Примечание конкретно %40 между $ {var.username} и $ {azurerm_postgresql_server.logisticsserver.name} переменные, в то время как в другом месте определенные символы не сбежались, например, @ знак. При построении этой строки соединения очень важно быть предварительным для всех этих конкретных значений, соединенных вместе. Но я сделал работу за тебя Так что сейчас довольно простая копия и вставка!

Далее мне понадобится информация по провайдеру Azure.

provider "azurerm" {
  version = "=2.20.0"
  features {}
}

Обратите внимание, что есть Особенности Массив, который просто пуст, теперь для поставщика требуется назначить это, даже если массив пуст.

Следующим является ресурсная группа, для которой все будет развернуто.

resource "azurerm_resource_group" "adronsrg" {
  name     = "adrons-rg"
  location = "westus2"
}

Теперь сам сервер Postgres. Обратите внимание на Место а также resource_group_name Просто отобразите в группу ресурсов. Еще одна вещь, которую я нашел немного запутанной, так как я не был уверен, было ли это именем Terraform или имени ресурса или само и имя сервера, — это пара значений ключей «Имя» в этом ресурсе. Однако это имя сервера, которое я назначил var.server Анкет Следующее значение, назначенное «B_GEN5_2», является назначением Azure, который немного загадочный. Подробнее об этом в будущем посте.

После этой информации хранится, я считаю, что если я правильно подведен к 5 концертам хранения. Для того, что я делаю, будет в порядке. Резервное копирование установлена на 7 дней удержания. Это означает, что я смогу вернуться к резервной копии из любого из последних семи дней, но через 7 дней резервные копии свернуты, и последний день удален, чтобы освободить место для новейшего резервного копирования. geo_redundant_backup_enabled Настройка установлена на ложь, потому что с превосходной надежностью Postgres и моей желанием не платить за эту дополнительную страховку надежности, мне не нужна географическая избыточность. Последний я установил auto_grow_enabled К истинно, хотя мне нужно определить точный поток логики, который требуется для этой конкретной реализации и развертывания Postgres.

Последней частью деталей для этого ресурса являются просто имя пользователя и пароль, которые получены из переменных, которые получены из переменных среды, чтобы не допустить фактического имени пользователя и паролей из репозитория. Последние два бита установили SSL на включенную и версию Postgres to v9.5.

resource "azurerm_postgresql_server" "logisticsserver" {
  name = var.server
  location = azurerm_resource_group.adronsrg.location
  resource_group_name = azurerm_resource_group.adronsrg.name
  sku_name = "B_Gen5_2"

  storage_mb                   = 5120
  backup_retention_days        = 7
  geo_redundant_backup_enabled = false
  auto_grow_enabled            = true

  administrator_login          = var.username
  administrator_login_password = var.password
  version                      = "9.5"
  ssl_enforcement_enabled      = true
}

Поскольку настройка базы данных настройка, теперь я могу с уверенностью добавить реальную базу данных в эту базу данных. Здесь resource_group_name вытаскивает из ресурса группы ресурсов и server_name вытягивает из ресурса сервера. Имя, являющееся самому имени базы данных, я тоже выхожу из переменной. Тогда набор символов — UTF8, а Collation установлен на английском языке, которые, как правило, являются стандартными настройками на Postgres, установленных для использования в США.

resource "azurerm_postgresql_database" "logisticsdb" {
  name                = var.database
  resource_group_name = azurerm_resource_group.adronsrg.name
  server_name         = azurerm_postgresql_server.logisticsserver.name
  charset             = "UTF8"
  collation           = "English_United States.1252"
}

Следующее, что я обнаружил, после некоторой проб и ошибок и хорошего поиска, это правило конкретного брандмауэра Postgres. Похоже, что это связано с службой Postgres в Azure, как и для ряда испытаний и многих ошибок, которые я пытался использовать стандартные доступные брандмауэры и правила брандмауэра, которые доступны в виртуальных сетях. Насколько я понимаю, теперь серверы Postgres существуют за пределами этой парадигмы и в связи с тем, что имеют свои правила брандмауэра.

Это правило брандмауэра в основном прикрепляет брандмауэр к группе ресурсов, затем сам сервер и обеспечивает внутренний доступ между сервером Postgres и экземпляром Hasura.

resource "azurerm_postgresql_firewall_rule" "pgfirewallrule" {
  name                = "allow-azure-internal"
  resource_group_name = azurerm_resource_group.adronsrg.name
  server_name         = azurerm_postgresql_server.logisticsserver.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

Hasura API

Последним и последним шагом является настройка экземпляра Hasura для работы с сервером Postgres, а уже доступная база данных.

Чтобы настроить экземпляр Hasura, я решил пойти на службу контейнеров, которую есть Azure. Он обеспечивает относительно недорогой, легкий в настройке и более краткий способ настроить сервер, чем настройка всей виртуальной машины или полной среды Kubernetes, просто для запуска единственного экземпляра.

В первом разделе устанавливается общедоступный IP -адрес, который, конечно, мне нужно изменить по мере разработки приложения, и мне нужно предоставить фактический защищенный фронт. Но пока, чтобы доказать развертывание, я оставил его публичным, настроил метку DNS и установил тип ОС.

Следующий раздел в этом ресурсе я затем намечу детали контейнера. Название контейнера может быть практически тем, что вы хотите, это ваш назначение. Изображение, однако, специально hasura/graphql-engine Анкет Я установил процессор и память довольно низко, на уровне 0,5 и 1,5 соответственно, так как я не подозреваю, что мне понадобится тонна лошадиных сил, чтобы протестировать вещи.

Затем я установил порт, доступный для порта 80. Тогда переменные среды Hasura_graphql_server_port и Hasura_graphql_enable_console к этому порту, чтобы отобразить консоль там. Затем, наконец, эта дикая конкатенированная интерполированная строка подключения, которую я настраиваю как выходная переменная — опять же специально для тестирования — Hasura_graphql_database_url Анкет

resource "azurerm_container_group" "adronshasure" {
  name                = "adrons-hasura-logistics-data-layer"
  location            = azurerm_resource_group.adronsrg.location
  resource_group_name = azurerm_resource_group.adronsrg.name
  ip_address_type     = "public"
  dns_name_label      = "logisticsdatalayer"
  os_type             = "Linux"


  container {
    name   = "hasura-data-layer"
    image  = "hasura/graphql-engine"
    cpu    = "0.5"
    memory = "1.5"

    ports {
      port     = 80
      protocol = "TCP"
    }

    environment_variables = {
      HASURA_GRAPHQL_SERVER_PORT = 80
      HASURA_GRAPHQL_ENABLE_CONSOLE = true
    }
    secure_environment_variables = {
      HASURA_GRAPHQL_DATABASE_URL = "postgres://${var.username}%40${azurerm_postgresql_server.logisticsserver.name}:${var.password}@${azurerm_postgresql_server.logisticsserver.fqdn}:5432/${var.database}"
    }
  }

  tags = {
    environment = "datalayer"
  }
}

Начать/остановка

Чтобы запустить это, аналогично тому, как я настраиваю среду DEV, я настрою сценарий запуска и выключения. Скрипт стартапа с именем prod-start.sh имеет следующие команды. Обратите внимание на $ Pusername и $ Ppassword получены из переменных окружающей среды, где, поскольку два других значения просто встроены.

cd terraform

terraform apply -auto-approve \
    -var 'server=logisticscoresystemsdb' \
    -var 'username='$PUSERNAME'' \
    -var 'password='$PPASSWORD'' \
    -var 'database=logistics'

Для полного файла Terraform ознакомьтесь с этой суть: https://gist.github.com/Adron/6d7cb4be3a22429d0ff8c8bd360f3ce2

Выполнение этого сценария дает мне результаты, которые, если все пойдет правильно, выглядит так же.

./prod-start.sh 
azurerm_resource_group.adronsrg: Creating...
azurerm_resource_group.adronsrg: Creation complete after 1s [id=/subscriptions/77ad15ff-226a-4aa9-bef3-648597374f9c/resourceGroups/adrons-rg]
azurerm_postgresql_server.logisticsserver: Creating...
azurerm_postgresql_server.logisticsserver: Still creating... [10s elapsed]
azurerm_postgresql_server.logisticsserver: Still creating... [20s elapsed]


...and it continues.

Обратите внимание, что этот процесс займет другое количество времени, и он полностью нормален, чтобы занять ~ 3 или более минут. Как только сервер будет выполнен в процессе сборки, многие другие действия начинают происходить очень быстро. Как только все это будет сделано, к концу вывода я получу выходную переменную hasura_url, чтобы я мог подтвердить, что она действительно собрана правильно! Теперь, когда это предварительно сформировано, я могу предпринять следующие шаги и удалить эту выходную переменную, начать затягивать безопасность и другие шаги. Что я буду подробно описать в будущем сообщении в блоге еще раз построен приложением.

... other output here ...


azurerm_container_group.adronshasure: Still creating... [40s elapsed]
azurerm_postgresql_database.logisticsdb: Still creating... [40s elapsed]
azurerm_postgresql_database.logisticsdb: Still creating... [50s elapsed]
azurerm_container_group.adronshasure: Still creating... [50s elapsed]
azurerm_postgresql_database.logisticsdb: Creation complete after 51s [id=/subscriptions/77ad15ff-226a-4aa9-bef3-648597374f9c/resourceGroups/adrons-rg/providers/Microsoft.DBforPostgreSQL/servers/logisticscoresystemsdb/databases/logistics]
azurerm_container_group.adronshasure: Still creating... [1m0s elapsed]
azurerm_container_group.adronshasure: Creation complete after 1m4s [id=/subscriptions/77ad15ff-226a-4aa9-bef3-648597374f9c/resourceGroups/adrons-rg/providers/Microsoft.ContainerInstance/containerGroups/adrons-hasura-logistics-data-layer]

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

hasura_url = postgres://postgres%40logisticscoresystemsdb:theSecretPassword!@logisticscoresystemsdb.postgres.database.azure.com:5432/logistics

Теперь, если я перейду к LogisticsDatalayer.westus2.azurecontainer.io Я могу просматривать консоль Hasura! Но где в мире это полностью квалифицированное доменное имя (FQDN)? Что ж, самый быстрый способ найти его — перейти к порталу Azure и взглянуть на страницу деталей самого контейнера. В верхней части правой стороны доступен FQDN, а также IP, который был назначен контейнеру!

Навигация на этот FQDN URI поднимет консоль Hasura!

Следующие шаги

Отсюда я сделаю следующие шаги в последующем посте. Я получу защиту контейнера, сопоставлю пользовательский интерфейс или CLI или каким -либо образом, что применение я настраиваю на конечные точки API и многое другое!

использованная литература

Зарегистрируйтесь, чтобы сделать код

Для JavaScript, Go, Python, Terraform и больше инфраструктуры, веб -разработчика и кодирования в целом я регулярно транслируюсь на Twitch At https://twitch.tv/adronhall , опубликуйте VOD на YouTube вместе с совершенно новой технологией и Металл Содержание в https://youtube.com/c/thrashingcode Анкет

Для большего количества блога, у меня есть https://compositecode.blog и Информационный бюллетень кода Thrashing , подпишитесь на это Здесь !

Оригинал: «https://dev.to/adron/setup-postgres-and-graphql-api-with-hasura-on-azure-4mne»