Cognitoユーザープールグループの扱い方・IAMロールについてを解説します😎

Cognitoユーザープールグループの扱い方・IAMロールについてを解説します😎

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!

認証周りはアプリ開発で最も複雑化しやすいところなので、可能な限り AWS にお任せしたいところですよね。

AWS のマネージド認証サービスといえば「Cognito」ですが、「ユーザープールは使ったことあるけど、ユーザープールグループは使ったことない」なんて方が多いのではないでしょうか?

本記事では、ユーザープールグループの扱い方、IAM ロールの指定について解説したいと思います!

想定する読者

  • Cognito ユーザープールを使った事があるヒト
  • Cognito ユーザープールグループの利用に興味があるヒト
  • Cognito ユーザープールグループに指定する IAM ロールの扱い方が分からないヒト

はじめに

Cognito ユーザープールと ID プールの違い

Cognito ユーザープールは認証を扱うサービスで、ID プールは認可を扱うサービスです。それぞれのユースケースは下記となります。

Cognitoユースケース
ユーザープールAppSync、API Gatewayの呼び出しを認証ユーザーのみに制限
IDプールAWSの各種サービスへ厳格なアクセス制御を制限

実施のユースケースで言うと

  • フロントエンドから AWS SDK でバシバシ AWS サービスを呼び出すような構築を行う場合は ID プールによる認可トークンが有効
  • AppSync, API Gateway の呼び出しに認証制限をかけたい場合はユーザープールによる認証制限が有効

となります。

私たちの経験上ですが、ID プールトークンによる認可の方が少し開発が複雑になるような印象があります。(各種リソースごとに、誰に、どのようなアクションを許可するのか設計する必要があります)

AppSync→Lambda、あるいは API Gateway→Lambda によるリソースアクセスで十分であれば、ID プールを利用せずLambda に対しての IAM 付与だけで構築をすることを推奨します。(認証系は最も複雑化しやすく開発者が疲弊しやすいのでシンプルにしておいた方が良いですね)

ユーザープールグループで具体的に実現できること

わたし達は AppSync と Cognito ユーザープール連携させて利用することが多いですね。

AppSync にリクエストする際に JWT トークンをのせてあげれば、AppSync がヘッダーからクレデンシャルを取り出し中身を解析しユーザーグループを取得、アクセス制限を行ってくれます。

クレデンシャルを取得し連携するケースについては、次セクション「ユーザープールに指定する IAM ロールの扱いについて」で解説したいと思います。

Cognito ユーザープールグループが登場する以前は全ユーザー固定ロールでした

Cognito ユーザープールがリリースされる2016年までは、「認証=固定ロール」でしか設定できませんでした。わかりやすく言うと、管理者とコンシューマーでアクセス可能な AWS リソースを変更ができなかったということです。(同じロールが付与されてしまう)

2016年に Cognito ユーザープールグループがリリースされてからは、認証ユーザーにグループ情報を付与し、付与するロールの変更することが可能となりました。

より認可の仕組みを強力にサポートしてくれる仕組みですね。ただ注意点としては、ユーザーグループはネストできないということです。尚、複数ロールが付与されているユーザーにはグループ優先度を設定し、適用させるロールを決定することが可能です。

ユーザープールに指定する IAM ロールの扱いについて

事前にユーザープールグループと ID プールと連携させておく(ID プールのプロバイダーに Cognito を指定しておく)ことで、ユーザープールグループに指定した IAM ロールに対応するクレデンシャル(STS)を、ID プールに発行させることが可能です。

つまり、ユーザープールグループ単体での IAM ロールは意味を持たないということです。

ID プールで STS トークンを発行させる方法を解説

ID プールから STS トークンを発行させる場合は、まず ID プールに sts:AssumeRoleWithWebIdentity を行います。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-xxxx-xxxx-xxxx"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

次に、ID プールの認証プロバイダーへ Cognito を登録します。「トークンからロールを決定する」を選択しておくことで、ユーザープールグループへ指定したロールの STG が返却されるようになります。

IDプール設定画面

これで準備は完了です。

あとはユーザープールトークンと ID プールトークンを交換し、STS を受け取りましょう。

まとめ

IAM と聞くと苦手意識ある方が多いと思いますが、AWS を扱う上で必ず理解しておかないといけないサービスの1つです。

IAM と仲良くなることでより堅牢で安全な AWS 運用を行うことが可能になります。

Cognito、IAMに関する開発のご相談はお気軽に問い合わせください。