システム構成のイメージはそれほど珍しいものではないとは思ったのですが、
構築するのにひと工夫必要だったため備忘録的にまとめました。
システム構成
システムの利用者をAmazon Cognitoで管理しており、
API Gatewayはリクエストヘッダーに付与されたトークン(Cognitoの認証で得られたもの)を
検証するように設定しています。
これによってシステムの利用者でない者からのリクエストを制限しています。
API Gateway上での本番/開発環境の切り分けは同一ステージ機能で行なっています。
(別APIにするとリソースの管理がバラバラになるため)
やろうとした事
Cognitoにトリガーを設定してログイン認証後の処理を実装することになったのですが、
本番/開発で同一のユーザープールであると動作検証がやりづらいという事をきっかけに、
開発用のユーザープールを新たに作成し、分けてユーザーを管理することにしました。
(最初からやっとけって話ですが)
ぶつかった壁
AWSのマネジメントコンソール上からAPI Gatewayのオーソライザーに対して
リクエスト検証に使うCognioユーザープールを設定しようとしたところ、
なんと!1つしか設定できないようです。。
解決方法
このままではAPIを分けるしかないのですが、それはまた面倒なので諦めずに何か方法がないか調べていると、
AWS CLIのオーソライザー作成コマンド create-authorizer
のオプションでは複数のユーザープールを指定できる事が判明しました。
--provider-arns (list)
コマンド実行例
aws apigateway create-authorizer \
--rest-api-id {API GatewayのAPI ID} \
--name {オーソライザーの名前} \
--type COGNITO_USER_POOLS \
--provider-arns {Cognito UserPoolのARN} {Cognito UserPoolのARN} \
--identity-source method.request.header.Authorization
provider-arnのフォーマットは以下のとおりで、空白区切りで入力します。
arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}
コマンドを実行しマネジメントコンソールを見ると指定したUserPoolが設定できていることが確認でき、
ユーザープールを分けることに成功しました。
マネジメントコンソール上からできないからと諦めるケースはありがちですが、
CLIだと実現できる可能性はあるのでリファレンスは一見の価値ありです!