APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Terraform AzureRM プロバイダ アップデート情報 (v3.91.0)

ACS 事業部の埜下です。

2024年2月9日 に Terraform の AzureRM プロバイダ v3.91.0 がリリースされました。

今回は Fleet Manager と Chaos Studio に追加リソースがあり、それぞれ一通りのリソースが出揃った感じがあります。 また、AKS 用バックアップポリシーのリソースも追加されてます。

github.com

Azure サービス リソース、データソース
Azure Kubernetes Fleet Manager azurerm_kubernetes_fleet_member
Azure Backup azurerm_data_protection_backup_policy_kubernetes_cluster
Azure Chaos Studio azurerm_chaos_studio_experiment
azurerm_chaos_studio_capability
Azure Deployment Environments azurerm_dev_center_gallery
Azure IoT Central azurerm_iotcentral_organization
Azure Spring Apps azurerm_spring_cloud_app_dynamics_application_performance_monitoring
Azure Databricks azurerm_databricks_access_connector データソース


AzureRM プロバイダのアップデート内容は 3 つのカテゴリに分かれてリリースページにて報告されていますが、FEATURES の内容を拾いつつ、影響の大きそうな ENHANCEMENTSBUG FIXES があれば確認します。

カテゴリ 内容
FEATURES 新しいリソース、データソースの追加
プロバイダ自体の機能追加
ENHANCEMENTS 既存リソース、データソースのプロパティ変更
利用している SDK (hashicorp/go-azure-sdk) などバージョンアップ対応
BUG FIXES バグ修正


Azure Kubernetes Fleet Manager

azurerm_kubernetes_fleet_member

ドキュメント:azurerm_kubernetes_fleet_member

Azure Kubernetes Fleet Manager のフリートメンバーの AKS クラスタを管理する azurerm_kubernetes_fleet_member リソースが追加されました。

learn.microsoft.com

このリソースと v3.90.0 で追加された azurerm_kubernetes_fleet_update_strategy リソースと組み合わせることで、Azure Kubernetes Fleet Manager の更新戦略を Terraform で管理できるようになります。

resource "azurerm_kubernetes_fleet_manager" "example" {
  name                = "example"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_kubernetes_fleet_update_strategy" "example" {
  name                        = "example"
  kubernetes_fleet_manager_id = azurerm_kubernetes_fleet_manager.example.id
  stage {
    name = "example-stage-1"
    group {
      name = "example-group-1"
    }
    after_stage_wait_in_seconds = 21
  }
}

resource "azurerm_kubernetes_fleet_member" "example" {
  kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
  kubernetes_fleet_id   = azurerm_kubernetes_fleet_manager.example.id
  name                  = "example"
  group                 = "example-group-1"
}


Azure Backup

azurerm_data_protection_backup_policy_kubernetes_cluster

ドキュメント:azurerm_data_protection_backup_policy_kubernetes_cluster

Azure Backup を使用した Azure Kubernetes Service (AKS) のバックアップポリシーを Terraform で構成できるようになりました。

AKS のバックアップ拡張機能有効化も azurerm_kubernetes_cluster_extension リソースで可能ですが、AKS のバックアップ構成に対応したリソースはまだ無いため、Terraform を使って AKS のバックアップを構成するには AzAPI プロバイダも使う必要があります。

learn.microsoft.com

AKS バックアップ全体の流れはこちらの方の記事が分かりやすかったです。

zenn.dev

以下は、今回リリースされた azurerm_data_protection_backup_policy_kubernetes_cluster リソースを含めた Terraform による AKS のバックアップ構成例です。

resource "azurerm_kubernetes_cluster_extension" "example" {
  name           = "backup"
  cluster_id     = azurerm_kubernetes_cluster.example.id
  extension_type = "microsoft.dataprotection.kubernetes"
  release_train  = "stable"

  configuration_settings = {
    "credentials.tenantId"                                      = data.azurerm_client_config.example.tenant_id
    "configuration.backupStorageLocation.config.subscriptionId" = data.azurerm_client_config.example.subscription_id
    "configuration.backupStorageLocation.config.resourceGroup"  = azurerm_storage_account.example.resource_group_name
    "configuration.backupStorageLocation.config.storageAccount" = azurerm_storage_account.example.name
    "configuration.backupStorageLocation.bucket"                = azurerm_storage_container.example.name
  }
}

resource "azurerm_data_protection_backup_vault" "example" {
  name                = "example-backup-vault"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  datastore_type      = "VaultStore"
  redundancy          = "LocallyRedundant"
}

resource "azurerm_data_protection_backup_policy_kubernetes_cluster" "example" {
  name                = "example-backup-policy"
  resource_group_name = azurerm_resource_group.example.name
  vault_name          = azurerm_data_protection_backup_vault.example.name

  backup_repeating_time_intervals = ["R/2021-05-23T02:30:00+00:00/P1W"]
  time_zone                       = "Tokyo Standard Time"

  default_retention_rule {
    life_cycle {
      duration        = "P7D"
      data_store_type = "OperationalStore"
    }
  }
}

resource "azapi_resource" "backup_configuration" {
  name                      = "cluster-configuration"
  parent_id                 = azurerm_data_protection_backup_vault.example.id
  type                      = "Microsoft.DataProtection/backupVaults/backupInstances@2023-08-01-preview"
  schema_validation_enabled = false # to prevent invalid preview API version errors

  body = templatefile("${path.module}/azapi-resources/backup-configuration.json", {
    name                            = "cluster-configuration"
    backup_policy_id                = azapi_resource.backup_policy.id
    cluster_name                    = azurerm_kubernetes_cluster.example.name
    cluster_id                      = azurerm_kubernetes_cluster.example.id
    cluster_location                = azurerm_kubernetes_cluster.example.location
    disk_snapshot_resource_group_id = azurerm_kubernetes_cluster.example.node_resource_group_id
  })
}


backup-configuration.json

{
    "properties": {
        "policyRules": [
            {
                "lifecycles": [
                    {
                        "deleteAfter": {
                            "objectType": "AbsoluteDeleteOption",
                            "duration": "P4W"
                        },
                        "targetDataStoreCopySettings": [],
                        "sourceDataStore": {
                            "dataStoreType": "OperationalStore",
                            "objectType": "DataStoreInfoBase"
                        }
                    }
                ],
                "isDefault": false,
                "name": "Weekly",
                "objectType": "AzureRetentionRule"
            },
            {
                "lifecycles": [
                    {
                        "deleteAfter": {
                            "objectType": "AbsoluteDeleteOption",
                            "duration": "P7D"
                        },
                        "targetDataStoreCopySettings": [],
                        "sourceDataStore": {
                            "dataStoreType": "OperationalStore",
                            "objectType": "DataStoreInfoBase"
                        }
                    }
                ],
                "isDefault": true,
                "name": "Default",
                "objectType": "AzureRetentionRule"
            },
            {
                "backupParameters": {
                    "backupType": "Incremental",
                    "objectType": "AzureBackupParams"
                },
                "trigger": {
                    "schedule": {
                        "repeatingTimeIntervals": [
                            "R/2023-11-17T13:47:10+00:00/PT4H"
                        ],
                        "timeZone": "UTC"
                    },
                    "taggingCriteria": [
                        {
                            "tagInfo": {
                                "tagName": "Weekly",
                                "id": "Weekly_"
                            },
                            "taggingPriority": 20,
                            "isDefault": false,
                            "criteria": [
                                {
                                    "absoluteCriteria": [
                                        "FirstOfWeek"
                                    ],
                                    "objectType": "ScheduleBasedBackupCriteria"
                                }
                            ]
                        },
                        {
                            "tagInfo": {
                                "tagName": "Default",
                                "id": "Default_"
                            },
                            "taggingPriority": 99,
                            "isDefault": true
                        }
                    ],
                    "objectType": "ScheduleBasedTriggerContext"
                },
                "dataStore": {
                    "dataStoreType": "OperationalStore",
                    "objectType": "DataStoreInfoBase"
                },
                "name": "BackupHourly",
                "objectType": "AzureBackupRule"
            }
        ],
        "datasourceTypes": [
            "Microsoft.ContainerService/managedClusters"
        ],
        "objectType": "BackupPolicy"
    }
}

AzAPI リソースの参照元はこちら。

Azure backup for AKS with Terraform · GitHub


Azure Chaos Studio

azurerm_chaos_studio_experiment, azurerm_chaos_studio_capability

ドキュメント:azurerm_chaos_studio_experiment, azurerm_chaos_studio_capability

v3.89.0 では Azure Chaos Studio のターゲットを作成する azurerm_chaos_studio_target リソースが追加されましたが、「カオス実験 (Chaos experiments)」という Azure リソースに対応した AzureRMプロバイダのリソースはありませんでした。

techblog.ap-com.co.jp

今回のリリースで「カオス実験 (Chaos experiments)」に対応した azurerm_chaos_studio_experiment リソース、「機能 (Capability)」に対応した azurerm_chaos_studio_capability リソースが追加され、Azure Chaos Studio の一通りの設定を Terraform で構成できるようになりました。

「機能」はターゲットのリソースが持っている拡張リソースで、どんな機能が使えるかは以下の障害ライブラリ(なんと恐ろしいライブラリ…)から確認できます。

learn.microsoft.com

次のコードは Linux VM に対してシャットダウン (Shutdown-1.0) を引き起こす実験の構成です。

resource "azurerm_chaos_studio_target" "example" {
  location           = azurerm_resource_group.example.location
  target_resource_id = azurerm_linux_virtual_machine.example.id
  target_type        = "Microsoft-VirtualMachine"
}

resource "azurerm_chaos_studio_capability" "example" {
  chaos_studio_target_id = azurerm_chaos_studio_target.example.id
  capability_type        = "Shutdown-1.0"
}

resource "azurerm_chaos_studio_experiment" "example" {
  location            = azurerm_resource_group.example.location
  name                = "example"
  resource_group_name = azurerm_resource_group.example.name

  identity {
    type = "SystemAssigned"
  }

  selectors {
    name                    = "Selector1"
    chaos_studio_target_ids = [azurerm_chaos_studio_target.example.id]
  }

  steps {
    name = "example"
    branch {
      name = "example"
      actions {
        urn           = azurerm_chaos_studio_capability.example.urn
        selector_name = "Selector1"
        parameters = {
          abruptShutdown = "false"
        }
        action_type = "continuous"
        duration    = "PT10M"
      }
    }
  }
}


Azure Deployment Environments

ドキュメント:azurerm_dev_center_gallery

Azure Deployment Environments の「デベロッパー センター (Dev center)」では Azure Compute Gallery という Azure VM のイメージを公開するサービと連携できます(ただし、今は公式のドキュメントは無さそう)。

Azure Compute Gallery は azurerm_shared_image_gallery というリソースで構成され、デベロッパー センターと Azure Compute Gallery を紐付ける役割をするのが今回リリースされた azurerm_dev_center_gallery リソースです。

resource "azurerm_dev_center" "test" {
  name                = "example-devcenter"
  resource_group_name = azurerm_resource_group.test.name
  location            = azurerm_resource_group.test.location

}

resource "azurerm_shared_image_gallery" "example" {
  name                = "example-image-gallery"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_dev_center_gallery" "example" {
  dev_center_id     = azurerm_dev_center.example.id
  shared_gallery_id = azurerm_shared_image_gallery.example.id
  name              = "example"
}


Azure IoT Central

azurerm_iotcentral_organization

ドキュメント:azurerm_iotcentral_organization

Azure IoT Central という IoT ソリューションの開発、管理するための PaaS があり、「どのユーザーがどのデバイスを表示できるか」を管理するための「組織」という機能があります。

引用:https://learn.microsoft.com/ja-jp/azure/iot-central/core/howto-create-organizations

上図のように組織は階層化されていて、今回追加された azurerm_iotcentral_organization リソースも parent_organization_id というパラメータで別のリソースを親として参照して構成できます。

resource "azurerm_iotcentral_application" "example" {
  name                = "example-iotcentral-app"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  sub_domain          = "example-iotcentral-app-subdomain"
  display_name        = "example-iotcentral-app-display-name"
  sku                 = "ST1"
  template            = "iotc-default@1.0.0"
  tags = {
    Foo = "Bar"
  }
}

resource "azurerm_iotcentral_organization" "example_parent" {
  iotcentral_application_id = azurerm_iotcentral_application.example.id
  organization_id           = "example-parent-organization-id"
  display_name              = "Org example parent"
}

resource "azurerm_iotcentral_organization" "example" {
  iotcentral_application_id = azurerm_iotcentral_application.example.id
  organization_id           = "example-child-organization-id"
  display_name              = "Org example"
  parent_organization_id    = azurerm_iotcentral_organization.example_parent.organization_id
}


Azure Spring Apps

azurerm_spring_cloud_app_dynamics_application_performance_monitoring

ドキュメント:azurerm_spring_cloud_app_dynamics_application_performance_monitoring

最近頻繁に機能追加されている Spring Apps 監視用リソースです。 今回は AppDynamics と連携するためのリソースが追加されました。

learn.microsoft.com

docs.appdynamics.com

resource "azurerm_spring_cloud_app_dynamics_application_performance_monitoring" "example" {
  name                     = "example"
  spring_cloud_service_id  = azurerm_spring_cloud_service.example.id
  agent_account_name       = "example-agent-account-name"
  agent_account_access_key = "example-agent-account-access-key"
  controller_host_name     = "example-controller-host-name"
  agent_application_name   = "example-agent-application-name"
  agent_tier_name          = "example-agent-tier-name"
  agent_node_name          = "example-agent-node-name"
  agent_unique_host_id     = "example-agent-unique-host-id"
  controller_ssl_enabled   = true
  controller_port          = 8080
  globally_enabled         = true
}


Azure Databricks

azurerm_databricks_access_connector データソース

ドキュメント:azurerm_databricks_access_connector

Azure Databricks でストレージにアクセスするときに使われるマネージド ID を参照するデータソースが追加されました。

Databricks のドキュメントでは Databricks Providerdatabricks_storage_credential リソースで azurerm_databricks_access_connector リソースの情報を参照していました。

www.databricks.com

今回のデータソース追加により、Terraform 管理外の Databricks アクセス コネクタ用のマネージド ID を参照して使えるようになったようです。

data "azurerm_databricks_access_connector" "example" {
  name                = "example"
  resource_group_name = "example"
}

resource "databricks_storage_credential" "example" {
  name = "team_X_credential"
  azure_managed_identity {
    access_connector_id = data.azurerm_databricks_access_connector.example.id
  }
  comment = "Managed by TF"
  owner   = databricks_group.team_X_admins.display_name
}

今回はアップデート情報は以上です。

【PR】
私達 ACS 事業部は Azure・AKS などのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

一緒に働いていただける仲間も募集中です!
まだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
我々の事業部の CultureDeck はコチラ。

www.ap-com.co.jp

本記事の投稿者: 埜下 太一
Azure をメインにインフラ系のご支援を担当しています。
Vault 試験に向けて勉強中です。
個人ブログ