Terraform v1.9.0で追加されたtemplatestringを試してみる

概要

6/26 にTerraform ver1.9.0がリリースされました。 https://github.com/hashicorp/terraform/releases

新機能:

  • Input variable validation rules can refer to other objects
  • templatestring function
    • templatefile functionと似てますが、templatefileはtemplatefile(path, vars)のように、テンプレート文字列をfileとして渡すことができるのに対し、templatestringはtemplatestring(ref, vars)であり、モジュール内の別の場所で定義されたオブジェクトを参照し、引数を付けてレンダリングすることができます。

本記事ではtemplatestringについて記載します。

templatestringを試す

の前に、templatefileを見てみます。

テンプレートファイルを用意します。

backends.tftpl

%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

templatefileで上記のテンプレートファイルに引数を渡します。

% terraform console
> templatefile("${path.module}/backends.tftpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
<<EOT
backend 10.0.0.1:8080
backend 10.0.0.2:8080

EOT
> 

一方、templatestringは前述の通り、モジュール内の別オブジェクトのテンプレート文字列を参照します。

あらかじめ、s3に以下のファイルを格納します。

testtffile

"Hello, ${name}!"

main.tf

data "aws_s3_object" "example" {
  bucket = "test-tf-190"
  key    = "testtffile"
}

output "example" {
  value = templatestring(data.aws_s3_object.example.body, {
    name = var.name
  })
}

variable "name" {
  type        = string
  description = "The name of the example"

  default = "terraform version 1.9.0"
}

terraform planするとaws_s3_object.example.body(=testtffileの内容のテンプレート文字列)にvar.nameが入ることが分かります。

% terraform plan   
data.aws_s3_object.example: Reading...
data.aws_s3_object.example: Read complete after 0s [id=test-tf-190/testtffile]

Changes to Outputs:
  + example = "\"Hello, terraform version 1.9.0!\""

まとめ

オブジェクトの内容に変数を入れて、テンプレート文字列として扱うことができるようになりました。
また、場合によってはアップデートで追加された2つの機能を一緒に使うこともありそう?
templatestring で使うvariableにvalidationを掛けて、validationには他の変数を使う、というパターン。

Azure Functions Flex Consumption planを使ってみる

Azure Functions の Flex Consumption planでは、Consumption planに比べて以下の追加機能が利用できるようになっています。

  • Always-ready instances
  • Virtual network integration
  • Fast scaling based on concurrency for both HTTP and non-HTTP apps
  • Multiple choices, for instance, memory size

Flex consumption planは2024/6下旬現在、Preview状態となっています。 実際に作ってみながら確認したいと思います。

Flex Consumptionを選択します。

Instance sizeがFlex consumption planだと追加されています。

以下はConsumption planです。

Network Injection という表記も確認できます。 こちらを有効にするとvNet統合を有効にできそうです。

 

Enable network injectionをOnにすると、以下のようにvNetの設定が出てきます。

後の項目はそのままで、これで作成してみます。

作成後、Overviewを見てみるとPlan TypeがFlex consumptionになっていることが確認できます。

Networkの項目も追加されていることが確認できました。

Vnet統合をしてみます。

vNet統合をしてみたところ、エラーが発生。

2,3回試してもエラーが発生。

Azure Function Flex consumption plan vnet errorでググったところ、以下を発見。

https://learn.microsoft.com/en-us/answers/questions/1692029/error-when-assigning-virtual-network-to-the-azure

どうやらFlex consumption planでは以下の注意があるみたいです。

  • The subnet you choose can't already be used for other purposes, such as with private endpoints or service endpoints, or be delegated to any other hosting plan or service.

ところが私の環境では上記に該当せず。 同じ問題を抱えている方が数人いそうでした。

Always readyについては、費用面が気になったのですが、ondemandだと無料枠があるのに比べ、always readyだと無料枠は付与されないみたいです。 また、ものすごくざっくりいうと常時起動しているので起動している分の時間の課金はされるようでした。(詳細は以下の公式文書をご確認ください。)

Azure Functions Flex Consumption plan hosting

Azure Functionsのはじめかた

Azure FunctionsはAzureが提供しているFaaSです。 基本的にはApp ServiceというPaaSのサービス上で動き、App Serviceのプランをどれを選ぶかによっても提供される機能が異なります。 コンピューティング性能だけでなく、vNetなどの機能の有無の差異もあります。
(一応AKS上でも実行できるみたいですが、自分は試してみたことはありません。時間があったら試してみたいです。)

作成するだけならめっちゃ簡単ですが、自分の理解を整理するためにも書き起こします。

まずはサクッとAzure Funtionsを作ってみましょう。

Portalからログイン後、

functionsと検索し、Azure Functionsを選びます。

関数アプリの作成をクリックし、プランを選びます。 Flex consumptionは最近プレビューになった機能ですが、Azure Funtionsで多くの方が悩んだであろう?従量課金プランにおけるvNet周りの問題等を解決してくれました。 この辺りの詳細はまた記事にしたいと思います。

ここでは従量課金である、consumption planを選びます。

Select→ Basicsではお好きなResource Groupに作成していただき、名前も好きな名前をつけてください。

  • Runtime stack: NodeJS
  • Version: 20LTS
  • Region: Japan East
  • Operating System: Linux

残りのタグはそのままで、Createしてください。
※ちなみに、後でportalから簡単にwebアプリを作成するのですが、portalからの作成は、以前はwindowsのfunctionsでしかできませんでしたが、Linuxでもできるようになりました。

作成できたら、Azure Functions のリソースに移動し、overviewの下あたりにある、Create in Azure portalのCreate Functionを選びます。

テンプレートはHTTP Triggerを選んでください。 Template Detailはそのままで大丈夫です。 Createを選びます。

そしたらHTTP triggerのコードが表示されている画面に飛びます。 Azure FunctionsはFaaSに当たるサービスですが、トリガーはHTTP以外にも、タイマーやblob、キュー、cosmos dbなどを指定できます。
Azure Functions のトリガーとバインド ポータル上からトリガーをテストすることもできます。 上記画面の、Test/Runをクリックしてください。

Test/RunはそのままでRunします。

http requestがAzure FunctionsのAPI endpointへ投げられます。 200 OKが返され、テストに成功したことが確認できたと思います。

非常に簡単にデプロイまでできたことが分かったかと思います。

また、Azure Functionsを作成したRGを覗いてみましょう。 Function App(Azure Funtions)以外にも、App Service Plan,Storage Account,Smart detector alert rule, Application Insightsも作成されていることが確認できるかと思います。

App Service planはFunctionsを実行するための基盤というイメージで良いかと思います。 (Azure FunctionsやApp serviceを使う場合は、どのApp service planを使うか、まで考える必要があると思います。)

Storage AccountはFuntion AppのSettings→Environment variablesにAzureWebJobsStorageという環境変数に紐づいています。 Valueを確認いただくと、このStorage Accountの接続文字列があることが確認できると思います。

※Azure Funtionsではユーザで定義する環境変数と、Azure側で自動的に作成され、利用される変数がこのEnvironment Variableの1箇所に集まってます。 ユーザ側でつけた覚えがない変数がある場合は、Azure Funtionsのドキュメントを確認するのがいいと思います。 https://learn.microsoft.com/en-us/azure/app-service/reference-app-settings?source=recommendations&tabs=kudu%2Cdotnet

Failure Anomaliesは失敗時の検知、通知を担う機能になっています。

Application InsightsはFunctionsに限らず、AzureのAPM(Application Performance Management)のサービスです。 Functionsでは非常に簡単にApplication Insights と統合できます。コードレイヤーでApp  Insightsの実装を意識する必要は基本ありません。 Live Metrics,Transaction Search等、強力なトレーシング機能が備わっており、マイクロサービスの連携や、いわゆるオブザーバビリティの向上に不可欠です。

ここまででリソースの確認も終わったのでAzure Functions + 関連するリソースを削除します。

Azure利用に関連するライセンスまとめ

はじめに

マイクロソフトのライセンス形態(EAとか…)とかEntra ID(M365ライセンスに含まれているものとか…)のライセンスがよく分かっていないので一回整理しておきたいと思ったので備忘的に残します。

マイクロソフトライセンス契約

まず最初に、マイクロソフトライセンス契約なるものをおさえます。
これはマイクロソフトの製品(プログラム?)全般のライセンスの購入方法だと思われます

マイクロソフト コマーシャルライセンス 早わかりガイド

より、マイクロソフトプログラム(M365,Azure,etc….) 対 ライセンス種類の図があります。

Azureのライセンスは前払い/従量課金、等の支払い方法によって対応するライセンスプログラムが異なるようです。(上の図のライセンスが下の図に全て記載されてはいないようですが、参考として確認できると思います。)

様々なライセンスの購入方法があることが見受けられると思います。

また、Azureの場合、3つの製品グループに分けて提供されているようです。

  • Azureサービス
    • 従量課金 or 前払い方式
      • VM
      • Storage
      • CDN等、一般的なAzureリソース
  • Azureプラン
    • 1年間の料金を前払い
      • Entra ID
      • Operations Management Suite等
  • Azureマーケットプレース
    • 従量課金制
      • SendGrid,OracleDB,等のサードパーティ

また、以下の記事も参考になると思います。
Azureのライセンス形態・契約パターン(MOSP・CSP・EA…MPA・MCAって?)

また、Entra IDライセンス(Azureの利用できる機能に関わる)はM365ライセンスに内包されているものもあります。(個別でEntra IDライセンスを購入することもできるようです。)
詳細は以下に記載します。

Entra IDのライセンス

Azureのサービスは利用にあたって特定のEntra IDのライセンスが必要になるものがあります。
e.g. Privileged Identity Management (PIM) を利用するにはEntra ID P2ライセンスが必要

そして、Entra ID ライセンス別の機能は以下に記載されております。
Microsoft Entra ID ガバナンス ライセンスの基礎 - Microsoft Entra ID Governance

Entra IDのライセンスの種類は以下です。
Microsoft Entra のプランと価格 | Microsoft Securityにも記載されています。

  • 無料
    • Microsoft Azure、Microsoft 365 などの Microsoft クラウド サブスクリプションに含まれています。個人で利用する場合はこちらを利用することが多いかと思います。
  • Microsoft Entra ID P1
    • 単体で購入するか、Microsoft 365 E3 、 Microsoft 365 Business Premium に含まれています。
  • Microsoft Entra ID P2
    • 単体で購入するか、Microsoft 365 E5 に含まれています。
  • Microsoft Entra ID Governance
    • Microsoft Entra ID P1 と P2購入者用のオプション機能のようです。
    • 追加で購入可能なオプションのようです。
    • ID ガバナンス機能
    • Entra ID P2を利用者は特別価格が適用される

Microsoft Entra ID Governance にも

  • Microsoft Entra ID Governance
  • Microsoft Entra ID Governance P2
  • Microsoft Entra ID Governance F2 があるようでした。

まとめ

調べた所感です。

  • マイクロソフトライセンス: 支払いの形態が異なる
  • Entra IDライセンス: Azureで管理系の特定の機能(PIM,etc…)が使えるかはEntra IDライセンスの方を気を付ける

とはいえ結局マイクロソフトライセンスが異なれば何が違うのか?(例えばボリュームライセンス?)とかは分からずじまいなのでまた時間ができた時に調べようと思います。