Azure Key Vault と Azure Pipelines の統合

Azure Key Vault は、キー、パスワード、証明書などの機密データの安全な保管と管理を行います。 Azure Key Vault では、ハードウェア セキュリティ モジュール、およびさまざまな暗号化アルゴリズムとキー長がサポートされています。 Azure Key Vault を使用すると、開発者がよく犯す間違いである、ソース コードを介した機密データ開示の可能性を最小限に抑えることができます。 Azure Key Vault にアクセスするには、コンテンツに対するきめ細かいアクセス許可をサポートする適切な認証と認可が必要です。

このラボでは、次の手順を使用して、Azure Key Vault を Azure Pipelines と統合する方法について説明します。

  • ACR のパスワードをシークレットとして保存する Azure Key Vault を作成します。
  • サービス プリンシパルがシークレットを読み取れるようにするアクセス許可を構成します。
  • Azure キー コンテナーからパスワードを取得し、それを後続のタスクに渡すようにパイプラインを構成します。

これらの演習の所要時間は約 30 分です。

開始する前に

ラボの演習を行うには、Azure サブスクリプション、Azure DevOps 組織、eShopOnWeb アプリケーションが必要です。

このラボでは、次のことを行います。

  • Azure サブスクリプションでリソースをデプロイします。
  • Azure Key Vault シークレットへの読み取りアクセス権を取得する。

手順

演習 1: CI パイプラインを設定して eShopOnWeb コンテナーをビルドする

この演習では、次の CI YAML パイプラインをセットアップします。

  • コンテナー イメージを保存するための Azure コンテナー レジストリを作成する
  • Docker Compose を使って eshoppublicapieshopwebmvc のコンテナー イメージをビルドしてプッシュする。 eshopwebmvc コンテナーのみがデプロイされます。

タスク 1:CI パイプラインをセットアップして実行する

このタスクでは、既存の CI YAML パイプライン定義をインポートし、変更して実行します。 パイプラインで新しい Azure コンテナー レジストリ (ACR) を作成し、eShopOnWeb コンテナー イメージをビルドして発行します。

  1. Azure DevOps ポータル (https://aex.dev.azure.com) に移動し、自分の組織を開きます。

  2. Azure DevOps eShopOnWeb プロジェクトに移動します。 [パイプライン]、[パイプライン] の順に移動し、[新しいパイプライン] を選択します。

  3. [コードはどこにありますか?] ページで、[Azure Repos Git (YAML)] を選択し、eShopOnWeb リポジトリを選択します。

  4. [パイプラインの構成] ページで、[既存の Azure Pipelines YAML ファイル] を選択します。 次のパス /.ado/eshoponweb-ci-dockercompose.yml を指定し、[続行] を選択します。

    YAML ファイルからのパイプライン選択のスクリーンショット。

  5. YAML パイプライン定義の変数セクションで、次のアクションを実行します。

    • AZ400-EWebShop-NAMErg-eshoponweb-secure に置き換えます
    • location 変数の値を、このコースのこれまでのラボで使用した Azure リージョンの名前 (たとえば centralus) に設定します
    • YOUR-SUBSCRIPTION-ID を、使用している Azure サブスクリプション ID に置き換えます
  6. [保存および実行] を選択し、メイン ブランチに直接コミットすることを選択します。

  7. もう一度 [保存および実行] を選択します。

    : 新しいブランチを作成する場合は、変更をメイン ブランチにマージする pull request を作成する必要があります。

  8. パイプラインを開きます。 “イメージの ACR 作成の実行を続けるには、このパイプラインにリソースにアクセスするためのアクセス許可が必要です” というメッセージが表示された場合は、[表示][許可]、もう一度 [許可] の順に選択します。 パイプラインは数分で実行されます。

    YAML パイプラインからのアクセス許可のスクリーンショット。

  9. パイプラインの実行が終了するまで待ちます。 この処理には数分かかる場合があります。 ビルドの定義は以下のタスクで構成されます。

    • AzureResourceManagerTemplateDeployment は、bicep を使用して Azure コンテナー レジストリを作成します。
    • PowerShell タスクは bicep 出力 (acr ログイン サーバー) を受け取り、パイプライン変数を作成します。
    • DockerCompose タスクは、eShopOnWeb のコンテナー イメージをビルドし、Azure コンテナー レジストリにプッシュします。
  10. 既定では、パイプラインにはプロジェクト名に基づく名前が付けられます。 パイプラインをより簡単に識別できるように、名前を eshoponweb-ci-dockercompose に変更します。

  11. パイプラインが完了したら、Web ブラウザーを使用して Azure portal に移動し、rg-eshoponweb-secure リソース グループを開いて、パイプラインによってデプロイされた Azure Container Registry (ACR) を表すエントリを選択します。

    : レジストリ内のリポジトリを表示するには、そのようなアクセスができるロールを自分のユーザー アカウントに付与する必要があります。 この目的のために、AcrPull ロールを使用します。

  12. コンテナー レジストリのページで、[アクセス制御 (IAM)][+ 追加] の順に選択し、ドロップダウン リストで [ロールの割り当ての追加] を選択します。

  13. [ロールの割り当ての追加] ページの [ロール] タブで、[AcrPull] を選び、[次へ] を選択します。

  14. [メンバー] タブで、[+ メンバーの選択] をクリックします。自分のユーザー アカウントを選択し、[選択] をクリックして、[次へ] を選択します。

  15. [レビューと割り当て] を選択し、割り当てが正常に完了したら、ブラウザー ページを更新します。

  16. コンテナー レジストリのページに戻り、左側にある縦型メニュー バーの [サービス] セクションで [リポジトリ] を選択します。

  17. レジストリに eshoppublicapieshopwebmvc のイメージが含まれていることを確認します。 デプロイ フェーズでは eshopwebmvc のみを使用します。

    Azure Portal での ACR のコンテナー イメージのスクリーンショット。

  18. [設定] で、[アクセス キー] を選択し、[管理者ユーザー] チェックボックスをオンにして、パスワードレジストリ名の値をコピーします。これは次のタスクで、Azure Key Vault へのシークレットとして追加するために使用します。

    [アクセス キー] 設定での ACR パスワードのスクリーンショット。

  19. 同じページで、[レジストリ名] の値を記録します。 このラボで後ほど必要になります。

タスク 2: Azure Key Vault を作成する

このタスクでは、Azure portal を使用して Azure Key Vault を作成します。

このラボ シナリオでは、Azure Container Registry (ACR) に保存されているコンテナー イメージをプルして実行する Azure コンテナー インスタンス (ACI) を使用します。 ACR のパスワードをシークレットとして Azure キー コンテナーに保存します。

  1. Azure portal の [リソース、サービス、ドキュメントの検索] テキスト ボックスに「Key Vault」と入力し、Enter キーを押します。

  2. [キー コンテナー] ブレードを選択し、[キー コンテナーの作成] をクリックします。

  3. [キー コンテナーの作成] ブレードの [基本] タブで、次の設定を指定して [次へ] をクリックします。

    設定
    サブスクリプション このラボで使用している Azure サブスクリプションの名前
    リソース グループ リソース グループ名 rg-eshoponweb-secure
    キー コンテナー名 ewebshop-kv などの一意の有効な名前
    リージョン このラボで先ほど選んだものと同じ Azure リージョン
    価格レベル Standard
    削除されたボールトを保持する日数 7
    消去保護 消去保護を無効にする
  4. [次へ: アクセス構成] をクリックします。

  5. [アクセス許可モデル] セクションで、[コンテナー アクセス ポリシー] を選択します。

  6. [アクセス ポリシー] セクションで、[+ 作成] を選択して新しいポリシーをセットアップします。

    :許可されたアプリケーションとユーザーのみを許可することにより、Key Vault のアクセスを保護する必要があります。 コンテナーからデータにアクセスするには、パイプラインでの認証に使用する以前に作成したサービス プリンシパルに、読み取り (取得/一覧表示) アクセス許可を付与する必要があります。

    • [アクセス許可] ブレードで、 [シークレットのアクセス許可] の下にある [取得][一覧表示] のアクセス許可をオンにします。 [次へ] を選択します。
    • [プリンシパル] ブレードで、ユーザーを検索して選択し、[次へ] に続いて、もう一度 [次へ] を選択します。
    • [確認および作成] ブレードで、[作成] を選択します
  7. [キー コンテナーの作成] ブレードに戻り、[確認および作成] > [作成] を選択します

    :Azure Key Vault がプロビジョニングされるのを待ちます。 これにかかる時間は 1 分未満です。

  8. [デプロイが完了しました] ブレードで、[リソースに移動] を選択します。

  9. Azure キー コンテナー ブレードで、ブレードの左側にある縦型メニューの [オブジェクト] セクションで、[シークレット] を選択します。

  10. [シークレット] ブレードで、[生成/インポート] を選択します。

  11. [シークレットの作成] ブレードで、次の設定を指定し、[作成] を選択します (これ以外は既定値のままにします)。

    設定
    Upload options 手動
    名前 acr-secret
    前のタスクでコピーした ACR アクセス パスワード
  12. シークレットが作成されるまで待ちます。

タスク 3: Azure Key Vault に接続された変数グループを作成する

このタスクでは、Azure DevOps に変数グループを作成します。それは、サービス接続 (サービス プリンシパル) を使って、Key Vault から ACR パスワード シークレットを取得します

  1. Azure DevOps ポータル (https://aex.dev.azure.com) に移動し、自分の組織を開きます。

  2. Azure DevOps プロジェクト eShopOnWeb に移動します。

  3. Azure DevOps ポータルの縦型ナビゲーション ウィンドウで、[パイプライン] > [ライブラリ] を選択します。 [+ 変数グループ] を選択します。

  4. [新しい変数グループ] ブレードで、次の設定を指定します。

    設定
    変数グループ名 eshopweb-vg
    シークレットを Azure Key Vault から変数としてリンクする enable
    Azure サブスクリプション [利用可能な Azure サービス接続] > [azure subs]
    キー コンテナー名 前のタスクで Azure キー コンテナーに割り当てた名前
  5. [承認] ボタンをクリックします。

  6. [変数] の下の [+ 追加] を選択し、acr-secret シークレットを選択します。 [OK] を選択します。

  7. [保存] を選択します。

    変数グループの作成のスクリーンショット。

タスク 4:CD パイプラインをセットアップして Azure Container Instance (ACI) にコンテナーをデプロイする

このタスクでは、CD パイプラインをインポートしてカスタマイズし、前に作成したコンテナー イメージを Azure コンテナー インスタンスにデプロイするために実行します。

  1. eShopOnWeb プロジェクトが表示されている Azure DevOps ポータルで、[パイプライン] > [パイプライン] を選択し、[新しいパイプライン] を選択します。

  2. [コードはどこにありますか?] ページで、[Azure Repos Git (YAML)] を選択してから、eShopOnWeb リポジトリを選択します。

  3. [パイプラインの構成] ページで、[既存の Azure Pipelines YAML ファイル] を選択します。 パス /.ado/eshoponweb-cd-aci.yml を指定し、[続行] を選択します。

  4. YAML パイプライン定義の変数セクションで、次のアクションを実行します。

    • location 変数の値を、このラボで前に使用した Azure リージョンの名前 (たとえば centralus) に設定します。
    • YOUR-SUBSCRIPTION-ID を、使用している Azure サブスクリプション ID に置き換えます
    • az400eshop-NAME を、デプロイする Azure コンテナー インスタンスのグローバル一意識別子 (たとえば、文字列 eshoponweb-lab-docker の後に 6 桁のランダムな数字) に置き換えます。
    • YOUR-ACRACR-USERNAME を、このラボで前に記録した ACR レジストリ名に置き換えます。
    • AZ400-EWebShop-NAME を、このラボで先ほど作成したリソース グループの名前 (rg-eshoponweb-secure) に置き換えます。
  5. [保存して実行] を選び、もう一度 [保存して実行] を選びます。

  6. パイプラインを開くと、”この実行を続行して Docker Compose to ACI に進む前に、2 つのリソースにアクセスするためのアクセス許可がこのパイプラインに必要です” というメッセージが表示されます。 [表示] を選択し、[許可] を 2 回選択して (リソースごとに) パイプラインの実行を許可します。

  7. パイプラインの実行が終了するまで待ちます。 この処理には数分かかる場合があります。 ビルド定義は 1 つのタスク AzureResourceManagerTemplateDeployment で構成されます。これは、bicep テンプレートを使用して Azure コンテナー インスタンス (ACI) をデプロイし、ACR ログイン パラメーターを指定して、以前に作成したコンテナー イメージを ACI がダウンロードできるようにします。

  8. パイプラインには、プロジェクト名に基づく名前が付けられます。 目的を識別しやすくするために、eshoponweb-cd-aci に名前を変更します。

[!IMPORTANT] 不要な料金が発生しないように、Azure portal で作成されたリソースを必ず削除してください。

確認

このラボでは、次の手順を使用して、Azure KeyVault を Azure DevOps パイプラインと統合しました。

  • Azure DevOps から Azure Key Vault のシークレットと Azure リソースへのアクセスを提供しました。
  • Git リポジトリからインポートした 2 つの YAML パイプラインを実行しました。
  • 変数グループを使って Azure キー コンテナーからパスワードを取得するようにパイプラインを構成し、それを後続のタスクで使用しました。