はじめに
最近 GitHub Action を利用して アプリの CI / CD 環境を構成する方法を勉強しました。
Azure Bicep と GitHub ワークフローを利用すれば、インフラも CI/CD ができる、とのことで試してみました。
環境
- macOS:
15.1.1
- Visual Studio Code:
1.95.3
- Azure CLI:
2.62.0
To-Do
ざっくりとやることをまとめると下記の通りになります。
- 新規リポジトリの作成
- リソースグループの作成
- アプリの登録とサービスプリンシパルの作成
- ロールの割り当て
- フェデレーション資格情報の設定
- GitHub にシークレットを登録
- デプロイテンプレートの作成
- GitHub Action 用のワークフローを作成
実装
今回はお試しで Vnet を 1 つ CI/CD で作成・管理できるようにしていきたいと思います。
1. 新規リポジトリの作成
ここは説明不要かと思います。
下記の手順で新しいリポジトリを作成します。
今回は、「azure-cicd-sample」というリポジトリを作成しました。
2. リソースグループの作成
リソースグループの準備がまだの場合は作成します。
既存のリソースグループがある場合はスキップしても問題ありません。
# リソースグループ名
resourceGroupName=rg-githubcicd-sample-001
# リソースグループのリージョン
location=japaneast
# Azure ログイン
az login
# リソースグループの作成
resourceGroupId=$(az group create --location $location --name $resourceGroupName --query id --output tsv)
3. アプリの登録とサービスプリンシパルの作成
作業ユーザーには下記の権限が必要です。
- Entra ロール: アプリケーション管理者
# アプリの名前
appName=github_action_for_azure-cicd-sample
# アプリの登録
appId=$(az ad app create --display-name $appName --query appId --output tsv)
# サービスプリンシパルの作成
spObjectId=$(az ad sp create --id $appId --query id --output tsv)
4. ロールの割り当て
作業ユーザーには下記の権限が必要です。
- Azure ロール: 対象スコープでの所有者もしくはユーザーアクセス管理者
また、組み込みのロール名と ID については下記で確認できます。
# ロール:ネットワーク共同作成者
roleNameOrId=4d97b98b-1d4f-4787-a291-c67834d212e7
# スコープ:先ほど作成したリソースグループ
scope=$resourceGroupId
# 割り当て先:先ほど作成したサービスプリンシパル
assignee=$spObjectId
# ロール割り当て
az role assignment create --role $roleNameOrId --assignee $assignee --scope $scope
5. フェデレーション資格情報の設定
Entra ID に作成したアプリが GitHub Action を動かせるようにフェデレーション資格情報の設定を行います。
# GitHubアカウント名
githubAccountName='{your github account name}'
# リポジトリ名
githubRepositoryName=azure-cicd-sample
# フェデレーション資格情報を設定する対象
id=$appId
# フェデレーション資格情報の定義
federation='{
"name": "github_federation_for_{githubRepositoryName}",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:{githubAccountName}/{githubRepositoryName}:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'
federation=${federation//'{githubAccountName}'/$githubAccountName}
federation=${federation//'{githubRepositoryName}'/$githubRepositoryName}
# フェデレーション資格情報の設定
az ad app federated-credential create --id $id --parameters $federation
6. GitHub にシークレットを登録
下記を GitHub リポジトリのシークレットとして登録します。
No | シークレット | 説明 |
---|---|---|
1 | AZURE_TENANT_ID | Entra ID のテナント GUID |
2 | AZURE_SUBSCRIPTION_ID | Azure サブスクリプション ID |
3 | AZURE_CLIENT_ID | クライアント ID。アプリ登録の際に生成。 |
4 | AZURE_RESOURCE_GROUP_NAME | リソースをデプロイするリソースグループ名 |
値の取得は下記コマンドで可能です。
# AZURE_TENANT_ID
az account show --query tenantId -o tsv
# AZURE_SUBSCRIPTION_ID
az account show --query id -o tsv
# AZURE_CLIENT_ID
echo $appId
# AZURE_RESOURCE_GROUP_NAME(この手順で新しく作成した場合)
echo $resourceGroupName
7. デプロイテンプレートの作成
Vnet を 1 つ作成するテンプレートを作成します。
Bicep テンプレート
// --------------------------------------------------------------------------------
// Params
// --------------------------------------------------------------------------------
param virtualNetworkName string
param location string = resourceGroup().location
param addressPrefixes string[]
// --------------------------------------------------------------------------------
// Resources
// --------------------------------------------------------------------------------
resource virtualNetworks 'Microsoft.Network/virtualNetworks@2023-09-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: addressPrefixes
}
}
}
using './main.bicep'
param virtualNetworkName = 'githubcicd-idea-001'
param addressPrefixes = ['10.0.0.0/24']
8. GitHub Action 用のワークフローを作成
main ブランチに push された場合に、デプロイのワークフローが動くように作成します。
name: Azure Bicep Deployment.
# トリガー
on:
push:
branches:
- main
# 手動
workflow_dispatch:
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# タイムスタンプを生成
- name: Set timestamp
env:
TZ: "Asia/Tokyo"
run: echo "TIMESTAMP=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_ENV
# チェックアウト
- name: Checkout to the branch
uses: actions/checkout@v4
# Azure ログイン
- name: Azure Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
# リソースデプロイ
- name: Deploy with Azure Bicep
uses: azure/cli@v2
with:
azcliversion: latest
inlineScript: |
az deployment group create \
--name Deploy_${{ env.TIMESTAMP }} \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP_NAME }} \
--template-file main.bicep \
--parameters main.bicepparam
動作確認
作成したファイルをコミット、プッシュして期待通りに動くか確認します。
うまくいけば下記のようになります。
GitHub Action
Azure リソースグループ デプロイ結果
さいごに
今回は、Azure Bicep と GitHub Action を利用して インフラの CI/CD を試してみました。
Azure CLI を使った操作にも慣れていきたいところです。
最後まで見ていただきありがとうございました。
誰かの役に立てば幸いです。
テンプレート
本記事で実施した手順は、リポジトリとして保存・公開しています。
よければ参考にしてください。
参考