仮想マシン イメージを構築するワークフローを作成して、 GitHub Actions の使用を開始します。
GitHub Actions を使用すると、ワークフローから成果物を含むカスタム仮想マシン イメージを作成することで、CI/CD プロセスを高速化できます。 イメージをビルドし、 共有イメージ ギャラリーに配布することもできます。
その後、これらのイメージを使用して 、仮想マシン と 仮想マシン スケール セットを作成できます。
仮想マシン イメージのビルド アクションでは 、Azure Image Builder サービスを使用します。
[前提条件]
- アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
- アクティブなリポジトリを持つ GitHub アカウント。 お持ちでない場合は、無料でサインアップしてください。
- この例では、 Java Spring PetClinic サンプル アプリケーションを使用します。
- イメージを含む Azure コンピューティング ギャラリー。
ワークフロー ファイルの概要
ワークフローは、お使いのリポジトリの /.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 は、イメージのビルド中に共有イメージ ギャラリーに対するイメージの読み取りと書き込みに使用されます。
Azure CLI または Azure portal を使用してユーザーマネージド ID を作成します。 マネージド ID の名前を書き留めます。
この 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": [] } ] } }この JSON コードを使用して、JSON を使用して 新しいカスタム ロール を作成します。
Azure portal で Azure コンピューティング ギャラリーを開き、 アクセス制御 (IAM) に移動します。
[ ロールの割り当ての追加] を選択し、イメージ作成ロールをユーザーマネージド ID に割り当てます。
デプロイ資格情報を生成する
OIDC で Azure ログイン アクションを使用するには、Microsoft Entra アプリケーションまたはユーザー割り当てマネージド ID でフェデレーション ID 資格情報を構成する必要があります。
オプション 1: Microsoft Entra アプリケーション
- Azure portal、Azure CLI、または Azure PowerShell で、サービス プリンシパルを使って Microsoft Entra アプリケーションを作成します。
- 後で GitHub Actions ワークフローで使うため、クライアント ID、サブスクリプション ID、ディレクトリ (テナント) ID の値をコピーしておきます。
- Azure portal、Azure CLI、または Azure PowerShell を使用して、サービス プリンシパルに適切なロールを割り当てます。
- GitHub Actions により GitHub リポジトリに対して発行されたトークンを信頼するように、Microsoft Entra アプリケーションでフェデレーション ID 資格情報を構成します。
オプション 2: ユーザー割り当てマネージド ID
- 「ユーザー割り当てマネージド ID を作成する」の手順を使用して、ユーザー割り当てマネージド ID を作成します。
- 後で GitHub Actions ワークフローで使うため、クライアント ID、サブスクリプション ID、ディレクトリ (テナント) ID の値をコピーしておきます。
- ユーザー割り当てマネージド ID に適切なロールを割り当てます。
- GitHub Actions により GitHub リポジトリに対して発行されたトークンを信頼するように、ユーザー割り当てマネージド ID でフェデレーション ID 資格情報を構成します。
GitHub シークレットを作成する
ログイン アクションには、アプリケーションの クライアント ID、 ディレクトリ (テナント) ID、 サブスクリプション ID を 指定する必要があります。 これらの値は、ワークフロー内で直接指定するか、GitHub シークレットに格納してワークフローで参照できます。 GitHub シークレットとして値を保存する方がより安全なオプションです。
GitHub で、お使いのリポジトリに移動します。
[Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。
[ 新しいリポジトリ シークレット ] を選択します。
注
パブリック リポジトリのワークフロー セキュリティを強化するには、リポジトリ シークレットの代わりに環境シークレットを使用します。 環境で承認が必要な場合は、必要なレビュー担当者のいずれかが承認するまで、ジョブは環境シークレットにアクセスできません。
AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_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)。 |
仮想マシンを作成する
最後の手順として、イメージから仮想マシンを作成します。
{rgName}のプレースホルダーをリソース グループ名に置き換えます。仮想マシンのパスワード (
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 }}"
次のステップ
- Azure にデプロイする方法について説明します。