次の方法で共有


GitHub Actions と Azure を使用してカスタム仮想マシン イメージを構築する

仮想マシン イメージを構築するワークフローを作成して、 GitHub Actions の使用を開始します。

GitHub Actions を使用すると、ワークフローから成果物を含むカスタム仮想マシン イメージを作成することで、CI/CD プロセスを高速化できます。 イメージをビルドし、 共有イメージ ギャラリーに配布することもできます。

その後、これらのイメージを使用して 、仮想マシン仮想マシン スケール セットを作成できます。

仮想マシン イメージのビルド アクションでは 、Azure Image Builder サービスを使用します。

[前提条件]

ワークフロー ファイルの概要

ワークフローは、お使いのリポジトリの /.github/workflows/ パスの YAML (.yml) ファイルに定義されます。 この定義には、ワークフローを構成するさまざまな手順とパラメーターが含まれます。

ファイルには、次の 3 つのセクションがあります。

セクション タスク
認証 1. ユーザーマネージド ID を追加します。
2. サービス プリンシパルまたは Open ID Connect を設定します。
3. GitHub シークレットを作成します。
ビルド 1. 環境を設定します。
2. アプリをビルドします。
イメージ 1. VM イメージを作成します。
2. 仮想マシンを作成します。

ユーザーマネージド ID を作成する

イメージを配布するには、Azure Image Builder (AIB) のユーザーマネージド ID が必要です。 Azure ユーザー割り当てマネージド ID は、イメージのビルド中に共有イメージ ギャラリーに対するイメージの読み取りと書き込みに使用されます。

  1. Azure CLI または Azure portal を使用してユーザーマネージド ID を作成します。 マネージド ID の名前を書き留めます。

  2. この JSON コードをカスタマイズします。 {subscriptionID}{rgName}のプレースホルダーを、サブスクリプション ID とリソース グループ名に置き換えます。

    {
    "properties": {
        "roleName": "Image Creation Role",
        "IsCustom": true,
        "description": "Azure Image Builder access to create resources for the image build",
        "assignableScopes": [
          "/subscriptions/{subscriptionID}/resourceGroups/{rgName}"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.Compute/galleries/read",
                    "Microsoft.Compute/galleries/images/read",
                    "Microsoft.Compute/galleries/images/versions/read",
                    "Microsoft.Compute/galleries/images/versions/write",
                    "Microsoft.Compute/images/write",
                    "Microsoft.Compute/images/read",
                    "Microsoft.Compute/images/delete"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
        } 
    } 
    
  3. この JSON コードを使用して、JSON を使用して 新しいカスタム ロール を作成します。

  4. Azure portal で Azure コンピューティング ギャラリーを開き、 アクセス制御 (IAM) に移動します。

  5. [ ロールの割り当ての追加] を選択し、イメージ作成ロールをユーザーマネージド ID に割り当てます。

デプロイ資格情報を生成する

OIDC で Azure ログイン アクションを使用するには、Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID でフェデレーション ID 資格情報を構成する必要があります。

オプション 1: Microsoft Entra アプリケーション

オプション 2: ユーザー割り当てマネージド ID

GitHub シークレットを作成する

ログイン アクションには、アプリケーションの クライアント IDディレクトリ (テナント) IDサブスクリプション ID を 指定する必要があります。 これらの値は、ワークフロー内で直接指定するか、GitHub シークレットに格納してワークフローで参照できます。 GitHub シークレットとして値を保存する方がより安全なオプションです。

  1. GitHub で、お使いのリポジトリに移動します。

  2. [Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。

    シークレットを追加しているスクリーンショット

  3. [ 新しいリポジトリ シークレット ] を選択します。

    パブリック リポジトリのワークフロー セキュリティを強化するには、リポジトリ シークレットの代わりに環境シークレットを使用します。 環境で承認が必要な場合は、必要なレビュー担当者のいずれかが承認するまで、ジョブは環境シークレットにアクセスできません。

  4. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID のシークレットを作成します。 Microsoft Entra アプリケーションまたは GitHub シークレットのユーザー割り当てマネージド ID から次の値をコピーします。

    GitHub シークレット Microsoft Entra アプリケーションまたはユーザー割り当ての管理された ID
    AZURE_CLIENT_ID クライアントID
    AZURE_SUBSCRIPTION_ID サブスクリプション ID
    AZURE_TENANT_ID ディレクトリ (テナント) ID

    セキュリティ上の理由から、値をワークフローに直接渡すのではなく、GitHub シークレットを使用することをお勧めします。

Azure ログイン アクションを使用する

Azure ログイン アクションで GitHub シークレットを使用して、Azure に対する認証を行います。

Open ID Connect の場合は、Active Directory アプリに関連付けられているフェデレーション資格情報を使用します。

ワークフロー ファイルで GitHub シークレットを参照する方法の詳細については、GitHub Docs の ワークフローでの暗号化されたシークレットの使用 に関する記事を参照してください。

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    steps:
      - name: Log in with Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

Java を構成する

Java セットアップ SDK アクションを使用して Java 環境を設定します。 この例では、環境を設定し、Maven を使用してビルドし、成果物を出力します。

GitHub アーティファクト は、ジョブ間でワークフロー内のファイルを共有する方法です。 JAR ファイルを保持するアーティファクトを作成し、仮想マシン イメージに追加します。

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '17' ]

    steps:
    - name: Checkout
      uses: actions/checkout@v3    

    - name: Login via Az module
      uses: azure/login@v2
      with:
        creds: ${{secrets.AZURE_CREDENTIALS}}

    - name: Set up JDK ${{matrix.java}}
      uses: actions/setup-java@v2
      with:
        java-version: ${{matrix.java}}
        distribution: 'adopt'
        cache: maven
    - name: Build with Maven Wrapper
      run: ./mvnw -B package
        
    - name: Build Java
      run: mvn --batch-mode --update-snapshots verify

    - run: mkdir staging && cp target/*.jar staging
    - uses: actions/upload-artifact@v2
      with:
        name: Package
        path: staging

イメージのビルド

カスタム仮想マシン イメージを作成するには、[Azure 仮想マシン イメージの構築] アクションを使用します。

{subscriptionID}{rgName}{Identity}のプレースホルダーを、サブスクリプション ID、リソース グループ名、マネージド ID 名に置き換えます。 {galleryName}{imageName}の値をイメージ ギャラリー名とイメージ名に置き換えます。

アプリ ベイクド イメージの作成アクションがアクセス許可エラーで失敗した場合は、イメージ作成ロールがユーザーマネージド ID に割り当てられていることを確認します。

    - name: Create App Baked Image
      id: imageBuilder
      uses: azure/build-vm-image@v0
      with:
        location: 'eastus2'
        resource-group-name: '{rgName}'
        managed-identity: '{Identity}' # Managed identity
        source-os-type: 'windows'
        source-image-type: 'platformImage'
        source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
        dist-type: 'SharedImageGallery'
        dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
        dist-location: 'eastus2'

仮想マシンアクションの引数

Input 必須 Description
resource-group-name イエス ビルド プロセス中に成果物を格納および保存するために使用されるリソース グループ。
image-builder-template-name いいえ 使用されるイメージ ビルダー テンプレート リソースの名前。
location イエス Azure Image Builder を実行する場所。 サポートされている場所を参照してください。
build-timeout-in-minutes いいえ ビルドがキャンセルされるまでの時間。 既定値は 240 です。
vm-size オプション 既定では、 Standard_D1_v2 が使用されます。 仮想マシンのサイズを参照してください。
managed-identity イエス 前に作成したユーザーマネージド ID。 ID が別のリソース グループにある場合は、完全な識別子を使用します。 同じリソース グループ内にある場合は、その名前を使用します。
source-os イエス 基本イメージの OS の種類 (Linux または Windows)
source-image-type イエス カスタム イメージの作成に使用される基本イメージの種類。
source-image イエス 基本イメージのリソース識別子。 ソース イメージは、場所の入力値に設定されているのと同じ Azure リージョンに存在する必要があります。
customizer-source いいえ カスタマイズのために基本イメージに追加する必要があるすべての成果物を保持できるディレクトリ。 既定では、値は ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination いいえ これは、成果物のコピー先となるカスタマイズされたイメージ内のディレクトリです。
customizer-windows-update いいえ Windows の場合のみ。 ブール値。 true場合、イメージ ビルダーはカスタマイズの最後に Windows Update を実行します。
dist-location いいえ SharedImageGallery の場合、これは dist-typeです。
dist-image-tags いいえ これらは、作成されたカスタム イメージに追加されるユーザー定義タグです (例: version:beta)。

仮想マシンを作成する

最後の手順として、イメージから仮想マシンを作成します。

  1. {rgName}のプレースホルダーをリソース グループ名に置き換えます。

  2. 仮想マシンのパスワード (VM_PWD) を使用して GitHub シークレットを追加します。 パスワードは再度表示できないため、必ず書き留めておいてください。 ユーザー名は myuser

    - name: CREATE VM
      uses: azure/CLI@v1
      with:
        azcliversion: 2.0.72
        inlineScript: |
        az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
            --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

完全な YAML

  on: [push]

  name: Create Custom VM Image

  jobs:
    build-image:
      runs-on: ubuntu-latest    
      steps:
      - name: Checkout
        uses: actions/checkout@v2    

      - name: Login via Az module
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Setup Java 1.8.x
        uses: actions/setup-java@v1
        with:
          java-version: '1.8.x'
          
      - name: Build Java
        run: mvn --batch-mode --update-snapshots verify

      - run: mkdir staging && cp target/*.jar staging
      - uses: actions/upload-artifact@v2
        with:
          name: Package
          path: staging

      - name: Create App Baked Image
        id: imageBuilder
        uses: azure/build-vm-image@v0
        with:
          location: 'eastus2'
          resource-group-name: '{rgName}'
          managed-identity: '{Identity}' # Managed identity
          source-os-type: 'windows'
          source-image-type: 'platformImage'
          source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
          dist-type: 'SharedImageGallery'
          dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
          dist-location: 'eastus2'

      - name: CREATE VM
        uses: azure/CLI@v1
        with:
          azcliversion: 2.0.72
          inlineScript: |
          az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
              --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

次のステップ