演習 - Azure DevOps 環境を設定する

完了

このセクションでは、Azure DevOps 組織を設定し、デプロイ先の Azure App Service 環境を作成する方法について説明します。

学習内容は次のとおりです。

  • Azure DevOps プロジェクトを設定する。
  • Azure Boards を使って作業項目を管理する。
  • Azure App Service 環境を作成する。
  • Azure Pipelines でパイプライン変数を作成する。
  • Azure サブスクリプションで認証するサービス接続を作成する。

Azure DevOps にユーザーを追加する

このモジュールを完了するには、自分の Azure サブスクリプションが必要です。 Azure は無料で使用開始できます。

Azure DevOps を使うために Azure サブスクリプションは必要ありませんが、このモジュールでは Azure DevOps を使って Azure リソースにデプロイします。 このプロセスを簡略化するために、Azure と Azure DevOps の両方に同じ Microsoft アカウントを使ってサインインします。

Azure と Azure DevOps へのサインインに異なる Microsoft アカウントを使う場合は、Azure へのサインインに使う Microsoft アカウントで自分の DevOps 組織に、Basic アクセス レベルを持つユーザーを追加します。 詳しくは、組織またはプロジェクトへのユーザーの追加に関する記事をご覧ください。

次に、Azure DevOps からサインアウトし、Azure サブスクリプションへのサインインに使ったものと同じアカウントを使ってサインインし直します。

Azure DevOps プロジェクトを取得する

ここでは、このモジュールの残りの部分を完了するために、Azure DevOps 組織が確実に設定されるようにします。 これを行うには、Azure DevOps にプロジェクトを作成するテンプレートを実行します。

このラーニング パスのモジュールは段階的なプロセスになっています。 Tailspin Web チームの DevOps 導入作業を見ていきます。 学習目的のために、各モジュールには独自の Azure DevOps プロジェクトがあります。

テンプレートの実行

Azure DevOps 組織を設定するテンプレートを実行します。

Azure DevOps Demo Generator サイトから、以下の手順に従ってテンプレートを実行します。

  1. [サインイン] を選択して利用規約に同意します。

  2. [新しいプロジェクトの作成] ページで、自分の Azure DevOps 組織を選択します。 プロジェクト名を「Space Game - web - Docker」のように入力します。

    Screenshot of creating a project through Azure DevOps Demo Generator.

  3. [Yes, I want to fork this repository]>[Authorize] を選択します。 プロンプトが表示されたら、GitHub アカウントへのアクセスを認可します。

    重要

    テンプレートが GitHub リポジトリに接続されるように、このオプションを選ぶ必要があります。 既に Space Game リポジトリをフォークしている場合でも、このチェックボックスは必ずオンにします。 このテンプレートには、ご自分の既存のフォークを使います。

  4. [プロジェクトの作成] を選択します。

  5. [プロジェクトに移動] を選択して Azure DevOps のプロジェクトに移動します。

重要

このモジュールの「Azure DevOps 環境をクリーンアップする」ページには、重要なクリーンアップ手順が含まれています。 クリーンアップによって、無料のビルド時間の浪費を抑えることができます。 クリーンアップ手順は、このモジュールを完了しなかった場合でも必ず行ってください。

プロジェクトの可視性を設定する

最初は、GitHub 上の Space Game リポジトリのフォークはパブリックに設定され、Azure DevOps テンプレートによって作成されたプロジェクトはプライベートに設定されます。 GitHub 上のパブリック リポジトリには誰でもアクセスできますが、プライベート リポジトリには自分のほかに共有することを選択したユーザーのみがアクセスできます。 同様に、Azure DevOps では、パブリック プロジェクトでは認証されていないユーザーに読み取り専用アクセスを提供しますが、プライベート プロジェクトではユーザーがサービスにアクセスするにはアクセス権の付与と認証が必要です。

現時点では、このモジュールにおいてこれらの設定を変更する必要はありません。 ただし、個人のプロジェクトでは、他のユーザーに付与する可視性とアクセス権を決定する必要があります。 たとえば、プロジェクトがオープンソースの場合は、GitHub リポジトリと Azure DevOps プロジェクトの両方をパブリックにすることを選択できます。 プロジェクトが独自のものである場合は、GitHub リポジトリと Azure DevOps プロジェクトの両方をプライベートにするのが一般的です。

後で、プロジェクトに最適なオプションを決定する際に、次のリソースが役立つ場合があります。

作業項目を [実行中] に移動する

ここでは、Azure Boards で自分に作業項目を割り当てます。 また、作業項目を [実行中] の状態にします。 実際には、自分とチームが、各 "スプリント" (繰り返し作業) の最初に作業項目を作成することになります。

この作業割り当てによって、作業の起点となるチェックリストが得られます。 これにより、あなたの作業内容と残っている作業をチームの他のメンバーが把握できます。 また、作業項目は、チームがあまりに多くの作業を一度に引き受けることがないように、進行中の作業 (WIP) の制限を適用するのに役立ちます。

ここでは、最初の項目 [Create container version of web site using Docker] (Docker を使って Web サイトのコンテナー バージョンを作成する)[実行中] 列に移動し、自分自身をその作業項目に割り当てます。

作業項目を設定するには、次のようにします。

  1. Azure DevOps から、Boards に移動します。 メニューから [Boards] を選択します。

    Screenshot of Azure DevOps showing the location of the Boards menu.

  2. [Create container version of web site using Docker] (Docker を使って Web サイトのコンテナー バージョンを作成する) 作業項目で、カードの下部にある下矢印を選び、その作業項目を自分自身に割り当てます。

    Screenshot of Azure Boards showing the location of the down arrow.

  3. 作業項目を [作業予定] 列から [実行中] 列に移動します。

    Screenshot of Azure Boards showing the card in the Doing column.

このモジュールの最後には、タスク完了後にこのカードを [完了] 列に移動します。

Azure App Service 環境を作成する

Azure Pipelines にリリース パイプラインを作成する」モジュールでは、Azure portal を使って App Service インスタンスを作成しました。 ポータルは Azure のオファリングを探索する際にお勧めのツールですが、App Service のようなコンポーネントの設定は面倒になることがあります。

このモジュールでは、Azure CLI を使って、App Service インスタンスのデプロイと実行に必要なリソースを起動します。 Azure CLI には、ターミナルまたは Visual Studio Code からアクセスできます。

重要

このモジュールの演習を完了するには、ご自分の Azure サブスクリプションが必要です。

Azure portal で Cloud Shell を起動する

  1. Azure portal に移動してサインインします。

  2. メニュー バーから [Cloud Shell] を選び、[Bash] エクスペリエンスを選びます。

    Screenshot of the Azure portal showing the location of the Cloud Shell menu item.

    Note

    Cloud Shell では、Cloud Shell で作成するすべてのファイルを保持する Azure ストレージ リソースが必要です。 ユーザーが Cloud Shell を初めて開くとき、リソース グループ、ストレージ アカウント、Azure Files 共有の作成を求められます。 この設定は、以降のすべての Cloud Shell セッションで自動的に使用されます。

Azure リージョンを選択する

"リージョン" は、特定の地域内にある 1 つ以上の Azure データセンターです。 リージョンの例として、米国東部、米国西部、北ヨーロッパなどがあります。 App Service インスタンスなどの各 Azure リソースは、特定のリージョンに割り当てられています。

コマンドの実行プロセスを簡略化するために、既定のリージョンを選ぶことから始めます。 既定のリージョンを指定すると、以降のコマンドでは、別のリージョンを明示的に指定しない限り、既定でそのリージョンが使われます。

  1. 次のコマンドを実行して、Azure サブスクリプションで使用できるリージョンを一覧表示します。

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 出力の [名前] 列から、現在地に近いリージョンを選びます。 たとえば、eastasia または westus2 を選択できます。

  3. 次のコマンドを実行して、既定のリージョンを設定します。 プレースホルダーを、選んだリージョンの名前に置き換えます。

    az configure --defaults location=<REGION>
    

    この例では、westus2 を既定のリージョンとして設定します。

    az configure --defaults location=westus2
    

Bash 変数の作成

このセクションでは、設定プロセスをより便利にし、エラーを起こりにくくするために、Bash 変数を作成します。 共有のテキスト文字列に変数を使用すると、偶発的な入力ミスを防ぐことができます。

  1. Cloud Shell から、ランダムな数値を生成します。 これにより、次の手順で特定のサービスのグローバルに一意の名前を簡単に作成できます。

    resourceSuffix=$RANDOM
    
  2. App Service Web アプリと Azure Container Registry に対して、グローバルに一意の名前を作成します。 これらのコマンドで二重引用符を使うことで、Bash がインライン構文を使って変数を補間するようにします。

    webName="tailspin-space-game-web-${resourceSuffix}"
    registryName="tailspinspacegame${resourceSuffix}"
    
  3. リソース グループと App Service プランの名前を格納するために、さらに 2 つの Bash 変数を作成します。

    rgName='tailspin-space-game-rg'
    planName='tailspin-space-game-asp'
    

Azure リソースの作成

Note

学習目的のために、ここでは既定のネットワーク設定を使います。 これらの設定により、インターネットからサイトにアクセスできるようになります。 実際には、インターネットにルーティングできず、あなたやあなたのチームのみがアクセスできるネットワークに Azure 仮想ネットワークを構成して、自分の Web サイトを配置することが可能です。 後で自分のネットワークを再構成し、自分のユーザーが Web サイトを利用できるようにできます。

  1. 次の az group create コマンドを実行し、先ほど定義した名前を使用してリソース グループを作成します。

    az group create --name $rgName
    
  2. 次の az acr create コマンドを実行し、先ほど定義した名前を使用して Azure Container Registry を作成します。

    az acr create --name $registryName \
      --resource-group $rgName \
      --sku Standard \
      --admin-enabled true
    
  3. 次の az appservice plan create コマンドを実行し、先ほど定義した名前を使用して App Service プランを作成します。

    az appservice plan create \
      --name $planName \
      --resource-group $rgName \
      --sku B1 \
      --is-linux
    

    --sku 引数は、B1 プランを指定しています。 このプランは、Basic サービス レベルで実行されます。 --is-linux 引数では、Linux ワーカーを使用するよう指定しています。

    重要

    ご自分の Azure サブスクリプションで B1 SKU を使用できない場合、S1 (Standard) などの別のプランを選択します。

  4. 次の az webapp create コマンドを実行して、App Service インスタンスを作成します。

    az webapp create \
      --name $webName \
      --resource-group $rgName \
      --plan $planName \
      --deployment-container-image-name $registryName.azurecr.io/web:latest
    
  5. 次の az webapp list コマンドを実行して、App Service インスタンスのホスト名と状態を一覧表示します。

    az webapp list \
      --resource-group $rgName \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    

    実行中のサービスのホスト名をメモします。 これは、後で作業を確認するときに必要になります。 次に例を示します。

    HostName                                        State
    ----------------------------------------------  -------
    tailspin-space-game-web-4692.azurewebsites.net  Running
    
  6. 次の az acr list コマンドを実行して、Azure Container Registry インスタンスのログイン サーバーの一覧を表示します。 このサーバー名は、後でパイプライン変数を作成するときに必要になります。

    az acr list \
      --resource-group $rgName \
      --query "[].{loginServer: loginServer}" \
      --output table
    

    ログイン サーバーをメモします。 これは、後でパイプラインを構成するときに必要になります。 次に例を示します。

    LoginServer
    ---------------------------------
    tailspinspacegame4692.azurecr.io    
    

重要

このモジュールの「Azure DevOps 環境をクリーンアップする」ページには、重要なクリーンアップ手順が含まれています。 クリーンアップは、このモジュールを完了した後に Azure リソースに対して課金されないようにするために役立ちます。 このモジュールを最後まで実行しなかったとしても、クリーンアップ手順は必ず行ってください。

Azure Pipelines でパイプライン変数を作成する

Azure Pipelines でのリリース パイプラインの作成に関するモジュールでは、App Service の Web アプリの名前を格納する変数をパイプラインに追加しました。 ここでも同じことを行います。 さらに、Azure Container Registry の名前も追加します。

これらの名前をパイプライン構成でハードコーディングすることもできますが、変数として定義すると、構成が再利用しやすくなります。 さらに、インスタンス名が変更された場合は、構成を変更せずに、変数を更新してパイプラインをトリガーできます。

変数を追加するには、以下の操作を行います。

  1. Azure DevOps で、Space Game - web - Docker プロジェクトに移動します。

  2. [パイプライン][ライブラリ] を選択します。

    Screenshot of Azure Pipelines showing the Library menu option.

  3. [+ Variable group] を選択します。

  4. [Properties] の下で、変数グループ名として「Release」と入力します。

  5. [Variables] で、[+ Add] を選択します。

  6. 変数の名前として、「WebAppName」と入力します。 値として、上記で作成した App Service インスタンスの名前 (例: tailspin-space-game-web-4692) を入力します。

    重要

    ホスト名ではなく、App Service インスタンスの名前を設定します。 この例では、「tailspin-space-game-web-4692.azurewebsites.net」ではなく、「tailspin-space-game-web-4692」と入力します。

  7. このプロセスを繰り返し、Azure Container Registry ログイン サーバーの値 (例: tailspinspacegame4692.azurecr.io) を持つ RegistryName という名前の別の変数を追加します。

  8. [パイプラインのアクセス許可] を選択してから、+ 符号を選択してパイプラインを追加します。 mslearn-tailspin-spacegame-web-docker を選択して、変数グループにアクセスするためのアクセス許可をパイプラインに付与します。

  9. ページの上部にある [保存] を選択して、変数を保存します。 変数グループは、次のコードのようになります。

    Screenshot of Azure Pipeline showing the variable group. The group contains two variables.

必要なサービス接続を作成する

ここでは、Azure Pipelines で Azure サブスクリプションにアクセスできるようにするサービス接続を作成します。 Azure Pipelines では、このサービス接続を使用して Web サイトを App Service にデプロイします。 前のモジュールで同様のサービス接続を作成しました。 さらに、コンテナーを Azure Container Registry に発行するための Docker Registry 接続も作成します。

重要

同じ Microsoft アカウントで Azure portal と Azure DevOps の両方にサインインしていることを確認してください。

  1. Azure DevOps で、Space Game - web - Docker プロジェクトに移動します。

  2. ページの下隅で、[プロジェクトの設定] を選択します。

  3. [パイプライン] で、[サービス接続] を選択します。

  4. [新しいサービス接続][Azure Resource Manager] と選択してから、[次へ] を選択します。

  5. ページ最上部の近くにある [サービス プリンシパル (自動)] を選択します。 [次へ] を選択します。

  6. 以下のフィールドを設定します。

    フィールド
    スコープのレベル サブスクリプション
    サブスクリプション お使いの Azure サブスクリプション
    リソース グループ tailspin-space-game-rg
    サービス接続名 Resource Manager - Tailspin - Space Game

    処理中に、Microsoft アカウントにサインインするように求められる場合があります。

  7. 必ず、[すべてのパイプラインへのアクセス許可を与える] を選択してください。

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

    Azure サブスクリプションに接続できることを確認するために、Azure DevOps でテスト接続が実行されます。 Azure DevOps で接続できない場合は、もう一度サインインする機会があります。

  9. [New service connection][Docker Registry] の順に選択し、[Next] を選択します。

  10. ページの上部付近で、[Azure Container Registry] を選択します。

  11. 以下のフィールドを設定します。

    フィールド
    サブスクリプション お使いの Azure サブスクリプション
    Azure コンテナー レジストリ 先ほど作成したレジストリを選択してください
    サービス接続名 "Container Registry 接続"
  12. 必ず、[すべてのパイプラインへのアクセス許可を与える] を選択してください。

  13. 完了したら、 [保存] を選択します。