本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「実用性重視!AzureのマネージドID活用のサンプルコード(インフラコード)」を再編集したものです。
下記のサンプル実装のインフラコード部分を解説します。
https://github.com/hirokimatsueda/azure-managed-id-sample
インフラ構成詳細
概要記事で「シンプル」と表現しましたが、構築されるリソースを明記すると若干インパクトがあるかもしれません。しかしかなり最低限だと思いますのでどうかお付き合いを…。
本質的に必要なのは、中央のFunctionsとCosmos DBです。
Cosmos DBの中にはデータベースやコンテナーの概念があるので、これらもインフラ構築時に作成してしまいます。
Azureのリソースは「診断設定」を設定するとリソースの状態が観測できるので、FunctionsとCosmos DBに対して設定しておきます。診断ログの保管先としてLog Analyticsを指定しています。
Functionsのアプリの状態の観測のため、Application Insightsと接続しています。
Functionsではシステム割り当てマネージドIDを有効にして、Cosmos DBの権限設定でこのマネージドIDが Cosmos DB内のデータを操作することを許可します。
terraformを用いた構築
コードはこちら:https://github.com/hirokimatsueda/azure-managed-id-sample/tree/main/infrastructure/terraform
Azureのインフラ構築にはterraformを利用しています。
terraformについての説明は割愛させていただき、どのような方針で実装しているかを記載します。
moduleへの処理の分割
terraformは、カレントディレクトリ配下(サブディレクトリを除く)のtfファイルをすべて確認してインフラ構築をしてくれますが、リソース数が多い場合はコードの見通しが悪くなりがちです。
この時、modulesという概念を使用すると処理の詳細を別フォルダに整理できるので見通しが良くなります。
マネージドIDへの権限付与
下記の実装で権限付与を行なっています。
azurerm_cosmosdb_sql_role_definitionを使用し、Cosmos DBのデータへのアクセス権限を定義します。
これはアクセス権限の定義であり、割り当てではないです。
割り当てにはazurerm_cosmosdb_sql_role_assignmentを使用しています。
サンプルコードでは2回登場しますが、userと名付けた方はterraformを実行した人への権限付与、data_contributorと名付けた方はFunctionsへの権限不要になります。
なぜterraformを実行した人にも権限を付与しているかというと、ローカルPCでアプリの動作確認をする際に必要になるからです。
data_contributorと名付けた方はdepends_onの記載がありますが、これはazurerm_cosmosdb_sql_role_assignmentを複数並列で動かすとエラーになるためです。
まとめ
terraformを用いてマネージドIDでCosmos DBにアクセスする際のポイントを解説しました。
これさえあればインフラ構築は怖くないですね。
解説していない部分にもいろいろと小技を仕込んであるので、コード量の多さに負けずに一度見てもらえると嬉しいです。
松枝宏樹/FIXER
愛知県在住、リモートワーク気味なエンジニア。
得意分野はC#、ASP.NET、terraform、AKSなど。