Azure Functions で アカウント名にハイフンが含まれる Azure Cosmos DB アカウントを入力バインディングに設定しようとするとエラーになる

AZ-204 の学習をしていて MS-Learn で詰まったので備忘録として投稿します。
# 現象
関数アプリの統合メニューから、ハイフンを含む Azure Cosmos DB アカウントに対して接続を新規に作成しようとするとエラーになって登録できない。
# 対応方法
Azure portal から関数アプリのアプリケーション設定に Azure Cosmos DB アカウントとの接続(接続文字列)を登録する場合、使用する Azure Cosmos DB アカウント名にはハイフンを含めないようにする。<br>
または、カスタム設定でアプリケーション設定に許容される設定を作成する。
## アカウント名を変更できない場合の対応方法
様々な事情があってアカウント名を変更できないかもしれないですね。
その場合は、関数アプリのアプリケーション設定の名称を変更すればよいです。
命名規則で問題になるのは、下図の「名前」という欄ですのでここに命名規則の範囲内で任意の名前を設定し、統合を作成したい Azure Functions の function.json  で `connectionStringSetting` に設定を追記してあげると動作します。
![azure_functions_app_settings_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/25c1388a-c0ea-453b-1670-c20f9bd3193f.png)
![azure_functions_function_json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/e5139a5f-c34f-58fb-5c4e-94cb3ea2d1a6.png)
# 具体的なエラー内容など
具体的には **アプリ設定名に使用できるのは、英字、数字 (0-9)、ピリオド (".")、アンダースコア ("_") のみです** と言われる。
## もう少し詳しく
### 環境
- Azure Functions Node.js プログラミングモデルv3.x系
  - Node.js プログラミングモデルとAzure Functions ランタイムは明確に異なるものを指すので注意<br>([MS-Learn > Azure > 関数 > 考慮事項](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-node-upgrade-v4?tabs=azure-cli-set-indexing-flag%2Cv4#considerations))
- 関数アプリ > HttpTrigger Function
- Azure Cosmos DB (Core) Serverless
### エラーの発生する仕組み
```mermaid
sequenceDiagram
    HttpTrigger関数->>HttpTrigger関数: 統合(入力バインディングを新規に設定)
    HttpTrigger関数->>AzureCosmosDBアカウント: アカウント名の参照
    AzureCosmosDBアカウント-->>HttpTrigger関数: アカウント名(ハイフンが含まれている)
    HttpTrigger関数->>関数アプリ: アプリケーション設定を新規作成({アカウント名}_DOCUMENTDBという名称)
    関数アプリ--XHttpTrigger関数: [X]命名規則エラー
```
### 簡単な解説
このエラーは前述の「エラーの発生する仕組み」のとおり、関数アプリのアプリケーション設定に新規に設定を追加する際に Azure Cosmos DB アカウント名をその設定名の一部に使用しようとするために発生している問題です。
そのため、Function の統合画面から設定するのではなく、直接関数アプリのアプリケーション設定に命名規則に従った設定値を作成すればこの問題は回避できます。

このことは、アプリケーション設定の設定名は単なるラベルであり、設定値に設定する接続文字列によって接続する Azure Cosmos DB アカウントが識別されるため、設定名自体は命名規則に従っていれば何でもよいという事情によります。

その他、カスタム設定を手動で作成することによっても回避することが可能です。
ただし、この方法は本質的には直接アプリケーション設定を作成するのと変わりませんし、ウィザードに従って操作すればよいだけなので詳述しないことにします。

# 関数アプリにハイフンを含む設定を追加できないことを確認する
関数アプリ > 設定 > 構成 > アプリケーション設定 で、新しい設定を追加しようとしてみれば、下図のとおり設定を追加できないことを確認できます。
![azure_functions_new_app_settings_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/2b6bfa94-9a98-5010-b1f3-540909b0861f.png)
# Azure Functions で 入力バインディングを使って Azure Cosmos DB と接続する画面
この画面で、「Cosmos DB account connection」にハイフンが含まれるアカウントを指定すると正しく登録できません。<br>
![azure_functions_integration_input_bindings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118632/beae2563-1548-6071-825a-dae2ee944cc0.png)

# 感想や整理など
- Azure Cosmos DB アカウントは Azure リソースの一種
- 命名規則は[名前付け規則を定義する](https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming)において、ベストプラクティスとして提示されている
- この命名規則に従うと本記事で記載したエラーに遭遇する
- MS-Learn 中でも「ハイフン」が含まれているとエラーになるような記載はないどころか、次のように「ハイフン」を許容している。
  >「3 - 50 lowercase characters, numbers, or hyphens (-)」

  ※[MS-Learn > 演習 - 入力バインディングを使用してデータを読み取る](https://learn.microsoft.com/ja-jp/training/modules/chain-azure-functions-data-using-bindings/5-read-data-with-input-bindings-portal-lab?pivots=javascript) より引用
- ベストプラクティスに従ったら基本的な問題に遭遇するというのはベストプラクティスと言えるだろうか？
  - 少なくともベストプラクティスがまずいというよりは Azure portal や演習課題の作りがまずいっていう課題はありそう
- とりあえずフィードバックは出しておきました
- どこかに書いてるあるよ！とかあれば、フィードバックいただけるとうれしいです