EcAuthDocs

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 権限が必要な場合:

  1. 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"
        }
      }
    }
  2. PR を作成してマージ

  3. 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.X

deploy.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 権限がない、または管理者の同意が付与されていない

対処:

  1. azure-ad-terraform で権限が設定されているか確認
  2. Azure Portal で管理者の同意を付与

Container Apps 更新エラー

Error: The subscription is not registered to use namespace 'Microsoft.App'.

原因: サブスクリプションで Microsoft.App リソースプロバイダーが登録されていない

対処:

az provider register --namespace Microsoft.App

関連ドキュメント