Azure Functions(Python)従量課金プランがいつのまにか東日本リージョンに対応してたので、Terraformでプロビジョニングしてみる

待望にしていたAzure Functions(Python)の従量課金プランの東日本リージョン対応ですが

qiita.com

どうせまだ使えないよなーとか思いつつAzureのポータル上から確認してみると、いつの間にか選択できるようになっていました🎉

f:id:rnakamine:20201005212331p:plain

f:id:rnakamine:20201005212446p:plain

個人的にもそろそろAzure FunctionsをTerraformでコード化しておきたいという思いがあったので、今回Terraformを使ってプロビジョニングしてみました。

www.terraform.io

環境

  • Terraform v0.12.26
  • Terraform Azureプロバイダー v2.30.0

tfファイルの作成

Azure Functions(Function App)の作成に伴い以下のリソースも一緒に作成していきます。

  • リソースグループ
  • ストレージアカウント
  • App Service Plan(従量課金プラン)
  • Application Insights

Azureプロバイダーの設定

プロバイダーのバージョンは現時点での最新版であるv2.30.0を使用します。

github.com

provider "azurerm" {
  version = "=2.30.0"
  features {}
}

最後の方でも記載しますが、Azureプロバイダのバージョンが古いとterraform apply時に失敗するので注意が必要です。

リソースグループの作成

リージョンは東日本を指定します。

resource "azurerm_resource_group" "sample" {
  name     = "sample-rg"
  location = "japaneast"
}

ストレージアカウントの作成

Azure Functionsではトリガーの管理や関数実行のログ記録などの操作にAzure Storageが必要なため、ストレージアカウントも一緒に作成していきます。

resource "azurerm_storage_account" "sample" {
  name                     = "samplestoragernakamine"
  resource_group_name      = azurerm_resource_group.sample.name
  location                 = azurerm_resource_group.sample.location
  account_tier             = "standard"
  account_replication_type = "LRS"
}

Azure Functionsで使用する場合、Blob専用ストレージ、Azure Premium Storage、ZRSレプリケーション(ゾーン冗長ストレージ)を使用するストレージはサポートされないようです。

Application Insightsの作成

resource "azurerm_application_insights" "sample" {
  name                = "sample-application-insights-rnakamine"
  location            = azurerm_resource_group.sample.location
  resource_group_name = azurerm_resource_group.sample.name
  application_type    = "web"
}

Azure Functionsの作成

resource "azurerm_app_service_plan" "sample" {
  name                = "sample-app-service-plan"
  location            = azurerm_resource_group.sample.location
  resource_group_name = azurerm_resource_group.sample.name
  kind                = "FunctionApp"
  reserved            = true

  sku {
    size = "Y1"
    tier = "Dynamic"
  }
}

resource "azurerm_function_app" "sample" {
  name                       = "sample-function-app-rnakamine"
  location                   = azurerm_resource_group.sample.location
  resource_group_name        = azurerm_resource_group.sample.name
  app_service_plan_id        = azurerm_app_service_plan.sample.id
  storage_account_name       = azurerm_storage_account.sample.name
  storage_account_access_key = azurerm_storage_account.sample.primary_access_key
  os_type                    = "linux"
  version                    = "~3"
  enable_builtin_logging     = false

  app_settings = {
    FUNCTIONS_WORKER_RUNTIME       = "python"
    APPINSIGHTS_INSTRUMENTATIONKEY = azurerm_application_insights.sample.instrumentation_key
    AzureWebJobsStorage            = azurerm_storage_account.sample.primary_connection_string
  }
}

リソースの作成

terraform initコマンドで初期化を行って、terraform plan/ terraform applyを行いリソースを作成します。

Azureのポータル上から確認すると

f:id:rnakamine:20201007185946p:plain

きちんとリソースが作成できているのを確認できます。

東日本リージョンでAzure Functions(Python)を従量課金プランで使えるようになりました🎉

Azureプロバイダのバージョンによっては上手くいかない

App Service Planを構成する際、Terraformのドキュメントにもある通り従量課金プランのAzure Functionsの場合kindFaunctionAppreservedtrueに指定する必要があります。

  • kind - 作成するApp Service Planの種類(Windows / Linux / elastic / FunctionApp)
  • reserved - コンピューティングリソースがLinuxであるかWindowsであるかを制御するフィールド。Linuxであればtrue、それ以外(Windows)であればfalseを指定。(デフォルトではfalse

しかし、Azureのプロバイダのバージョンがv2.20.0以下だとkindLinux以外だとreservedtrueに指定した場合、terraform apply時にエラーが起きます。

Error: `reserved` has to be set to false when kind isn't set to `Linux`

  on function.tf line 8, in resource "azurerm_app_service_plan" "sample":
   8: resource "azurerm_app_service_plan" "sample" {

この問題は以下のisuueで解決されており

github.com

v2.21.0でこちらの修正が取り込まれているので、それ以上のバージョンだと問題なくリソースを作成することができました。