Azure Container InstanceでAzure Database for PostgreSQL flexible serverに対してpg_dumpを実行してみる(2)

先日試しに動かしてみたAzure Container Instanceでpg_dumpを実行してみることの続きをやってみました。

miyohide.hatenablog.com

Terraform

環境構築を逐一手で行うのが面倒くさかったので、Terraformで構築することにします。

PostgreSQLはこんな感じで用意します。

resource "azurerm_postgresql_flexible_server" "main" {
  name                   = "pg-${var.prefix}-${random_string.name.result}"
  resource_group_name    = azurerm_resource_group.main.name
  location               = azurerm_resource_group.main.location
  version                = "13"
  administrator_login    = var.postgresql_admin
  administrator_password = var.postgresql_password
  storage_mb             = 32768
  sku_name               = "B_Standard_B1ms"
}

resource "azurerm_postgresql_flexible_server_database" "main" {
  name      = var.postgresql_database
  server_id = azurerm_postgresql_flexible_server.main.id
}

resource "azurerm_postgresql_flexible_server_firewall_rule" "main" {
  name                = "allowazure1"
  server_id           = azurerm_postgresql_flexible_server.main.id
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"  
}

本当は「Azure内の任意のAzureサービスにこのサーバーへのパブリックアクセスを許可する」を設定する必要があるのですが、どうもTerraformでの設定はうまく動きませんでしたので手で設定することにしました。 単純にazurerm_postgresql_flexible_server_firewall_ruleazurerm_postgresql_firewall_ruleに間違えただけでした...

バックアップファイルをFileShareに格納するためにStorageアカウントを作ります。

resource "azurerm_storage_account" "main" {
  name                     = "st${var.prefix}${random_string.name.result}"
  resource_group_name      = azurerm_resource_group.main.name
  location                 = azurerm_resource_group.main.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

resource "azurerm_storage_share" "main" {
  name                 = var.fileshare_name
  storage_account_name = azurerm_storage_account.main.name
  quota                = 5
}

あとはAzure Container Instanceを作成するようにします。

data "terraform_remote_state" "backend" {
  backend = "local"

  config = {
    path = "../99_tfstate/terraform.tfstate"
  }
}

data "azurerm_resource_group" "main" {
  name = data.terraform_remote_state.backend.outputs.resource_group_name
}

data "azurerm_postgresql_flexible_server" "main" {
  name                = data.terraform_remote_state.backend.outputs.postgres_server_name
  resource_group_name = data.azurerm_resource_group.main.name
}

data "azurerm_storage_account" "main" {
  name                = data.terraform_remote_state.backend.outputs.storage_account_name
  resource_group_name = data.azurerm_resource_group.main.name
}

resource "azurerm_container_group" "main" {
  name                = "aci-${var.prefix}-name"
  location            = data.azurerm_resource_group.main.location
  resource_group_name = data.azurerm_resource_group.main.name
  ip_address_type     = "None"
  os_type             = "Linux"
  restart_policy      = "Never"

  container {
    name     = "postgres"
    image    = "postgres:13"
    cpu      = "0.5"
    memory   = "1.0"
    commands = ["pg_dump", "-f", "/aci/backups/pgdump.bin"]
    secure_environment_variables = {
      PGHOST     = data.azurerm_postgresql_flexible_server.main.fqdn
      PGDATABASE = var.postgresql_database
      PGUSER     = data.azurerm_postgresql_flexible_server.main.administrator_login
      PGPASSWORD = data.terraform_remote_state.backend.outputs.postgres_password
    }

    volume {
      name       = "backups"
      mount_path = "/aci/backups"
      read_only  = false
      share_name = var.fileshare_name

      storage_account_name = data.azurerm_storage_account.main.name
      storage_account_key  = data.azurerm_storage_account.main.primary_access_key
    }
  }
}

Terraformのremote_stateってものを使うと、Outputで出力したものを読み込んで使えるようです。今回はランダムに設定したPostgreSQLのデータベース名とかパスワードなどをremote_stateの機能を使って取得するようにしました。

www.terraform.io

Azure Container InstanceはFile Shareをマウントすることができます。今回はpg_dumpコマンドで出力した結果をFile Shareに出力するようにします。コマンドオプションを見ると、-fオプションを指定するとよさそうなので、設定します。

www.postgresql.jp

commandsの部分を["pg_dump", "-f", "/aci/backups/pgdump.bin"]としておくとよさそうです。

実行

Terraformで実行してみると、きちんと動いてくれました。

File Shareにバックアップも格納されていました。

Terraformの全体像

以下に格納しました。

github.com