演習 - GitHub Actions を使用して、CI/CD 作業の一部として ARM テンプレートをデプロイする

完了

ここでは、GitHub Actions ワークフローから Azure Resource Manager (ARM) テンプレートをデプロイします。

重要

この演習は、Microsoft Learn 環境外で実行します。 この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 サンドボックス サブスクリプションではサポートされて "いない" サービス プリンシパルを作成する必要があるため、これが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

GitHub のアカウントとリポジトリを作成する

まず、GitHub アカウントをお持ちでない場合は、GitHub アカウント作成ページ上で今すぐ作成してください。 (無料です)。

GitHub アカウント作成ページを示すスクリーンショット。

アカウントを作成したら、サインインして新しいリポジトリを作成します。ここには、コードとしてのインフラストラクチャ (IaC) モデルの一部として、テンプレートを保持することができます。 リポジトリ (業界内での通称は "リポ") を作成するには、次の手順に従います。

  1. GitHub サイトの任意のページの右上隅にある + ドロップダウン メニューを使用して、[New repository] (新規リポジトリ) を選択します。 または、緑色の [Create repository] (リポジトリの作成) ボタンがあれば、それを選択します。

    GitHub リポジトリを作成するための選択項目を示すスクリーンショット。

  2. 短くて覚えやすいリポジトリ名を入力します。 たとえば、Deploy-ARM-Template を使用します。 必要に応じて、リポジトリの説明を追加します。 たとえば、[Deploying my first ARM template with GitHub Actions] (GitHub アクションを使用した最初の ARM テンプレートのデプロイ) を使用します。

  3. リポジトリの表示設定を選択します。 パブリック リポジトリには、インターネット上の誰でもアクセスできます。 プライベート リポジトリには、自分と、自分が明示的にアクセスを共有する相手のみがアクセスできます (この演習ではどちらも機能します)。

  4. [次でこのリポジトリを初期化する][README ファイルを追加する] を選択します。

  5. [Create repository] (リポジトリの作成) を選択します。

    新しいリポジトリの詳細の作成を示すスクリーンショット。

リポジトリを作成し、README ファイルで初期化しました。 次に、テンプレートとテンプレート パラメーター ファイルをリポジトリにコミットします。

Note

README ファイルは、プロジェクトの詳細を説明したり、プロジェクトのインストール方法や使い方などのドキュメントを追加したりするために適した場所です。 README ファイルの内容は、リポジトリのフロント ページに自動的に表示されます。

ARM テンプレート ファイルをリポジトリにコミットする

  1. GitHub で、リポジトリのメイン ページに移動します。

  2. ファイルの一覧の上にある [Add file] (ファイルの追加) ドロップダウン リストで、[Create new file] (ファイルの新規作成) を選択します。

    テンプレートをリポジトリに追加するための選択項目を示すスクリーンショット。

  3. ファイル名フィールドに、テンプレートの名前と拡張子を入力します。 この演習では、名前 azuredeploy.json を使用します。 次のテンプレートをコピーして、新しい GitHub ファイルの中に貼り付けます。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "VnetName": {
                "type": "string",
                "defaultValue": "VNet-001",
                "metadata": {
                    "description": "Virtual Network Name"
                }
            },
            "CostCenterIO": {
                "type": "string",
                "defaultValue": "12345",
                "metadata": {
                    "description": "Cost Center IO number for cross billing"
                }
            },
            "OwnerName": {
                "type": "string",
                "defaultValue": "John Smith",
                "metadata": {
                    "description": "Name of the stakeholder responsible for this resource"
                }
            }
        },
        "variables": {},
        "resources": [
            {
                "apiVersion": "2018-10-01",
                "type": "Microsoft.Network/virtualNetworks",
                "name": "[parameters('VnetName')]",
                "location": "[resourceGroup().location]",
                "tags": {
                    "CostCenter": "[parameters('CostCenterIO')]",
                    "Owner": "[parameters('OwnerName')]"
                },
                "properties": {
                    "addressSpace": {
                        "addressPrefixes": [
                            "10.0.0.0/16"
                        ]
                    },
                    "enableVmProtection": false,
                    "enableDdosProtection": false,
                    "subnets": [
                        {
                            "name": "subnet001",
                            "properties": {
                                "addressPrefix": "10.0.0.0/24"
                            }
                        },
                        {
                            "name": "subnet002",
                            "properties": {
                                "addressPrefix": "10.0.1.0/24"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  4. [Commit new file] (新しいファイルのコミット) セクションに説明を追加し、[Commit new file] (新しいファイルのコミット) をクリックしてレポジトリに保存します。

    新しいテンプレートをリポジトリに保存する手順を示すスクリーンショット。

GitHub Actions と Azure サブスクリプション間の認証を構成する

GitHub Actions を使用してリソースを Azure にデプロイするには、Azure サービス プリンシパルを作成し、テンプレートで定義されたリソースを作成するためのアクセス許可を付与する必要があります。 この手順は、ご利用のサブスクリプションにサインインした後、Azure portal の Azure Cloud Shell セクション内で実行します。

サービス プリンシパルを作成する

Azure リソースをデプロイする GitHub Actions ワークフローのプリンシパルには、適切な組み込みの共同作成者が必要です。

次の Azure CLI スクリプトは、Azure リソース グループで共同作成者のアクセス許可を持つ Azure サービス プリンシパルを生成する方法を示しています。 このリソース グループは、ARM テンプレート内で定義されたリソースがワークフローによってデプロイされる場所です。

projectName="GitHubActionExercise"
location="eastus"
resourceGroupName="${projectName}-rg"
appName="http://${projectName}"

# Create the resource group
az group create --name $resourceGroupName --location $location

# Store the resource group ID in a variable
scope=$(az group list --query "[?contains(name, '$resourceGroupName')].id" -o tsv)

# Create the service principal with contributor rights to the resource group we just created
az ad sp create-for-rbac --name $appName --role Contributor --scopes $scope --sdk-auth

サブスクリプションにサインインした状態で、portal で [Cloud Shell] アイコンをクリックすると、ページの下部にシェルが開きます。

Cloud Shell を開く手順を示すアニメーション。

シェルで、前述のコードを使用して、サービス プリンシパルを作成します。 次の結果が得られます。 この結果の JSON の部分 (次のスクリーンショット内で、赤いボックスで囲まれた内容) をコピーします。GitHub 内でシークレットを構成する際にこれが必要になるためです。

Azure でサービス プリンシパルを作成した結果を示すスクリーンショット。

この JSON 出力をコピーし、GitHub 内で次の手順を実行して、GitHub リポジトリ内に GitHub シークレットとして保存します。GitHub リポジトリで、[Settings] タブを選択します。左側のメニューで [Secrets] ドロップダウンを選択し、[Codespaces] を選択します。

次の値を入力し、[Add secret] (シークレットの追加) を選択します。

  • [名前]: 「AZURE_CREDENTIALS」と入力します。
  • シークレット: 先ほどコピーした JSON 出力を貼り付けます。

新しいサービス プリンシパル シークレット情報を GitHub シークレットに追加する手順を示すスクリーンショット。

ワークフロー内で認証を指定するには、この情報が必要です。

ワークフローを作成する

ワークフロー ファイルは、リポジトリのルートにある .github/workflows フォルダーに保存する必要があります。 ワークフロー ファイルの拡張子には、 .yml または .yaml を指定できます。

ワークフロー ファイルは、作成して、そのファイルをリポジトリにプッシュまたはアップロードするか、 次の手順を使用して GitHub インターフェイスで作成することができます。

  1. GitHub リポジトリのトップ メニューから [Actions] を選択し、[Set up a workflow yourself] (ワークフローを自分でセットアップする) を選択します。

    ワークフローを設定するための選択項目を示すスクリーンショット。

  2. main.yml の代わりに別の名前を使用する場合は、ワークフロー ファイルの名前を変更します。 たとえば、deployARMTemplate.yml を使用します。

  3. .yml ファイルの内容を次のコードに置き換えます。

    Note

    GitHub Marketplace には、ARM テンプレートをデプロイするために使用できるいくつかのカスタムビルド アクションが用意されています。 このモジュールでは、Deploy Azure Resource Manager (ARM) Template というマーケットプレース プロバイダーを使用します。

    name: Deploy ARM Template
    
    on:
      push:
        branches:
          - main
    env:
      AZURE_SUBSCRIPTION_ID: << Subscription Id >>   # set this to your Azure Subscription Id
      AZURE_RESOURCE_GROUP: GitHubActionExercise-rg   # set this to your target resource group
    
    jobs:
      deploy-virtual-network-template:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout source code
            uses: actions/checkout@main
    
          - name: Login to Azure
            uses: azure/login@v1
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    
          - name: Deploy ARM Template
            uses: azure/arm-deploy@v1
            with:
              scope: resourcegroup
              subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }}
              resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP }}
              template: ./azuredeploy.json
    

    このワークフロー ファイルには 3 つのセクションがあります。

    • name:ワークフローの名前。

    • on:ワークフローをトリガーする GitHub イベントの名前。 メイン ブランチでプッシュ イベントが発生し、メイン ブランチ上の少なくとも 1 つのファイルが変更されると、ワークフローがトリガーされます。

    • jobs:ワークフローの実行は、1 つ以上のジョブで構成されます。 deploy-virtual-network-templateという名前のジョブが 1 つだけあります。 このジョブには 3 つのステップがあります。

      1. ソース コードをチェックアウトする。
      2. Azure にサインインします。
      3. ARM テンプレートをデプロイする。

    重要

    creds: ${{ secrets.AZURE_CREDENTIALS }} 内のシークレット名と、リポジトリの設定に保存したシークレット名が一致していることを確認してください。 また、Deploy ARM Template 手順の template: $GITHUB_WORKSPACE/azuredeploy.json の ARM テンプレート名と、先ほどリポジトリに保存したものが一致することを確認してください。

    Note

    デプロイの資格情報を構成したときに上記の Azure CLI コードを使用した場合、リソース グループ名は GitHubActionExercise-rg になります。 生成されるリソース グループ名は、プロジェクト名に rg が追加された名前になります。

  4. [Start commit](コミットの開始) を選択します。 必要に応じて、コメントと説明を追加します。

  5. 確実に [Commit directly to the main branch](メイン ブランチに直接コミットする) を選択し、[Commit new file](新しいファイルのコミット) (または [Commit changes](変更のコミット)) をクリックします。

    ワークフローをメイン ブランチにコミットする手順を示すスクリーンショット。

    ワークフローのトリガーはメイン ブランチへのコミットまたはプッシュであるため、ワークフロー ファイルが作成され、リポジトリのメイン ブランチにコミットされると、ワークフローは自動的に開始されます。

    on:
      push:
        branches:
          - main
    
  6. リポジトリにアクセスして、ワークフローの状態を確認します。

    ワークフローの状態を示すスクリーンショット。

デプロイをチェックする

ワークフローが完了したら、Azure portal に移動して、デプロイの状態を確認します。

左側のウィンドウで、[リソース グループ]>[GitHubActionExercise-rg] を選択します。 [デプロイ] ウィンドウで、デプロイが成功したことを確認します。

デプロイの状態を示すスクリーンショット。