なぜ高度な認可システムが必要なのか
金融のような規制の厳しい業界における大規模アプリケーションでは、「誰が」「何を」「どのような条件で」実行できるかを極めて細かく制御する必要があります。単純なロールベースアクセス制御(RBAC)では、ユーザーロール、取引金額、地理的位置、組織階層、テナント所属といった多様な属性(コンテキスト)を動的に評価するポリシーの実装が困難です。Converaは自社開発ではなく、Amazon Verified Permissionsを選択することでこの複雑さに対応しました。この判断の背景には、ポリシー管理、リアルタイム認可評価、ロギング、監査を一貫して構築・維持するエンジニアリング負担を軽減し、コアビジネスに集中したいという戦略がありました。
Cedarポリシー言語の柔軟性と、Amazon CognitoやAPI GatewayなどのAWSサービスとの直接的な連携が、中央集権型認可レイヤーの基盤として最適であると判断したのです。

コアアーキテクチャパターン:ユーザーアクセス制御
Converaが構築したアーキテクチャの核心は、API Gateway、Lambdaオーソライザー、Verified Permissionsの組み合わせです。ユーザー認証はAmazon Cognitoが担当し、認可判断はVerified PermissionsがCedarポリシーを評価して決定します。
主要なデータフロー:
- ユーザーがクライアントアプリでログインすると、Cognitoが認証を処理します。
- Cognitoの「Pre Token Generation」Lambdaフックが、RDSなどからユーザーロール/属性を取得し、JWTトークンに注入します。
- クライアントがこのトークンを含めてAPIを呼び出すと、API Gatewayがリクエストをインターセプトします。
- Lambdaオーソライザーがトークンを検証し、ユーザー情報とリクエストコンテキストをVerified Permissionsに渡します。
- Verified Permissionsは、該当するポリシーストアのCedarポリシーを評価し、
AllowまたはDenyの決定を下します。 - この決定はIAMポリシーの形でAPI Gatewayに返され、許可されたリクエストのみがバックエンドサービスに渡されます。
パフォーマンス最適化戦略: Converaは、ミリ秒未満のレイテンシーを保証するため、2段階のキャッシングを採用しました。第一に、API Gateway組み込みの認可結果キャッシュ。第二に、アプリケーションレベルのCognitoトークンキャッシュです。これにより、秒間数千件の認可リクエストを処理しながら、運用コストを削減することができました。

発展的な適用:サービス間通信とマルチテナンシー
サービス間(M2M)通信のセキュリティ
同じ認可アーキテクチャを、サービス間通信にも拡張適用しました。各マイクロサービスは、Cognitoの機械間(M2M)ユーザープールにクライアントとして登録され、サービス識別子、許可された操作、レート制限などが定義されたポリシーを持ちます。サービスは、ユーザー資格情報の代わりにクライアント資格情報でトークンを発行し、APIを呼び出します。Lambdaオーソライザーはトークンからサービスコンテキストを抽出してVerified Permissionsに渡し、「サービスAはリソースRに対してアクションXを実行できるか?」を評価します。
マルチテナントアクセス制御
SaaS形態でサービスを提供する際、最も難しい要件の一つがテナント間のデータ分離です。Converaは テナントごとのポリシーストア(Per-tenant Policy Store) 方式を採用しました。
| 方式 | メリット | Converaが選択した理由 |
|---|---|---|
| テナントごとのポリシーストア | ポリシーの分離が容易、テナントごとのスキーマ/テンプレートカスタマイズ可能、テナントのオンボーディング/オフボーディング管理が容易、テナントごとのリソース割り当て管理可能 | 各テナントのポリシーを完全に分離してセキュリティ要件を満たし、テナントごとのリソース割り当て管理が可能 |
| 単一ストア内でのポリシー分割 | 管理ポイントが単一、初期構成が簡単 | 初期複雑度は低いが、大規模なテナント数ではポリシー管理とパフォーマンス最適化が難しくなる可能性あり |
実装フローは、ユーザートークンに tenant_id 属性を注入し、Lambdaオーソライザーがこの tenant_id で該当テナントのポリシーストアIDを検索した後、Verified Permissionsの評価をリクエストします。バックエンドサービスはリクエストヘッダーの tenant_id を検証してゼロトラスト原則を適用し、データベースクエリ時にこのコンテキストをフィルタとして使用します。
この技術の限界または注意点:
- コスト: テナントごとのポリシーストア方式では、テナント数に比例して管理コストが増加する可能性があります。小規模テナントや初期段階では、単一ストア内でポリシーを分割する方式も検討に値します。
- ベンダーロックイン: このアーキテクチャはAWSエコシステムに深く依存しています。他クラウドへの移行やハイブリッド環境構成には追加作業が必要です。
- 学習曲線: Cedarポリシー言語とVerified Permissionsの概念に習熟する時間が必要です。

まとめと次の学習ステップ
Converaのケーススタディは、複雑なエンタープライズ環境において、認可をアプリケーションロジックから分離し、宣言的なポリシーと中央集権的な評価エンジンによって、セキュリティ、保守性、拡張性を同時に確保した優れたパターンを示しています。Verified PermissionsとCedarは、単純な許可/拒否を超えた属性ベースアクセス制御(ABAC)の強力さを実証しています。
実装における実践的アドバイス:
- 段階的な導入: 既存システムを一括して移行するのではなく、新しいマイクロサービスや重要度の低いAPIから導入し、経験を積むことをお勧めします。
- ポリシーをコードとして扱う: CedarポリシーもGitによるバージョン管理を行いましょう。Verified Permissionsが提供するポリシーシミュレーションテスト機能を活用して、認可ロジックの単体テストを作成できます。
- 監査ログの活用: Verified Permissionsのすべての判断はAWS CloudTrailにログ記録されます。これをセキュリティ監査、コンプライアンス報告、問題分析に体系的に活用できます。
推奨する学習の方向性:
- 公式ドキュメント: Amazon Verified Permissions ユーザーガイドで、Cedarの文法と高度なパターンを学びましょう。
- ハンズオンワークショップ: AWSが提供する Verified Permissions ワークショップを実際に構築してみることが、概念理解に最も役立ちます。
- 関連サービスの探求: Amazon Cognitoの詳細な機能(Pre/Post Token Generationフック)とAPI GatewayのLambdaオーソライザーの最適化方法を合わせて学ぶことで、より堅牢なアーキテクチャを設計できます。
この分析の詳細な根拠資料は、AWS Architecture BlogのConveraケーススタディでご確認いただけます。