AWSでWebサービスにCognitoの認証をつけてみる
開発中のWebサービスを公開したいけれど全世界には公開したくないとか、簡単な認証をつけたいがBasic認証は簡単すぎるとか、そもそもクローズドに作りたいとかある。そういう時Cognitoを使ったらいけるって話を見つけた。これを参考に自分でもやってみる。
構成
参考先と同じだが、下記のようにALBで認証を行い、EC2インスタンスへのアクセスを制限する。
やること
- アクセス先のEC2の作成
- Apache インストール
- 証明書の作成
- ALBの作成
- Route53でALBにルーティング
- Cognito User Pool 作成
- ALBのHTTPSリスナーに認証(Cognito)を追加
アクセス先のEC2を作成する
アクセス先がないと始まらない。EC2を起動しよう。
- インスタンスを起動
- Amazon Linux 2 AMI を選択(無料利用枠ならなんでもいいけど)
- t2.micro を選択
- インスタンス詳細設定
- ストレージはデフォルト
- タグは自由に(Nameタグくらいはつけてもいいかな)
- セキュリティグループはなければ作成
- ALBのセキュリティグループとEC2のセキュリティグループは先に作成しておいた方が良さそう。EC2のインバウンドはALBのみに制限するのが定石かな。SSHはマイIPで制限するのが良さそう。
- 確認して問題なさそうなら作成。
Apache インストール・起動
EC2が立ち上がったら、インスタンスの中に入って、Apacheをインストールする。
ssh -i <pemfile> ec2-user@<IP address> sudo yum update -y # package udpate sudo yum install httpd # Apache インストール sudo service httpd start # Apache 起動 systemctl status httpd # 状態確認
証明書の作成
※主題とは少し外れるけど。。
ACM(AWS Certificate Manager)で証明書を取得する。当然、ドメインを取得している必要がある。
ALBの作成
証明書が作成できたら、次はALBを作成する。HTTPS通信をするために、証明書が必要だった。
- EC2 > ロードバランサ から、「ロードバランサを作成」を選択
- 種類はApplication Load Balancer
- 名前は自由、スキームはインターネット向け、リスナーはHTTPS。
- VPCとアベイラビリティゾーン、サブネットは適切なものを
- アドオンサービスはいらない
- 次のセキュリティ設定の後世では、先ほど作成した証明書を選択
- セキュリティグループはALB用のものを選択(事前に作成しておく)
- 新規で作成する場合は、インバウンドはインターネットを、アウトバウンドはEC2のセキュリティグループに向けるといい
- ターゲットグループの設定はそのまま
- 先ほど作成した、インスタンスをターゲット登録
- 作成
Route53でALBにルーティング
ホストゾーンは作成ずみの前提。ホストゾーンを選択し、「レコードを作成」
Cognito UserPool の作成
ユーザープールの管理を選択。次のような画面が出てくるので、「ユーザープールを作成する」を押下。
ユーザープール名を適当に
エンドユーザーをどのようにサインインさせるか?
⇨ Eメールアドレスおよび電話番号 > Eメールアドレスを許可
次のポリシーは「管理者にのみユーザーの作成を許可する」の方を選択する
アプリクライアントまではデフォルト。
クライアントシークレットにチェックが入っていることを確認。認証フローのチェックボックスは外す。
トリガーはデフォルトで全部なしのまま。最後に「プールの作成」
アプリクライアントの設定
Cognito > アプリクライアントの設定にいく。
- 有効なIDプロバイダ > Cognito User Poolのチェック
- コールバックURL(OAuth2.0の知識が必要らしいが分かってない)
- 許可されているOAuthフロー > Authorization code grant
- 許可されているOAuth スコープ > openid
を設定したら、ドメイン名の選択に移動。Cognitoデフォルトを利用する。
ALBのリスナーに認証を追加
最後にALBのHTTPSリスナーに認証を追加する。
作成したALBを選択し、リスナー > 編集 を押下(画像は追加の方囲っちゃっているけど)
デフォルトアクションでアクションを追加し、Amazon Cognitoを選択、作成したユーザープールを指定する。
ここまでやれば、認証付きの画面が表示されるようになる。