待望にしていたAzure Functions(Python)の従量課金プランの東日本リージョン対応ですが
どうせまだ使えないよなーとか思いつつAzureのポータル上から確認してみると、いつの間にか選択できるようになっていました🎉
個人的にもそろそろAzure FunctionsをTerraformでコード化しておきたいという思いがあったので、今回Terraformを使ってプロビジョニングしてみました。
環境
- Terraform v0.12.26
- Terraform Azureプロバイダー v2.30.0
tfファイルの作成
Azure Functions(Function App)の作成に伴い以下のリソースも一緒に作成していきます。
- リソースグループ
- ストレージアカウント
- App Service Plan(従量課金プラン)
- Application Insights
Azureプロバイダーの設定
プロバイダーのバージョンは現時点での最新版であるv2.30.0を使用します。
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のポータル上から確認すると
きちんとリソースが作成できているのを確認できます。
東日本リージョンでAzure Functions(Python)を従量課金プランで使えるようになりました🎉
Azureプロバイダのバージョンによっては上手くいかない
App Service Planを構成する際、Terraformのドキュメントにもある通り従量課金プランのAzure Functionsの場合kind
をFaunctionApp
、reserved
をtrue
に指定する必要があります。
kind
- 作成するApp Service Planの種類(Windows / Linux / elastic / FunctionApp)reserved
- コンピューティングリソースがLinuxであるかWindowsであるかを制御するフィールド。Linuxであればtrue
、それ以外(Windows)であればfalse
を指定。(デフォルトではfalse
)
しかし、Azureのプロバイダのバージョンがv2.20.0以下だとkind
がLinux
以外だとreserved
をtrue
に指定した場合、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で解決されており
v2.21.0でこちらの修正が取り込まれているので、それ以上のバージョンだと問題なくリソースを作成することができました。