AWSでWebサービスにCognitoの認証をつけてみる

開発中のWebサービスを公開したいけれど全世界には公開したくないとか、簡単な認証をつけたいがBasic認証は簡単すぎるとか、そもそもクローズドに作りたいとかある。そういう時Cognitoを使ったらいけるってを見つけた。これを参考に自分でもやってみる。

構成

参考先と同じだが、下記のようにALBで認証を行い、EC2インスタンスへのアクセスを制限する。

やること

  1. アクセス先のEC2の作成
  2. Apache インストール
  3. 証明書の作成
  4. ALBの作成
  5. Route53でALBにルーティング
  6. Cognito User Pool 作成
  7. ALBのHTTPSリスナーに認証(Cognito)を追加

アクセス先のEC2を作成する

アクセス先がないと始まらない。EC2を起動しよう。

  1. インスタンスを起動
  2. Amazon Linux 2 AMI を選択(無料利用枠ならなんでもいいけど)
  3. t2.micro を選択
  4. インスタンス詳細設定
    • インスタンス数1
    • VPC・サブネットは適切なものを
    • パブリックIPはALB経由なので不要(パブリックアクセスできるとそもそもALBで認証かける意味なくなる)
    • それ以外もデフォルトでよし
  5. ストレージはデフォルト
  6. タグは自由に(Nameタグくらいはつけてもいいかな)
  7. セキュリティグループはなければ作成
    • ALBのセキュリティグループとEC2のセキュリティグループは先に作成しておいた方が良さそう。EC2のインバウンドはALBのみに制限するのが定石かな。SSHはマイIPで制限するのが良さそう。
  8. 確認して問題なさそうなら作成。

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     # 状態確認

証明書の作成

※主題とは少し外れるけど。。

ACMAWS Certificate Manager)で証明書を取得する。当然、ドメインを取得している必要がある。

証明書は指示に従えば作成できる。

ALBの作成

証明書が作成できたら、次はALBを作成する。HTTPS通信をするために、証明書が必要だった。

  1. EC2 > ロードバランサ から、「ロードバランサを作成」を選択
  2. 種類はApplication Load Balancer
  3. 名前は自由、スキームはインターネット向け、リスナーはHTTPS
  4. VPCアベイラビリティゾーン、サブネットは適切なものを
  5. アドオンサービスはいらない
  6. 次のセキュリティ設定の後世では、先ほど作成した証明書を選択
  7. セキュリティグループはALB用のものを選択(事前に作成しておく)
    • 新規で作成する場合は、インバウンドはインターネットを、アウトバウンドはEC2のセキュリティグループに向けるといい
  8. ターゲットグループの設定はそのまま
  9. 先ほど作成した、インスタンスをターゲット登録
  10. 作成

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を選択、作成したユーザープールを指定する。

ここまでやれば、認証付きの画面が表示されるようになる。

参考