Azure Learn AZ-204 The Hard Way | 實作 AZ-204 Lab 07 Key Vault


  1. Lab07 - Key Vault
    1. Pre Setting
    2. Create Key Vault
    3. Function App
    4. Create Key Vault Secret
    5. 設定 Key Vault access policy
    6. 設定 Function App Permission
    7. Function App Coding
    8. Azure Blob Storage data
    9. Function App Access Blog Storage Data
  2. Azure Key Vault 相關知識
  3. 實戰 Azure Key Vault 心得

實作 AZ-204 證照測驗準備的實驗課程,從實驗課程中精熟 AZ-204 的測驗重點以及工具操作。本次要實驗的是如何使用 Azure Key Vault。

logo

Lab07 - Key Vault

詳細的實驗流程可以參考微軟在 GitHub上的專案

圖片來源:微軟

Pre Setting

首先建立 Resource Group ConfidentialStack,並建立 Storage Account securestorcs

Storage Account 使用 Standard Performance 以及 LRS Redundancy SKU 即可。

先去 Storage Account 確認 Connection Strings,待會需要使用。

Create Key Vault

建立 Key Vault securevaultcs 使用 Standard Pricing Tier。

Function App

建立 Function App securefunccs,使用 .NET 3.1 Runtime Stack,Publish 選擇 Code。

到 Hosting 選擇使用 securestorcs 作為 Storage Account,作業系統選擇 Linux 並選擇 Plan 為 Consumption (Serverless)。

在建立好的 securefunccs 選擇 identity 並在 System assigned 啟用 Status (On)。

Create Key Vault Secret

在建立好的 Key Vault securevaultcs 在 Secrets 進行新增,上傳選項選擇 Manual,並在 Name 輸入 storagecredentials,值則將先前保存的 Storage Account Connection Strings 寫入。

將 Enabled 設定為 Yes 後保存。

從 Versions 確認 Secret Identifier,待會需要使用。

設定 Key Vault access policy

在 Key Vault securevaultcs 由 Access policies 進行新增,將 Secret permissions 選擇 GET,並將 Select principal 設定為 securefunccs

設定 Function App Permission

securefunccs 從 Configuration 選擇 New application setting,加入 StorageConnectionString,並將值設定為 @Microsoft.KeyVault(SecretUri=*Secret Identifier*)

其中 *Secret Identifier* 用 Key Vault Secret 所保存的 Secret Identifier 取代。

Function App Coding

func init --worker-runtime dotnet --force
func new --template "HTTP trigger" --name "FileParser"

local.settings.json

故意在 StorageConnectionString 保持為 [TEST VALUE],讓 local 端無法正常取得 Storage 資訊。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "StorageConnectionString": "[TEST VALUE]"
    }
}

FileParser.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

public static class FileParser
{
    [FunctionName("FileParser")]
    public static async Task<IActionResult> Run(
        [HttpTrigger("GET")] HttpRequest request)
    {
        string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
        return new OkObjectResult(connectionString);
    }
}
func start --build

瀏覽結果會發現目前 connectionString 為 [TEST VALUE]

func azure functionapp publish securefunccs

到 Function App 進行測試,連線字串可以正確顯示。

Azure Blob Storage data

securestorcs 新增 Container drop,並且選擇為 Blob (anonymous read access for blobs only)

上傳 records.json 從 URL 測試可以讀取。

接著調整 Container 的 Access Level 為 Private (no anonymous access)

這時 URL 已經無法讀取了,這是為了驗證限定授權給 Function App 的目的。

Function App Access Blog Storage Data

dotnet add package Azure.Storage.Blobs --version 12.6.0

FileParser.cs

using Azure.Storage.Blobs;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

public static class FileParser
{
    [FunctionName("FileParser")]
    public static async Task<IActionResult> Run(
        [HttpTrigger("GET")] HttpRequest request)
    {
        string connectionString = 
          Environment.GetEnvironmentVariable("StorageConnectionString");
        BlobClient blob = 
          new BlobClient(connectionString, "drop", "records.json");
        var response = await blob.DownloadAsync();
        return new FileStreamResult(response?.Value?.Content, response?.Value?.ContentType);
    }
}

將 Function 進行上傳

az login
func azure functionapp publish securefunccs

在 Function 再次進行 Test,發現可以正確取得 records.json 的資料 😊

Azure Key Vault 相關知識

實戰 Azure Key Vault 心得