April 2018

Volume 33 Number 4

Azure - コンテナー化した ASP.NET Core アプリケーションを Azure にデプロイする

Srikatan Sankaran

Azure Key Vault は、組織がビジネスの機微な情報を安全に保存できるようにするクラウドベースのサービスです。MSDN マガジンの先月号 (msdn.com/magazine/mt845653) では、代理店が作成した車両保険証券をシークレットとして Azure Key Vault に安全に保管するシナリオを説明しました。また、キーを使用した非対称暗号化や組み込みのバージョン管理などの追加機能を使用して、保険証券へのアクセスの監査記録を維持する方法についても示しました。Azure Key Vault を使用するアプリケーションは、Web アプリとして Azure App Service にデプロイしました。今回は、同じアプリケーションを Azure Container Services for Kubernetes (AKS) にデプロイします。Azure Container Services には、Docker コンテナーに対応したアプリケーションを作成して、Azure にデプロイできる機能があります。

ユースケース シナリオ

今回取り上げるソリューションには、2 つの ASP.NET Core 2.0 Web アプリケーションがあります。1 つは、保険会社、代理店、およびブローカーが使用する管理者ポータル、もう 1 つは、車両保険証券を購入した消費者および保険証券の有効性を確認する規制当局が使用する顧客ポータルです。このソリューションで対応するビジネス シナリオの詳細や、それらの要件を満たすために Azure Key Vault を役立てる方法については、前回のコラムをご覧ください。

ソリューションのアーキテクチャ

図 1 に、このソリューションのアーキテクチャを示します。これは、前回使用したアーキテクチャに少し変更を加えたものです。Azure App Service の代わりに、単一の AKS クラスターを使用しています。これは、Docker コンテナーを使用し、両方の Web アプリケーションを Linux 上でホストします。また、ブラウザーを実行するクライアントやネイティブ Xamarin アプリに SSL 対応のエンドポイントを公開するために Azure Application Gateway を使用しており、AKS にデプロイした Web アプリケーションに要求をルーティングします。管理者ポータルのユーザーの認証には Azure Active Directory (Azure AD) を使用します。顧客ポータルにアクセスするユーザーには、Azure Active Directory B2C (Azure AD B2C) を使用します。Azure SQL Database は、ソリューションで作成した保険証券に関するメタデータ情報を格納します。Azure Key Vault は、各保険証券の有効性と信頼性の確認に使用する機微な情報を保持します。AKS の他にも、Azure Container Instances (ACI) や Azure Web Apps for Containers など、コンテナー化アプリケーションをデプロイするためのオプションがいくつかあります。図 1 には示していませんが、これらも今回説明します。

ソリューションのアーキテクチャ
図 1 ソリューションのアーキテクチャ

新しいアーキテクチャに合わせてソリューションを変更する

当然、アーキテクチャを変更すれば、ソリューションも変更しなければなりません。それでは、どのようにソリューションを変更したかを見ていきましょう。

Docker コンテナーに対して Web アプリケーションを有効にする: Visual Studio Tools for Docker には、Windows コンテナーと Linux コンテナーの両方に対して ASP.NET 2.0 Core アプリケーションを有効にするための簡単な実装が用意されています。このツールをインストールすると、Visual Studio 2017 プロジェクトで、アプリケーションの Docker コンテナーを作成するのに必要なすべてのアーティファクトを生成するコンテキスト駆動のメニュー オプションが利用できるようになります。このソリューションの管理者ポータルおよび顧客 (外部) ポータル アプリケーションは、Docker Linux コンテナー用にパッケージ化しました。Visual Studio 2017 でツールを使用するには、Docker for Windows をインストールして、bit.ly/2F6YBRb (英語) に記載の構成手順を実行する必要があります。Web アプリケーション プロジェクトごとに、Visual Studio 2017 の “Release” 構成を使用して Docker コンテナー イメージを作成します。

コンソール ウィンドウで Docker コマンドを実行すると、2 つのコンテナー イメージ (ポータル アプリケーションごとに 1 つ) が表示されます (図 2 参照)。

Web アプリケーションの Docker イメージ
図 2 Web アプリケーションの Docker イメージ

プライベート レジストリにコンテナー イメージをアップロードする: 先ほど作成したコンテナー イメージを、まず、Azure Container Registry (ACR) にアップロードします。Azure Container Services は、ここからイメージを使用します。このデプロイのために作成した ACR インスタンスが "contosoinsacr" です。 Azure CLI を使用してレジストリにサインインした後、Docker コマンドを実行してコンテナー イメージをこのレジストリにアップロードします。

az acr login --name contosoinsacr --username <username> --password <password>
docker tag contosoinsauthorityadminportal contosoinsacr.azurecr.io/contosoinsauthorityadminportal:web1v1
docker push contosoinsacr.azurecr.io/contosoinsauthorityadminportal:web1v1
docker tag contosoinsextportal:latest contosoinsacr.azurecr.io/contosoinsextportal:web2v1
docker push contosoinsacr.azurecr.io/contosoinsextportal:web2v1
az acr repository list --name contosoinsacr --output table

最後は、アップロード後に ACR のコンテナー イメージを一覧表示する Docker コマンドです。ACR の作成方法と、ACR への Docker イメージのプッシュ方法の詳細については、docs.microsoft.com/ja-jp/azure/container-registry/container-registry-get-started-azure-cli のドキュメントを参照してください。

コンテナー化した Web アプリケーションをデプロイする

Azure には、コンテナーとしてパッケージ化した管理者ポータルと外部 (顧客) ポータル アプリケーションをデプロイするためのオプションが複数あります。それでは、これから見ていきましょう。

Azure Container Instances にデプロイする: ACI には、アプリケーションをホストする仮想マシンをプロビジョニングしたり、より複雑なシナリオに対応するコンテナー オーケストレーションを処理することなく、コンテナー ベース アプリケーションを Azure で実行する簡単な方法があります。それは、Azure Portal エクスペリエンスを使用して新しい ACI を作成し、アクセス資格情報と、先述の手順で ACR にアップロードしたコンテナー イメージへの参照を指定する方法です。完了したら、コンテナー インスタンスがプロビジョニングされ、Web アプリケーションにアクセスするためのパブリック IP アドレスが割り当てられます。これらの手順は、管理者ポータル アプリケーションと顧客ポータル アプリケーションの両方で実行します。Azure Portal を使用して ACI を作成し、アプリケーションをデプロイする方法の詳細については、docs.microsoft.com/ja-jp/azure/container-instances/container-instances-quickstart-portal のドキュメントを参照してください。

アプリケーションを使用できるようにするには、Azure AD (管理者ポータル) と Azure AD B2C (顧客ポータル) の両方で、アプリケーション登録ページから "リダイレクト URL" を構成する必要があります。図 3 に、ACI または AKS にデプロイした Web アプリケーションに対して構成した返信 URL を示します。

構成済みの返信 URL - Azure AD アプリ登録
図 3 構成済みの返信 URL - Azure AD アプリ登録

Azure Web App for Containers にデプロイする: Azure Web App for Containers へのアプリケーションのデプロイは、仮想マシンのプロビジョニングが不要で、複雑なシナリオを処理するためのオーケストレーターもないため、Azure Container Instances へのデプロイと似ています。ただし、Azure のマネージ Azure App Service インスタンス エンドポイントにコンテナーをデプロイする点が異なります。

図 4 に、Azure Portal で Azure Web App for Containers インスタンスを作成するために必要な設定を示します。Azure コンテナー レジストリにアップロードした Docker コンテナー イメージの URL は、構成の一部としてキャプチャされます。

Azure Web App for Containers
図 4 Azure Web App for Containers

Web App for Containers にデプロイすると、Web アプリのスケールアウト、自動スケーリングの構成、ステージングおよび運用のためのデプロイ スロットの使用など、Azure App Service に用意されている他の便利な機能を使用できるようになります。

Azure Container Services for Kubernetes (AKS) へのデプロイ: 最初の手順として、AKS クラスターを作成して構成します。開発者のローカル コンピューターから AKS にアプリケーションをデプロイするには、Windows 向けの "kubectl" コマンド ツールをインストールする必要があります。

この手順は Azure Portal から実行することもできますが、今回は、Azure CLI を使用して Azure に AKS クラスターをプロビジョニングします。現時点では、ACS がほぼすべての Azure リージョンで利用できるのに対し、AKS は世界の一部地域でしか利用できません (AKS は、マネージ Kubernetes クラスターにACS では利用できない強化された機能を提供するもので、現在プレビュー段階です)。  今回は、西ヨーロッパ リージョンにクラスターを作成します。そのために使用するコマンドは以下のとおりです。

az group create --name contosoinsacsrg --location westeurope
az aks create  -g contosoinsacsrg --name contosoinsacsportal --generate-ssh-keys --admin-username <username> --node-count 1
az aks get-credentials -g contosoinsacsrg -n contosoinsacsportal

コンテナー イメージを取得するために AKS クラスターが Azure コンテナー レジストリにアクセスできるようにするには、AKS クラスターのサービス プリンシパルに "Reader" (閲覧者) ロールを付与し、イメージをホストする ACR インスタンスに読み取りアクセス権を与えます。この詳細については、docs.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aks?toc=/azure/aks/toc.json のドキュメントを参照してください。これらのアクションを実行するために使用する CLI コマンドを以下に示します。

# Get the id of the service principal configured for AKS
az aks show --resource-group contosoinsacsrg --name contosoinsacsportal  --query "servicePrincipalProfile.clientId" --output tsv
# Get the ACR registry resource id
az acr show --name contosoinsacr --resource-group contosoInsAuthRG --query "id" --output tsv
# Create role assignment
az role assignment create --assignee <ServicePrincipalId> --role Reader --scope <resourceid>

次は、アプリケーションを AKS クラスターにデプロイします。これから説明する手順では、Windows および Docker を実行する開発ワークステーションで kubectl コマンドを使用します。

"YAML" ファイルを使用してアプリケーションをデプロイします (YAML は、構成ファイルによく使われる、データ シリアル化言語です)。 図 5 に、ソリューションで管理者ポータルのデプロイに使用する YAML ファイルを示します。この手順の結果として、管理者ポータルのコンテナー イメージが ACR から取得され、AKS クラスターにプロビジョニングされ、Azure ロード バランサーとパブリック IP アドレスを通じて公開されます。

図 5 AKS クラスターへの管理者ポータルのデプロイに使用する contosoinsportal.yaml ファイル

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: contosoinsadminv1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: contosoinsadminv1
    spec:
      containers:
      - name: contosoinsadminv1
        image: contosoinsacr.azurecr.io/contosoinsauthorityadminportal:web1v1
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: regsecret2
---
apiVersion: v1
kind: Service
metadata:
  name: contosoinsadminv1
spec:
  ports:
  - port: 80
  selector:
    app: contosoinsadminv1
---
apiVersion: v1
kind: Service
metadata:
  name: contosoinsadminv1lb
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: contosoinsadminv1

ACR のコンテナー イメージにアクセスできるようにするには、YAML で "pull secrets" を使用して、資格情報を指定する必要があります。 次の kubectl コマンドは、"regsecret2" という名前のシークレット ファイルを生成します。ファイルは、ローカル コンピューターにダウンロードされます。このファイルを、アプリケーションのデプロイに使用する YAML ファイルで参照します。

kubectl create secret docker-registry regsecret2 --docker-server <acr-login-server> --docker-username <service-principal-ID> --docker-password <service-principal-password> --docker-email <email-address>

次の kubectl コマンドを実行すると、引数として渡した YAML ファイルに基づいて、管理者ポータルが AKS クラスターにデプロイされます。デプロイしたアプリケーションを確認するには、Kubernetes ダッシュボードを参照します (図 6 参照)。これらの手順を外部ポータルにも繰り返した後、それぞれ独自に負荷分散された公開エンドポイントを使用して両方のアプリケーションを AKS クラスターにデプロイします。

 

kubectl create -f contosoinsportal.yaml
az aks browse --resource-group contosoinsacsrg --name contosoinsacsportal

デプロイしたアプリケーションが表示された Kubernetes ダッシュボード
図 6 デプロイしたアプリケーションが表示された Kubernetes ダッシュボード

次に、アプリケーションの更新プログラムをデプロイするプロセスを見ていきます。プロジェクトの次のバージョンを Visual Studio 2017 で準備したら、ローカル コンピューターの Docker のコンテナー イメージが更新されます。この後に示すコマンドを使用して、ACR 内のイメージに新しいバージョン "web2v2" でタグを付け、更新プログラムをプッシュします。最後のコマンドでは、kubectl を使用して、アップロードした新しいコンテナー イメージで Kubernetes クラスターのポッドを更新します。

docker tag contosoinsextportal:latest contosoinsacr.azurecr.io/contosoinsextportal:web2v2

docker push contosoinsacr.azurecr.io/contosoinsextportal:web2v2

kubectl set image deployment contosoinsusersv1 contosoinsusersv1=contosoinsacr.azurecr.io/contosoinsextportal:web2v2

図 7 に、AKS にデプロイした管理者ポータルのランディング ページを示します。

AKS で実行されている管理者ポータル
図 7 AKS で実行されている管理者ポータル

Azure Container Services と統合する CI/CD 自動化パイプライン

Azure Team Services を使用すると、Azure Container Services で実行されている Docker 対応アプリケーションに、継続的インテグレーションと継続的デプロイ パイプラインを実装できます。

Azure Team Services は、コードのチェックインとバージョン管理のために、Team Foundation Server と Git ベースのリポジトリの両方をサポートしています。GitHub のような外部リポジトリにあるコードに対しては、コードがリポジトリにチェックインされたときにビルド プロセスをトリガーする Web フックを Azure Team Services で構成できます。

CI パイプラインでは、[Docker Image creation](Docker イメージの作成) アクティビティを使用することで、アプリケーション更新プログラムを含む新しい Docker イメージを作成して、Azure Container Registry にプッシュします。

CD パイプラインでは、[Deploy to Kubernetes](Kubernetes にデプロイ) アクティビティを使用し、YAML ファイルに基づくことで、Kubernetes を実行している Azure Container Service クラスターに更新したコンテナー イメージをプッシュできます。

Azure Web App for Containers を使用する場合、Azure Portal では、Web アプリの設定ブレードから CI/CD パイプラインを構成できます。この構成によって、コードがチェックインされてビルド プロセスがトリガーされたときに、アプリケーションの新しい Docker イメージの生成が処理されます。また、運用スロットにイメージをプッシュする前に、更新された Web アプリケーションをステージング スロットにデプロイしてテストできます。

Web アプリケーションで SSL を有効にする

現時点では、AKS を使ってデプロイした Web アプリケーションは HTTP エンドポイントを通じてしか利用できません。代わりに HTTPS エンドポイントを有効にするために、利用できる選択肢の 1 つは、Azure Application Gateway をデプロイし (HTTPS URL を公開)、SSL 終了を実行し、要求を管理者ポータルおよび顧客ポータルにルーティングすることです。

Azure Application Gateway は、カスタム プローブを使用して、バックエンド プールの Web アプリケーションの正常性を定期的に監視します。正常性プローブが Web アプリケーションのページにアクセスしてアプリケーションの正常性を確認できるようにするために、ビジネスに不可欠な情報を含まない /home ページでの認証を無効にして、両方のポータル アプリケーションに小さな変更を加えました。その後、正常性確認に使用する Application Gateway のカスタム プローブ定義でこのページを構成しました。

または、Nginx Ingress Controller for Kubernetes は TLS 終了をサポートしており、Web アプリケーションへの SSL 対応アクセスに使用することができます。

サブスクリプションのソリューションのデプロイ

GitHub リポジトリ (bit.ly/2DRvwdh) からソース ファイルとスクリプトをダウンロードして、このソリューションを実際に試すことができます。このソリューションを実装するには、以下のソフトウェアが必要です。

GitHub リポジトリには、ソリューションで使用する管理者ポータルと顧客ポータルのソース ファイルが含まれています。今回はパッケージ化してコンテナーに個別にデプロイできるように、両方の Web アプリケーションに対応した ASP.NET Core 2.0 MVC プロジェクトを含む 1 つのソリューションを 2 つの個別のソリューション プロジェクトに分けています。しかし、これらの個別のソリューション ファイルは GitHub リポジトリには追加していません。

今回の内容に合うように、両方のプロジェクトに小さなコード変更を加えました。前回は、ローカル コンピューターの証明書ストアで .pfx ファイルを使用しました。Azure Key Vault サービスで認証を行うために、クライアントはこのファイルを要求に埋め込みます。今回は、単純にするために、代わりにクライアント シークレットをアプリケーション ID と一緒に使用し、Azure Key Vault で Web アプリケーションを認証します。お勧めの方法は、認証の要求で証明書を使用することです。

2 つのソリューション ファイルを Azure サブスクリプションにデプロイするには、今回紹介したコード スニペットと参照ドキュメントをご覧ください。

まとめ

Azure Key Vault は、企業が業界標準のアルゴリズムと手法を使用して暗号化操作を実行し、機微なビジネス情報を安全に管理できる効果的なメカニズムです。Azure には、さまざまなプラットフォームで好きな言語を使いこのサービスを利用するための SDK が用意されています。アプリケーションに大きなコード変更を加えなくても、Azure App Services の Web アプリケーション ソリューションまたは Docker 対応のアプリケーション パッケージとして Azure Container Services または Azure Web Apps for Containers にデプロイできます。Docker 用の Visual Studio 2017 ツールには、Web アプリケーションを Docker 対応にするため、複雑さを覆い隠し、開発者がビジネス機能の構築に専念できる簡単な実装が用意されています。Azure Container Service では、コンテナー オーケストレーションのために Kubernetes をサポートする最高クラスのオープン ソース ツールを利用できます。これを、継続的インテグレーションと継続的デプロイのために Azure Team Services に統合されたツールと組み合わせると、プロジェクト ライフサイクル全体を通じてアジャイルなソフトウェア デリバリーを実現できる最適なツールになります。


Srikantan Sankaran は、インドのバンガロールを拠点に各地で活動する One Commercial Partner チームのプリンシパル テクニカル エバンジェリストです。彼は、インドのさまざまな独立系ソフトウェア ベンダー (ISV) と共に活動しており、Microsoft Azure にソリューションをデプロイしています。連絡先は sansri@microsoft.com (英語のみ) です。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Anil Dwarakanath に心より感謝いたします。
Anil Dwarakanath は、マイクロソフトのクラウド ソリューション アーキテクトで、インドを拠点に各地で活動しています。


この記事について MSDN マガジン フォーラムで議論する