MockIdP CI/CD デプロイメントガイド
MockOpenIdProvider の Azure Container Apps へのデプロイパイプライン。GitHub Actions と 1Password 連携。
このドキュメントでは、EcAuth.MockIdP の CI/CD パイプラインと Azure へのデプロイメント設定について説明します。
概要
EcAuth.MockIdP は GitHub Actions を使用した CI/CD パイプラインを持ち、main ブランチへの push 時に自動的に Azure Container Apps へデプロイされます。
デプロイフロー
main ブランチへの push
↓
Docker Build & Push (docker-build.yml)
- Docker イメージをビルド
- ghcr.io/ecauth/mock-openid-provider にプッシュ
↓ (完了時に自動トリガー)
Deploy to Azure (deploy.yml)
- OIDC 認証で Azure にログイン
- Container Apps のイメージを更新
- ヘルスチェック実行
Workload Identity の構成
Azure へのデプロイは OIDC 認証(Workload Identity Federation)を使用しています。これにより Client Secret の管理が不要になり、セキュリティが向上します。
関連リポジトリ
| リポジトリ | 役割 |
|---|---|
| azure-ad-terraform | Entra ID アプリケーション管理 |
| ecauth-infrastructure | Azure リソース管理 + Federated Credentials 追加 |
| EcAuth.MockIdP | アプリケーション + CI/CD ワークフロー |
アプリケーション構成
ecauth-workload-identity アプリケーションが Entra ID に作成されています。
| 属性 | 値 |
|---|---|
| Display Name | ecauth-workload-identity |
| Client ID | 55580e4f-3e65-4d8b-9282-5b6a5d5285e7 |
| Object ID | bf8279e3-2a92-4d73-bcc0-43247e334b66 |
Microsoft Graph API 権限
以下の API 権限が付与されています(管理者の同意済み):
| 権限 | 用途 |
|---|---|
Application.ReadWrite.All |
ecauth-infrastructure/identity で Federated Credentials を管理 |
User.Read.All |
ecauth-infrastructure/dev で SQL Server の Entra ID 管理者を参照 |
Federated Credentials
以下の Federated Credentials が設定されています:
Terraform Cloud 用
| Name | Workspace | Run Phase |
|---|---|---|
| ecauth-identity-terraform-plan | ecauth-identity | plan |
| ecauth-identity-terraform-apply | ecauth-identity | apply |
| tfc-ecauth-dev-plan | ecauth-infrastructure-dev | plan |
| tfc-ecauth-dev-apply | ecauth-infrastructure-dev | apply |
GitHub Actions 用
| Name | Repository | Branch |
|---|---|---|
| github-ecauth-main | EcAuth/EcAuth | main |
| github-ecauth-mockidp-main | EcAuth/EcAuth.MockIdP | main |
azure-ad-terraform との関係
責務分担
azure-ad-terraform (skirnir-dev Organization)
├─ ecauth-workload-identity アプリケーション本体
├─ Service Principal
├─ Azure RBAC ロール割り当て
├─ Microsoft Graph API 権限
└─ ecauth-identity 用 Federated Credentials (bootstrap)
ecauth-infrastructure/environments/identity (EcAuth Organization)
├─ Terraform Cloud dev ワークスペース用 Federated Credentials
└─ GitHub Actions 用 Federated Credentials
Bootstrap 問題の解決
ecauth-infrastructure/identity 環境で Federated Credentials を追加するためには、その前に ecauth-workload-identity が Terraform Cloud から認証できる必要があります(鶏と卵問題)。
解決方法: azure-ad-terraform で ecauth-identity ワークスペース用の Federated Credentials を先に作成(bootstrap)。
# azure-ad-terraform/main.tf
module "ecauth_identity_terraform" {
source = "./modules/app_terraform"
application_object_id = azuread_application.ecauth.id
display_name = "ecauth-identity-terraform"
workspace = "ecauth-identity"
project = "EcAuth"
}
権限追加時の手順
新しい Microsoft Graph API 権限が必要な場合:
azure-ad-terraform で権限を追加
resource "azuread_application" "ecauth" { required_resource_access { resource_app_id = data.azuread_application_published_app_ids.well_known.result["MicrosoftGraph"] resource_access { id = data.azuread_service_principal.msgraph.app_role_ids["NewPermission"] type = "Role" } } }PR を作成してマージ
Azure Portal で管理者の同意を付与
- Entra ID → アプリの登録 → ecauth-workload-identity
- API のアクセス許可 → 「管理者の同意を与える」
GitHub Secrets
EcAuth.MockIdP リポジトリに以下の Secrets が設定されています:
| Secret | 説明 |
|---|---|
AZURE_CLIENT_ID |
ecauth-workload-identity の Client ID |
AZURE_TENANT_ID |
Azure AD テナント ID |
AZURE_SUBSCRIPTION_ID |
Azure サブスクリプション ID |
ORG_PAT |
GitHub Packages 読み取り用 PAT |
Terraform Cloud 設定
ワークスペース
| ワークスペース | 用途 | VCS Trigger Pattern |
|---|---|---|
| ecauth-identity | Federated Credentials 管理 | environments/identity/**/* |
| ecauth-infrastructure-dev | Azure リソース管理 | environments/dev/**/* |
Project Variables
EcAuth プロジェクトレベルで以下の変数が設定されています:
| 変数 | 説明 |
|---|---|
TFC_AZURE_PROVIDER_AUTH |
Dynamic Provider Credentials 有効化 |
TFC_AZURE_RUN_CLIENT_ID |
ecauth-workload-identity の Client ID |
ARM_SUBSCRIPTION_ID |
Azure サブスクリプション ID |
ARM_TENANT_ID |
Azure テナント ID |
デプロイワークフロー詳細
docker-build.yml
on:
push:
branches: [main]
tags: ['v*']
jobs:
build-and-push:
- Docker イメージをビルド
- ghcr.io にプッシュ
- タグ: latest, sha-xxx, vX.X.Xdeploy.yml
on:
workflow_run:
workflows: ["Docker Build & Push"]
types: [completed]
branches: [main]
jobs:
deploy:
if: github.event.workflow_run.conclusion == 'success'
steps:
- Azure Login (OIDC)
- az containerapp update
- Health check (/healthz)ヘルスチェック
デプロイ後、以下のエンドポイントでヘルスチェックが実行されます:
GET /healthz
- 成功時: HTTP 200
- 最大10回リトライ(10秒間隔)
トラブルシューティング
OIDC 認証エラー
Error: AADSTS700024: Client assertion is not within its valid time range.
原因: GitHub Actions ランナーの時刻がずれている可能性
対処: ワークフローを再実行
Federated Credentials 追加エラー
Error: Authorization_RequestDenied: Insufficient privileges to complete the operation.
原因: Application.ReadWrite.All
権限がない、または管理者の同意が付与されていない
対処:
- azure-ad-terraform で権限が設定されているか確認
- Azure Portal で管理者の同意を付与
Container Apps 更新エラー
Error: The subscription is not registered to use namespace 'Microsoft.App'.
原因: サブスクリプションで Microsoft.App リソースプロバイダーが登録されていない
対処:
az provider register --namespace Microsoft.App関連ドキュメント
- mockidp-azure-migration-plan.md - MockIdP Azure 移行計画
- ecauth-infrastructure CLAUDE.md - インフラ管理ガイド