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

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

こんにちは!

認証周りはアプリ開発で最も複雑化しやすいところなので、可能な限り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に関する開発のご相談はお気軽に問い合わせください。