Azure Container InstanceでSpring Batchのアプリを動かす(2)

はじめに

先日、Azure Container InstanceでSpring Batchのアプリを動かすことをやってみました。

miyohide.hatenablog.com

上記の記事ではAzure Portal上で作業をしたのですが、できるだけ自動化したいので今回はTerraformを使って環境の自動化をしてみました。

事前準備

今回のアプリは、Dockerイメージの格納先としてAzure Container Registry、データベースにPostgreSQLを使っていますので、まずはそれらを作成します。データベースのユーザ名やパスワードはKeyVaultに格納しておきます。PostgreSQLの作成については以下の記事でやりました。

miyohide.hatenablog.com

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というものを使えば良いようです。

www.terraform.io

以下のように宣言します。

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_variablessecure_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アドレスを「なし」に設定できるのですが、

f:id:miyohide:20210926165703p:plain

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のアプリを動かすことができました。

f:id:miyohide:20210926170225p:plain