Azure Key Vault と Azure Pipelines の統合
Azure Key Vault は、キー、パスワード、証明書などの機密データの安全な保管と管理を行います。 Azure Key Vault では、ハードウェア セキュリティ モジュール、およびさまざまな暗号化アルゴリズムとキー長がサポートされています。 Azure Key Vault を使用すると、開発者がよく犯す間違いである、ソース コードを介した機密データ開示の可能性を最小限に抑えることができます。 Azure Key Vault にアクセスするには、コンテンツに対するきめ細かいアクセス許可をサポートする適切な認証と認可が必要です。
これらの演習の所要時間は約 40 分です。
開始する前に
ラボの演習を行うには、Azure サブスクリプション、Azure DevOps 組織、eShopOnWeb アプリケーションが必要です。
- 手順に従ってラボ環境を検証します。
このラボでは、ラボ環境を検証するときに作成したサービス プリンシパルを利用して、次の作業を行います。
- Azure サブスクリプションでリソースをデプロイします。
- Azure Key Vault シークレットへの読み取りアクセス権を取得する。
手順
このラボでは、次の手順を使用して、Azure Key Vault を Azure Pipelines と統合する方法について説明します。
- ACR のパスワードをシークレットとして保存する Azure Key Vault を作成します。
- サービス プリンシパルがシークレットを読み取れるようにするアクセス許可を構成します。
- Azure キー コンテナーからパスワードを取得し、それを後続のタスクに渡すようにパイプラインを構成します。
演習 1: CI パイプラインを設定して eShopOnWeb コンテナーをビルドする
この演習では、次の CI YAML パイプラインをセットアップします。
- コンテナー イメージを保存するための Azure コンテナー レジストリを作成する
- Docker Compose を使って eshoppublicapi と eshopwebmvc のコンテナー イメージをビルドしてプッシュする。 eshopwebmvc コンテナーのみがデプロイされます。
タスク 1:CI パイプラインをセットアップして実行する
このタスクでは、既存の CI YAML パイプライン定義をインポートし、変更して実行します。 パイプラインで新しい Azure コンテナー レジストリ (ACR) を作成し、eShopOnWeb コンテナー イメージをビルドして発行します。
-
Azure DevOps ポータル (
https://dev.azure.com
) に移動し、自分の組織を開きます。 -
Azure DevOps eShopOnWeb プロジェクトに移動します。 [パイプライン] >[パイプライン] に移動し、[パイプラインの作成] を選びます。
-
[コードはどこにありますか?] ページで、[Azure Repos Git (YAML)] を選択し、eShopOnWeb リポジトリを選択します。
-
[パイプラインの構成] ページで、[既存の Azure Pipelines YAML ファイル] を選択します。 次のパス /.ado/eshoponweb-ci-dockercompose.yml を指定し、[続行] を選択します。
-
YAML パイプライン定義の変数セクションで、次のアクションを実行します。
- AZ400-EWebShop-NAME を rg-eshoponweb-docker に置き換えます
- location 変数の値を、このコースのこれまでのラボで使用した Azure リージョンの名前に設定します (たとえば、southcentralus)
- YOUR-SUBSCRIPTION-ID を、使用している Azure サブスクリプション ID に置き換えます
-
[保存および実行] を選択し、メイン ブランチに直接コミットすることを選択します。
-
もう一度 [保存および実行] を選択します。
[!NOTE] 新しいブランチを作成する場合は、変更をメイン ブランチにマージする pull request を作成する必要があります。
-
パイプラインを開きます。 “この実行を続行して Docker Compose to WebApp に進む前に、リソースにアクセスするためのアクセス許可がこのパイプラインに必要です” というメッセージが表示された場合は、[表示]、[許可]、さらにもう一度 [許可] を選択します。 この操作は、パイプラインで Azure リソースを作成するために必要です。
-
パイプラインの実行が終了するまで待ちます。 この処理には数分かかる場合があります。 ビルドの定義は以下のタスクで構成されます。
- AzureResourceManagerTemplateDeployment は、bicep を使用して Azure コンテナー レジストリを作成します。
- PowerShell タスクは bicep 出力 (acr ログイン サーバー) を受け取り、パイプライン変数を作成します。
- DockerCompose タスクは、eShopOnWeb のコンテナー イメージをビルドし、Azure コンテナー レジストリにプッシュします。
-
既定では、パイプラインにはプロジェクト名に基づく名前が付けられます。 パイプラインをより簡単に識別できるように、名前を eshoponweb-ci-dockercompose に変更します。
-
パイプラインが完了したら、Web ブラウザーを使用して Azure Portal に移動し、rg-eshoponweb-docker リソース グループを開いて、パイプラインによってデプロイされた Azure コンテナー レジストリ (ACR) を表すエントリを選択します。
[!NOTE] レジストリ内のリポジトリを表示するには、そのようなアクセス権を提供するロールを自分のユーザー アカウントに付与する必要があります。 この目的のために、AcrPull ロールを使用します。
-
コンテナー レジストリのページで、[アクセス制御 (IAM)]、[+ 追加] の順に選択し、ドロップダウン リストで [ロールの割り当ての追加] を選択します。
-
[ロールの割り当ての追加] ページの [ロール] タブで、[AcrPull] を選び、[次へ] を選択します。
-
[メンバー] タブで、[+ メンバーの選択] をクリックします。自分のユーザー アカウントを選択し、[選択] をクリックして、[次へ] を選択します。
-
[レビューと割り当て] を選択し、割り当てが正常に完了したら、ブラウザー ページを更新します。
-
コンテナー レジストリのページに戻り、左側にある縦型メニュー バーの [サービス] セクションで [リポジトリ] を選択します。
-
レジストリに eshoppublicapi と eshopwebmvc のイメージが含まれていることを確認します。 デプロイ フェーズでは eshopwebmvc のみを使用します。
-
[アクセス キー] を選択し、[管理者ユーザー] チェック ボックスをオンにして、次のタスクで使用するパスワードの値をコピーします。これをシークレットとして Azure Key Vault に追加します。
-
同じページで、[レジストリ名] の値を記録します。 このラボで後ほど必要になります。
タスク 2: Azure Key Vault を作成する
このタスクでは、Azure portal を使用して Azure Key Vault を作成します。
このラボ シナリオでは、Azure Container Registry (ACR) に保存されているコンテナー イメージをプルして実行する Azure コンテナー インスタンス (ACI) を使用します。 ACR のパスワードをシークレットとして Azure キー コンテナーに保存します。
-
Azure portal の [リソース、サービス、ドキュメントの検索] テキスト ボックスに「Key Vault」と入力し、Enter キーを押します。
-
[キー コンテナー] ブレードを選択し、[作成] > [キー コンテナー] をクリックします。
-
[キー コンテナーの作成] ブレードの [基本] タブで、次の設定を指定して [次へ] をクリックします。
設定 値 サブスクリプション このラボで使用している Azure サブスクリプションの名前 リソース グループ リソース グループ名 rg-eshoponweb-docker キー コンテナー名 一意の有効な名前 (ewebshop-kv- に続けてランダムな 6 桁の数字など) リージョン このラボで先ほど選んだものと同じ Azure リージョン 価格レベル Standard 削除されたボールトを保持する日数 7 消去保護 消去保護を無効にする -
[キー コンテナーの作成] ブレードの [アクセス構成] タブで、[アクセス許可モデル] セクションの [コンテナー アクセス ポリシー] を選択します。
-
[アクセス ポリシー] セクションで、[+ 作成] を選択して新しいポリシーをセットアップします。
注:許可されたアプリケーションとユーザーのみを許可することにより、Key Vault のアクセスを保護する必要があります。 コンテナーからデータにアクセスするには、パイプラインでの認証に使用する以前に作成したサービス プリンシパルに、読み取り (取得/一覧表示) アクセス許可を付与する必要があります。
- [アクセス許可] ブレードで、 [シークレットのアクセス許可] の下にある [取得] と [一覧表示] のアクセス許可をオンにします。 [次へ] を選択します。
- [プリンシパル] ブレードで、ラボ環境を検証するときに作成したサービス プリンシパルを、その ID または名前を使用して検索します。 次へ を選択し、再度 次へ を選択します。
- [確認および作成] ブレードで、[作成] を選択します
-
[キー コンテナーの作成] ブレードに戻り、[確認および作成] > [作成] を選択します
[!NOTE] Azure Key Vault がプロビジョニングされるのを待ちます。 これにかかる時間は 1 分未満です。
-
[デプロイが完了しました] ブレードで、[リソースに移動] を選択します。
-
Azure キー コンテナー ブレードで、ブレードの左側にある縦型メニューの [オブジェクト] セクションで、[シークレット] を選択します。
-
[シークレット] ブレードで、[生成/インポート] を選択します。
-
[シークレットの作成] ブレードで、次の設定を指定し、[作成] を選択します (これ以外は既定値のままにします)。
設定 値 Upload options 手動 名前 acr-secret 値 前のタスクでコピーした ACR アクセス パスワード
タスク 3: Azure Key Vault に接続された変数グループを作成する
このタスクでは、Azure DevOps に変数グループを作成します。それは、サービス接続 (サービス プリンシパル) を使って、Key Vault から ACR パスワード シークレットを取得します
-
Azure DevOps ポータル (
https://dev.azure.com
) に移動し、自分の組織を開きます。 -
Azure DevOps プロジェクト eShopOnWeb に移動します。
-
Azure DevOps ポータルの縦型ナビゲーション ウィンドウで、[パイプライン] > [ライブラリ] を選択します。 [+ 変数グループ] を選択します。
-
[新しい変数グループ] ブレードで、次の設定を指定します。
設定 値 変数グループ名 eshopweb-vg シークレットを Azure Key Vault から変数としてリンクする enable Azure サブスクリプション [利用可能な Azure サービス接続] > [azure subs] キー コンテナー名 前のタスクで Azure キー コンテナーに割り当てた名前 -
[変数] の下の [+ 追加] を選択し、acr-secret シークレットを選択します。 [OK] を選択します。
-
[保存] を選択します。
タスク 4:CD パイプラインをセットアップして Azure Container Instance (ACI) にコンテナーをデプロイする
このタスクでは、CD パイプラインをインポートしてカスタマイズし、前に作成したコンテナー イメージを Azure コンテナー インスタンスにデプロイするために実行します。
-
eShopOnWeb プロジェクトが表示されている Azure DevOps ポータルで、[パイプライン] > [パイプライン] を選択し、[新しいパイプライン] を選択します。
-
[コードはどこにありますか?] ページで、[Azure Repos Git (YAML)] を選択してから、eShopOnWeb リポジトリを選択します。
-
[パイプラインの構成] ページで、[既存の Azure Pipelines YAML ファイル] を選択します。 パス /.ado/eshoponweb-cd-aci.yml を指定し、[続行] を選択します。
-
YAML パイプライン定義の変数セクションで、次のアクションを実行します。
- location 変数の値を、このラボで前に使用した Azure リージョンの名前に設定します
- YOUR-SUBSCRIPTION-ID を、使用している Azure サブスクリプション ID に置き換えます
- az400eshop-NAME を、デプロイする Azure コンテナー インスタンスのグローバルに一意の名前に置き換えます (たとえば、文字列 eshoponweb-lab-docker- に続けてランダムな 6 桁の数字)。
- YOUR-ACR と ACR-USERNAME を、このラボで前に記録した ACR レジストリ名に置き換えます。
- AZ400-EWebShop-NAME を、このラボで先ほど作成したリソース グループの名前 (rg-eshoponweb-docker) に置き換えます。
-
[保存して実行] を選び、もう一度 [保存して実行] を選びます。
-
パイプラインを開くと、”この実行を続行して Docker Compose to ACI に進む前に、2 つのリソースにアクセスするためのアクセス許可がこのパイプラインに必要です” というメッセージが表示されます。 [表示] を選択し、[許可] を 2 回選択して (リソースごとに) パイプラインの実行を許可します。
-
パイプラインの実行が終了するまで待ちます。 この処理には数分かかる場合があります。 ビルド定義は 1 つのタスク AzureResourceManagerTemplateDeployment で構成されます。これは、bicep テンプレートを使用して Azure コンテナー インスタンス (ACI) をデプロイし、ACR ログイン パラメーターを指定して、以前に作成したコンテナー イメージを ACI がダウンロードできるようにします。
-
パイプラインには、プロジェクト名に基づく名前が付けられます。 目的を識別しやすくするために、eshoponweb-cd-aci に名前を変更します。
演習 2:Azure と Azure DevOps リソースのクリーンアップを実行する
この演習では、このラボで作成した Azure と Azure DevOps のリソースを削除します。
タスク 1:Azure リソースを削除する
- Azure portal で、デプロイされたリソースを含むリソース グループ rg-eshoponweb-docker に移動し、[リソース グループの削除] を選んで、このラボで作成されたすべてのリソースを削除します。
タスク 2:Azure DevOps パイプラインを削除する
-
Azure DevOps ポータル (
https://dev.azure.com
) に移動し、自分の組織を開きます。 -
eShopOnWeb プロジェクトを開きます。
-
[パイプライン] > [パイプライン] に移動します。
-
[パイプライン] > [パイプライン] に移動し、既存のパイプラインを削除します。
タスク 3:Azure DevOps リポジトリを再作成する
-
Azure DevOps ポータルの eShopOnWeb プロジェクトで、左下隅にある [プロジェクトの設定] を選びます。
-
左側の [プロジェクトの設定] 縦型メニューの [リポジトリ] セクションで、[リポジトリ] を選びます。
-
[すべてのリポジトリ] ペインで、eShopOnWeb リポジトリ エントリの右端にマウス ポインターを置き、[その他のオプション] の […] アイコンが表示されたら、それを選びます。[その他のオプション] メニューで [名前の変更] を選びます。
-
[eShopOnWeb リポジトリの名前を変更する] ウィンドウの [リポジトリ名] テキスト ボックスに「eShopOnWeb_old」と入力し、[名前の変更] を選びます。
-
[すべてのリポジトリ] ペインに戻り、[+ 作成] を選びます。
-
[リポジトリの作成] ペインの [リポジトリ名] テキスト ボックスに「eShopOnWeb」と入力し、[Readme の追加] チェックボックスをオフにして、[作成] を選びます。
-
[すべてのリポジトリ] ペインに戻り、eShopOnWeb_old リポジトリ エントリの右端にマウス ポインターを置き、[その他のオプション] の […] アイコンが表示されたら、それを選びます。[その他のオプション] メニューで [削除] を選びます。
-
[eShopOnWeb_old リポジトリの削除] ウィンドウで「eShopOnWeb_old」と入力し、[削除] を選びます。
-
Azure DevOps ポータルの左側のナビゲーション メニューで [リポジトリ] を選びます。
-
[eShopOnWeb は空です。] をクリックします。 ペインで [リポジトリのインポート] を選びます。
-
[Git リポジトリをインポートする] ウィンドウで、URL
https://github.com/MicrosoftLearning/eShopOnWeb
を貼り付けて、[インポート] を選びます。
確認
このラボでは、次の手順を使用して、Azure KeyVault を Azure DevOps パイプラインと統合しました。
- Azure サービス プリンシパルを使用して Azure キー コンテナーのシークレットへのアクセスを提供し、Azure DevOps から Azure リソースへのアクセスを提供しました。
- Git リポジトリからインポートした 2 つの YAML パイプラインを実行しました。
- 変数グループを使って Azure キー コンテナーからパスワードを取得するようにパイプラインを構成し、それを後続のタスクで使用しました。