🛡️

Terraform使ってIBM Verifyを3ステップでデプロイする

に公開

生成AIのPoCで作ってるGradioアプリやReactアプリに、ログイン・ログアウト機能やユーザー管理機能を付け加えるためにIBM Verify(IAM/SSOソリューション)を使っています。PoCアプリなので2カ月くらいの使い捨てなので、ちゃちゃっとデプロイしたいです。そこで、IBM Cloud上にIBM VerifyをTerraformで自動デプロイするのを作りました。

https://github.com/simontokyo/terraform-ibmverify

手動セットアップの手間を省き、.envファイルまで自動生成してくれます。

使い方(3ステップ)

1. 変数ファイルを作成

cp terraform.tfvars.example terraform.tfvars
ibmcloud_api_key = "your-api-key"
resource_group   = "Default"
instance_name    = "my-verify"
hostname         = "mycompany"  # mycompany.verify.ibm.com になる

2. デプロイ実行

./scripts/update_env.sh  # Linux/Mac
# or
.\scripts\update_env.ps1  # Windows

3. 完了

.envファイルが自動生成されます:

IBM_VERIFY_HOSTNAME=mycompany.verify.ibm.com
IBM_VERIFY_DASHBOARD_URL=https://mycompany.verify.ibm.com/ui/admin/
IBM_VERIFY_ACCOUNT_URL=https://mycompany.verify.ibm.com
IBM_VERIFY_INSTANCE_ID=<guid>

ポイント

Infrastructure as Code化のメリット

  • 複数環境への一貫したデプロイが可能
  • Git管理でインフラ変更履歴が追跡できる
  • チーム間での横展開が簡単

公式モジュールを使用

このリポジトリは以下の公式モジュールを組み合わせています:

  • terraform-ibm-modules/resource-group
  • terraform-ibm-modules/security-verify

認証情報も自動管理

Terraformが以下を自動生成:

  • サービス認証情報(Administrator権限)
  • 各種URL(ダッシュボード、OAuth、管理)
  • .envファイル

注意点

削除も簡単

./scripts/destroy.sh

API Client自動作成(追加機能)

IBM VerifyのREST APIを使うには、管理UIから手動でAPI Clientを作成する必要があります。この手動作業も自動化しました。

何が自動化されるのか

Playwrightが以下を自動実行:

  1. 管理UIにログイン
  2. Security → API accessに移動
  3. 新しいAPI Client作成(全権限付与)
  4. Client SecretをOCRで抽出
  5. .envに認証情報を自動追記

セットアップと実行

cd tests
npm install
npx playwright install chromium

.envに管理者認証情報を追加:

IBM_VERIFY_ADMIN_EMAIL=your-email@jp.ibm.com
IBM_VERIFY_ADMIN_PASSWORD=your-password

実行:

npm test

完了後、.envに自動追記されます:

IBM_VERIFY_API_CLIENT_ID=<client-id>
IBM_VERIFY_API_CLIENT_SECRET=<client-secret>

技術ポイント:OCR処理

Client Secretは「Show password」で表示しても、DOM操作でコピー不可能だったので、OCRで文字列抽出しました(Client IDはDOM操作でコピーできます)

工夫した点:

  • 1.5倍スケールのスクリーンショット(高解像度化)
  • Tesseract.jsで英数字+記号のみ認識
  • Sharp.jsで画像前処理(アップスケール、グレースケール、シャープ化)

OCR失敗時はMANUAL_ENTRY_REQUIREDとなるので、スクリーンショットから手動で記入してください。以下のURL画面から取れます https://ホスト名.verify.ibm.com/ui/admin/security/api-access

ブラウザ表示モード:

npm run test:headed

OCR単体テスト:

npm run test:ocr

なぜ自動化?

手動作業の課題:

  • API Client作成は管理UIからのみ可能

自動化のメリット:

  • 環境構築が完全自動化(インフラ→API認証情報まで)

HashiCorp Vault連携(セキュリティ強化版)

機密情報を.envterraform.tfvarsに平文で保存したくないので、シークレット管理ソフトウェアのHashiCorp Vaultと連携する版を用意しました。

管理される機密情報

以下3つの機密情報をVaultで一元管理:

  1. ibmcloud_api_key - IBM Cloud APIキー
  2. verify_admin_user - IBM Verify管理者ID
  3. verify_admin_pass - IBM Verify管理者パスワード

セットアップ(2ステップ)

1. Vault起動(Docker):

docker run --name vault-dev -d -p 8200:8200 \
  -e "VAULT_DEV_ROOT_TOKEN_ID=root" hashicorp/vault

2. 機密情報を初期化:

./scripts/vault_setup.sh  # Linux/Mac
# or
.\scripts\vault_setup.ps1  # Windows

対話形式で機密情報を入力すると、Vaultに安全に保存されます。

Vaultを使ったデプロイ

./scripts/update_env_vault.sh  # Linux/Mac
# or
.\scripts\update_env_vault.ps1  # Windows

このスクリプトが自動実行:

  1. Vaultからシークレットを取得
  2. Terraformでデプロイ(.tfvars不要)
  3. .envに管理者認証情報を書き込み(後述で利用)

セキュリティ上のメリット

項目 Vault無し Vault使用
機密情報の保存 平文ファイル 暗号化
Git誤コミット リスクあり リスクなし
監査ログ なし あり
機密情報のローテーション 手動 容易

手動操作

機密情報の確認:

vault kv get secret/ibm

機密情報の更新:

vault kv put secret/ibm \
  ibmcloud_api_key="new-key" \
  verify_admin_user="email@ibm.com" \
  verify_admin_pass="new-password"

詳細はリポジトリのREADMEをご覧ください。

https://github.com/simontokyo/terraform-ibmverify

cepe-jp

Discussion