先日試しに動かしてみたAzure Container Instanceでpg_dumpを実行してみることの続きをやってみました。
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_rule
をazurerm_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の機能を使って取得するようにしました。
Azure Container InstanceはFile Shareをマウントすることができます。今回はpg_dumpコマンドで出力した結果をFile Shareに出力するようにします。コマンドオプションを見ると、-f
オプションを指定するとよさそうなので、設定します。
commands
の部分を["pg_dump", "-f", "/aci/backups/pgdump.bin"]
としておくとよさそうです。
実行
Terraformで実行してみると、きちんと動いてくれました。
File Shareにバックアップも格納されていました。
Terraformの全体像
以下に格納しました。