はじめに
先日、Azure Container InstanceでSpring Batchのアプリを動かすことをやってみました。
上記の記事ではAzure Portal上で作業をしたのですが、できるだけ自動化したいので今回はTerraformを使って環境の自動化をしてみました。
事前準備
今回のアプリは、Dockerイメージの格納先としてAzure Container Registry、データベースにPostgreSQLを使っていますので、まずはそれらを作成します。データベースのユーザ名やパスワードはKeyVaultに格納しておきます。PostgreSQLの作成については以下の記事でやりました。
Azure Container Registryについては以下のように書けば良さそうです。
# Azure Container Registryの作成 resource "azurerm_container_registry" "acr" { location = azurerm_resource_group.rg.location name = "いい感じの名前" resource_group_name = azurerm_resource_group.rg.name sku = "Basic" admin_enabled = true }
Azure Container Instanceを作成する
先程の事前準備のリソースとは別ファイルにAzure Container Instanceを作成するためのTerraform設定ファイルを書きます。Azure Container Instanceの作成にあたってAzure Container Registryなどのデータを使う必要があります。Terraformにて既存のリソースのデータを参照するためには、Data Sourceというものを使えば良いようです。
以下のように宣言します。
data "azurerm_resource_group" "rg" { name = "rg-batch001" } data "azurerm_container_registry" "acr" { name = "いい感じの名前" resource_group_name = data.azurerm_resource_group.rg.name } # RDBMSのユーザ名とパスワードの参照のために既存のKeyVaultを参照 data "azurerm_key_vault" "kv" { name = var.kv_name resource_group_name = var.kv_rg } data "azurerm_key_vault_secret" "db-user" { key_vault_id = data.azurerm_key_vault.kv.id name = "app-db-user" } data "azurerm_key_vault_secret" "db-password" { key_vault_id = data.azurerm_key_vault.kv.id name = "app-db-password" }
その後Azure Container Instanceを作成します。公式ドキュメントを拠り所にします。
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/container_group
今回の例ではイメージの取得先はAzure Container Registryですので、image_registry_credential
にて以下のように設定します。
image_registry_credential { password = data.azurerm_container_registry.acr.admin_password server = data.azurerm_container_registry.acr.login_server username = data.azurerm_container_registry.acr.admin_username }
環境変数の設定はenvironment_variables
かsecure_environment_variables
にて設定できますが、パスワードなどの情報が含まれているためここではsecure_environment_variables
を使います。
secure_environment_variables = { "SPRING_PROFILES_ACTIVE" = "prod", "MYAPP_DATASOURCE_URL" = "jdbc:postgresql://${local.postgresql.name}.postgres.database.azure.com:5432/${local.postgresql.dbname}" "MYAPP_DATASOURCE_USERNAME" = "${data.azurerm_key_vault_secret.db-user.value}@${local.postgresql.name}", "MYAPP_DATASOURCE_PASSWORD" = data.azurerm_key_vault_secret.db-password.value }
Azure Portal上では以下のスクリーンショットのようにIPアドレスを「なし」に設定できるのですが、
Terraform上ではPublicかPrivateかの設定しかできなかったので、今回はPublicにしました。
Port番号は指定しないとterraform apply
コマンドが失敗しましたので、適当なものを指定しておきました。
ports { port = 443 protocol = "TCP" }
PostgreSQLへの接続情報など、繰り返し同じ値を記述したくはないので、variables.tf
にて定数を設定します。
variable "kv_name" { type = string } variable "kv_rg" { type = string } locals { postgresql = { name = "PostgreSQLの名前" dbname = "データベースの名前" } }
結果、Azure Container Instanceの設定は以下の通りとなりました。
resource "azurerm_container_group" "aci" { location = data.azurerm_resource_group.rg.location name = "Azure Container Instanceの名前" os_type = "linux" resource_group_name = data.azurerm_resource_group.rg.name ip_address_type = "Public" restart_policy = "Never" image_registry_credential { password = data.azurerm_container_registry.acr.admin_password server = data.azurerm_container_registry.acr.login_server username = data.azurerm_container_registry.acr.admin_username } container { cpu = 0.5 image = "${data.azurerm_container_registry.acr.login_server}/batch_processing:latest" memory = 1.5 name = "miyohidebatchapp" ports { port = 443 protocol = "TCP" } secure_environment_variables = { "SPRING_PROFILES_ACTIVE" = "prod", "MYAPP_DATASOURCE_URL" = "jdbc:postgresql://${local.postgresql.name}.postgres.database.azure.com:5432/${local.postgresql.dbname}" "MYAPP_DATASOURCE_USERNAME" = "${data.azurerm_key_vault_secret.db-user.value}@${local.postgresql.name}", "MYAPP_DATASOURCE_PASSWORD" = data.azurerm_key_vault_secret.db-password.value } } }
以上の設定を行うことで、無事Spring Batchのアプリを動かすことができました。