# ステージCDK

## デプロイ手順

### 前提条件

- アカウントCDKがデプロイ済みであること（通常は対応済み。[アカウントCDK](/infra/account/README.md)を参照）

### Context 編集

[context.ts](/infra/stage/lib/context.ts)にステージ毎の設定を記述

※ 未定義のステージ名は`dev` の設定へ自動でフォールバックするため、個人ステージ用の設定は追記不要

#### パラメータ

| パラメータ                 | 説明                                     |
| -------------------------- | ---------------------------------------- |
| **domainProps**            |                                          |
| enableSubDomain            | サブドメインの有効化                     |
| **networkProps**           |                                          |
| natGatewayNum              | NAT Gatewayの数                          |
| maxAzs                     | 最大AZ数                                 |
| **authProps**              |                                          |
| enableUserPoolCustomDomain | Cognito UserPoolのカスタムドメイン有効化 |
| applicationLogLevel        | アプリケーションのログレベル             |
| sesFromEmail               | SES の送信元メールアドレス               |
| **dbProps**                |                                          |
| minAcuCapacity             | Aurora Serverless v2の最小ACU            |
| maxAcuCapacity             | Aurora Serverless v2の最大ACU            |
| **apiProps**               |                                          |
| allowedApiCallOriginList   | API呼び出し許可オリジンリスト            |
| lambdaIntegrationTimeout   | Lambda統合のタイムアウト（秒）           |
| enableSnapStart            | スナップスタートの有効化                 |
| enableMonitoring           | モニタリングの有効化                     |
| enableContractEventAlert   | 契約イベント通知の有効化                 |
| applicationLogLevel        | アプリケーションのログレベル             |
| **backupProps**            |                                          |
| backupRetentionDays        | バックアップ保持期間                     |
| **frontendProps**          |                                          |
| enableAccessLog            | アクセスログの有効化                     |
| logRetentionDays           | アクセスログの保持期間                   |

### デプロイ

#### 注意: Lambdaアーキテクチャについて

デプロイ時のLambdaアーキテクチャ（arm64 / x86_64）は、ビルド環境のCPUアーキテクチャに基づいて自動決定される。（[utils.ts](/infra/stage/lib/utils.ts)）

各デプロイ方法とアーキテクチャの対応:

- [テンプレート](../init/stage-deployer.template.yml)ベースのdeployer: arm64
- ローカルデプロイ
  - Apple Silicon（M1/M2/M3/M4）搭載Mac: arm64
  - Intel/AMD搭載のWindows + WSL: x86_64

同一ステージに対して前回と異なるアーキテクチャの環境からデプロイすると、Construct IDやLambda関数名が変わりCloudFormation上でリソースの置換が発生するため、Lambda関数が動作しなくなる場合がある。

#### ローカルからデプロイ

```bash
cd infra/stage
npm i

# アカウント・リージョンでの初回デプロイ時のみ
npx cdk bootstrap -c stage=okada

# 個人環境（e.g. okada）へのデプロイ
npx cdk deploy --all --require-approval never -c stage=okada

# 差分確認
npx cdk diff --all --require-approval never -c stage=okada

# 特定のスタックのみデプロイ（例: ClientApiStack）
npx cdk deploy ClientApiStack --require-approval never -c stage=okada

# すべてのスタックを削除
npx cdk destroy --all -c stage=okada
```

#### CodeBuildでデプロイ

1. [テンプレート](../init/stage-deployer.template.yml)からスタックを作成

   ```text
   スタック名: ${STAGE}-deployer-stack
   パラメータ
     - Branch: デプロイするGitブランチ 例: main
     - Stage: デプロイ対象のステージ 例: dev
   ```

2. CodeBuild `${STAGE}-deployer` を実行

3. ※次回以降は変更があるとCodeBuildが自動実行される

   自動実行される変更
   - 本番環境のみ： GitHub Releaseのパブリッシュ
   - 本番環境以外： 指定ブランチのコードの変更

## 運用ジョブ

運用ジョブとして以下のCodebuildプロジェクトが存在する

| プロジェクト名                       | 用途                         | タイミング                                                  | 手順　                                                      |
| ------------------------------------ | ---------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
| `${STAGE}-migration-postgres-runner` | データベースマイグレーション | 必要に応じて                                                | [手順](/infra/stage/README.md#マイグレーション)             |
| `${STAGE}-fixture-postgres-runner`   | テストデータ投入             | 必要に応じて                                                | [手順](/infra/stage/README.md#データ投入)                   |
| `${STAGE}-tenant-creator`            | テナント作成                 | COMPANY AI契約時                                            | [手順](/infra/stage/README.md#テナント作成)                 |
| `${STAGE}-client-tenant-creator`     | クライアントテナント作成     | COMPANY AI契約時/CTM2.0で同じ顧客が別のテナントを作成する時 | [手順](/infra/stage/README.md#クライアントテナント作成)     |
| `${STAGE}-client-creator`            | クライアント作成             | 生成AI機能を有するCTM及びマイクロサービスが環境を作成する時 | [手順](/infra/stage/README.md#クライアント作成)             |
| `${STAGE}-client-api-key-creator`    | APIキー作成                  | 既存のクライアントがAPIキーをローテーションする時           | [手順](/infra/stage/README.md#クライアントapiキー作成)      |
| `${STAGE}-contract-provider-creator` | コントラクトプロバイダー作成 | 外部連携先が新規追加される時                                | [手順](/infra/stage/README.md#コントラクトプロバイダー作成) |
| `${STAGE}-management-console-initializer` | 管理コンソールの初期化       | テナント/ユーザーの初期セットアップを行う時                 | [手順](/infra/stage/README.md#管理コンソール初期化)         |
| `${STAGE}-prices-collector`          | 価格情報の収集               | デプロイ時に自動実行                                        | [手順](/infra/stage/README.md#価格情報収集)                 |
| `${STAGE}-quota-allocation-status-updater` | クォータ割り当てステータス更新 | 毎日 0:00 (JST) に自動実行                                | [手順](/infra/stage/README.md#クォータ割り当てステータス更新) |

## マイグレーション

CodeBuild `$STAGE-migration-postgres-runner` を実行

### パラメータ（環境変数）

#### MODE

#### REVISION

[マイグレーション](/database/README.md#migration)を参照

## データ投入

CodeBuild `$STAGE-fixture-postgres-runner` を実行

### パラメータ（環境変数）

#### CSV_DIR

[フィクスチャー](/database/README.md#fixture)を参照

## テナント作成

CodeBuild `${STAGE}-tenant-creator` を実行

### パラメータ（環境変数）

#### LEGAL_NAME

テナントの法人名（例: `株式会社WHI`）

#### NAME

テナント名

※ 省略可

#### WHI_CUSTOMER_IDS

WHIのSFDCの取引先ID（カンマ区切りで複数指定可）

※ 存在しなければ不要

#### CYDAS_CUSTOMER_IDS

CYDASのSFDCの取引先ID（カンマ区切りで複数指定可）

※ 存在しなければ不要

## クライアントテナント作成

CodeBuild `${STAGE}-client-tenant-creator` を実行

### パラメータ（環境変数）

#### TENANT_ID

対象テナントID

#### NAME

クライアントテナント名（例: `bizmatch`）

## クライアント及びクライアントAPIキー作成

CodeBuild `${STAGE}-client-creator` を実行

### パラメータ（環境変数）

#### CLIENT_NAME

クライアント名（例: `bizmatch`）

#### CLIENT_STAGE

クライアントのステージ（例: `prod`）

## クライアントAPIキー作成

CodeBuild `${STAGE}-client-api-key-creator` を実行

### パラメータ（環境変数）

#### CLIENT_ID

対象クライアントID

#### CLIENT_NAME

クライアント名（例: `bizmatch`）

#### CLIENT_STAGE

クライアントのステージ（例: `prod`）

## コントラクトプロバイダー作成

CodeBuild `${STAGE}-contract-provider-creator` を実行

### パラメータ（環境変数）

#### NAME

コントラクトプロバイダー名（例: `whi_sfdc`）

※ 2026/05　時点では 'whi_sfdc' or 'cydas_sfdc' のみ指定可能。

## 管理コンソール初期化

CodeBuild `${STAGE}-management-console-initializer` を実行

### パラメータ（環境変数）

#### TENANT_NAME

初期化対象のテナント名

#### USER_EMAILS

初期作成するユーザーのメールアドレス（カンマ区切りで複数指定可）

※ 原則2名以上指定する

#### WHI_CUSTOMER_IDS

WHIのSFDCの取引先ID（カンマ区切りで複数指定可）

※ 存在しなければ不要

#### CYDAS_CUSTOMER_IDS

CYDASのSFDCの取引先ID（カンマ区切りで複数指定可）

※ 存在しなければ不要

## 価格情報収集

CodeBuild `${STAGE}-prices-collector` を実行

デプロイ時に自動実行されるため、通常は手動実行不要。

## クォータ割り当てステータス更新

CodeBuild `${STAGE}-quota-allocation-status-updater` を実行

毎日 0:00 (JST) にスケジュール実行されるため、通常は手動実行不要。
