Azure FunctionsからKey Vaults登録のシークレット情報を引き出してみた

# はじめに

認証トークン等の情報をハードコーディングすることはセキュリティの観点からよろしくない。
また、認証トークン等の書き換えが発生した場合にハードコーディングしてしまうとコードの修正が必要になってしまう。
それらを防ぐために、Key Vaultsに登録し、Azure Functionsから環境変数として呼び出す方法を記載する。

# 前提

- Azureアカウントを持っていること
    - もしアカウントを持っていない場合は、[こちら](https://azure.microsoft.com/ja-jp/free/search/?&ef_id=EAIaIQobChMIkviS3O3m8gIVUltgCh2S0QKUEAAYASAAEgIIgPD_BwE:G:s&OCID=AID2200208_SEM_EAIaIQobChMIkviS3O3m8gIVUltgCh2S0QKUEAAYASAAEgIIgPD_BwE:G:s&gclid=EAIaIQobChMIkviS3O3m8gIVUltgCh2S0QKUEAAYASAAEgIIgPD_BwE)からアカウント登録
- Azure Functionsにてインスタンスが作成されていること
    - 作成していない場合は、[こちらの記事](https://qiita.com/RyogaTakao/items/68a22c8bd27f1bacfba8)を参考に作成

# 手順

## Key Vaultsでシークレットの作成
検索窓に「Key Vaults」と入力する。
サービスに表示される「キー コンテナー」を選択する。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/4c5337a0-cc75-4d53-452a-85175aca01c4.png)

左上の「作成」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/6d4b67e8-6e22-ad25-469e-cb71ed3b0410.png)

下記項目を入力し、「確認および作成」ボタンをクリックする。
- サブスクリプション: 任意のサブスクリプションを選択
- リソースグループ: 任意のリソースグループを選択（例では「Test20211222」）
- Key Vault名: 任意の名前を入力（例では「Test20211222」）
- 地域: 任意の地域を選択（例では「東日本」）
- 価格レベル: 任意の価格レベルを選択（例では「標準」）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/c9dc2831-3651-938c-9036-7ece46193383.png)

入力内容を確認し、間違いが無ければ「作成」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/76947b9f-a97b-906c-db22-c771d8fb153b.png)

デプロイが完了したら、「リソースに移動」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/884ca43d-d660-bf8c-56bb-1a07debbee67.png)

左のメニューの「設定」→「シークレット」を選択し、「+ 生成/インポート」をクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/faf73bfe-6a85-d3b4-b6ff-dd8c476b9b4b.png)

シークレットの名前と値（例では、「USERNAME」と「Test」）を入力し、「作成」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/7c9348ca-e995-5a46-7ac7-7a1bf2e9fe70.png)

シークレットが作成される。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/a00ec28f-4108-4e04-fdcb-b2c3bea94d4d.png)

## Azure Functionsでシステム割り当てマネージドIDの有効化
左のメニューの「設定」→「ID」を選択し、状態を「オン」にして「保存」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/9bb030ce-52ed-a358-4ad9-da7c5788f725.png)

## Key VaultsでAzure Functionsのアクセス許可をする
左のメニューの「設定」→「アクセスポリシー」を選択し、「+ アクセスポリシーの追加」をクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/1c7c6cd9-28a3-83e0-56a2-a739845ab2bd.png)

シークレットのアクセス許可にて「取得」を選択し、プリンシパルにて関数アプリ名（例では「test20211222-1」）を入力して選択し、「選択」ボタンをクリックする。
その後、「追加」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/69a84643-6043-5f20-e08b-c6eb1337c4b0.png)

「現在のアクセスポリシー」の「アプリケーション」に追加されていることが確認できたら、「保存」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/7ad2aa49-f47d-7a5b-18af-2f753314339f.png)

## Key Vaultsの値をAzure Functionsの環境変数に設定する

### Key Vaults
左のメニューから「設定」→「シークレット」を選択し、登録したシークレットをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/66b19d7a-28d7-3b63-0313-1d476d080706.png)

現在のバージョンのものをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/c0e890e2-098c-8057-eda5-f3f5279a5e9b.png)

表示されるシークレット識別子をコピーし、メモ帳等にコピペしておく。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/c7b62ca1-b36a-b8ec-7abd-84e0eb122e64.png)

### Azure Functions
左のメニューの「設定」→「構成」を選択し、アプリケーション設定において、「+ 新しいアプリケーション設定」をクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/8d121702-91a5-0008-3f25-ee1d8580cbf5.png)

下記内容を入力し、「OK」ボタンをクリックする。

- 名前:任意（例では「USERNAME_KEYVAULTS」）
- 値: @Microsoft.KeyVault(SecretUri=<先程コピペしておいたシークレット識別子>)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/2b47c7d1-4afa-1a6d-bdec-14c242f8372f.png)

追加されたのを確認したら「保存」ボタンをクリックする。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/7ea48199-0c2f-43c6-ae19-fafa9953cafa.png)

ソースが「キー コンテナーの参照」に変わり、緑のチェックマークが付いたのがわかる。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/d49bd0f2-0a27-159d-cc1e-a5d234a9d8dc.png)

## Azure FunctionsからKey Vaultsにシークレット登録したものの値を呼び出してみる
以下の方法で呼び出すことができる

- Node.js: process.env.<アプリケーション設定で登録した名前>
- Python: os.getenv("<アプリケーション設定で登録した名前>")

### Node.jsでの例
下図のように記載する。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/83140e19-7db6-048b-cbfd-7599082216ad.png)

関数URLにアクセスすると値が取得できていることが確認できる。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505689/94b540bd-830d-19bb-93ce-1eb7995db897.png)