ユーザ認証機能を提供するAmazon CognitoのAPIでアクセスした時にタイムアウトになり詰まった体験談
本記事は、Amazon Cognitoを使用した際に詰まったことを自分自身の備忘録、またはこれからAmazon Cognitoで使用する方向けに参考になればと思い記載しています。
Amazon Cognitoとは
APIベースで実装されるモバイルアプリやWebアプリにユーザ認証機能を提供するサービス。
ユーザプール
独自のユーザディレクトリに加え、外部IDプロバイダでのログインに基づき、アプリへのアクセスに利用できるトークン(JWT)を提供する。
外部IDプロバイダとして、Facebook, Google, Amazon, Apple, SAML, OpenID Connectが可能である。
Amazon Cognito ユーザプールについて
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools.htmlIDプール
Cognitoユーザプールに加え、外部IDプロバイダでのログインに基づき、AWSのサービスにアクセスできるクレデンシャルを提供する。
Amazon Cognito IDプールについて
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-identity.html
Amazon Cognito APIで詰まった事象&原因
詰まった事象については、VPC内に配置しているAmazon Cognito APIをコールするLambda関数からCognitoのユーザプールにアクセスできず、Lambdaのタイムアウトが発生しました。
本事象の原因については、Cognitoのエンドポイントにはインターネットを経由した通信が必要であり、当Lambda関数はインターネットに接続ができないことが原因でした。
事象の解決方法
VPC内のLambda関数からCognitoへアクセスする方法は、NATゲートウェイを作成し、NATを経由してLambda関数がインターネットに接続できる状態にすることです。
具体的なLambda関数にインターネットアクセスを許可する設定方法については下記の記事を参考にしてください。
https://repost.aws/ja/knowledge-center/internet-access-lambda-function
最後に
今まではVPCのLambda関数からVPC外のAWSサービスにアクセスする場合、VPCエンドポイントを設定すれば、アクセスできていたものの、Cognito自体にVPCエンドポイントが対応していないため、かなり詰まってしまいました。
AWS PrivateLink と統合できる AWS のサービス
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/integrated-services-vpce-list.html