Amazon Cognito ユーザープールグループの実行ロールを使用して API Gateway REST API ユーザーに Lambda の実行を可能にするにはどうしたらよいですか?

最終更新日: 2020 年 8 月 31 日

AWS Lambda プロキシ統合の Amazon API Gateway REST API に Amazon Cognito ユーザープール認証があります。API ユーザーが、デフォルトの Lambda 実行ロールを使用する代わりに、ユーザープールグループに関連付けられた AWS Identity and Access Management (IAM) ロールを使用して Lambda 関数を実行することを許可する方法を教えてください。

解決方法

注意:Amazon Cognito ユーザープールに加えて、API へのアクセスを承認するように ID プールを設定することもできます。詳細については、ロールベースのアクセス制御を参照してください。

Amazon Cognito ロールを使用して Lambda を実行するようにユーザーを設定する前に、次の設定を必ず行ってください。

ユーザーが自身の Amazon Cognito アクセス許可で Lambda を実行可能にするには、次の手順に従います。

  1. API Gateway コンソールを使用して、Amazon Cognito ユーザープールを承認者として確立します。次に、Amazon Cognito ユーザープールを API のメソッドの承認者として割り当てます。手順については、REST API と Amazon Cognito ユーザープールを統合するを参照してください。
  2. AWS Lambda コンソールを開きます。
  3. API のプロキシリソースとして設定された Lambda 関数を選択してください。
  4. Lambda 関数を編集し、次のコードスニペットを追加します。このコードスニペットは、イベントの詳細から Amazon Cognito ロールを取得し、ロールを引き受けます。

注意: このコードスニペットを実行するには、Lambda IAM ロールで Amazon CloudWatch Logs にアクセスして assume_role コマンドを実行可能にする必要があります。

import boto3
client = boto3.client('sts')
def lambda_handler(event, context):
    role=event['requestContext']['authorizer']['claims']['cognito:roles']
    response = client.assume_role(
        RoleArn=role,
        RoleSessionName='APIrole'
    )
    print(response)
    response2api = {"statusCode": 200,"headers": { },"body": "Success"}
    return response2api

ユーザーは複数の Amazon Cognito ユーザープールグループに属することができ、各グループは異なる IAM ロールを持つことができます。ユーザーが 2 つ以上のグループに属している場合、cognito:roles クレームがロールのリストを返します。ユーザーの ID トークン内の cognito:preferred_role クレームは、最も低い優先順位値を持つグループの IAM ロールを継承します。cognito:preferred_role を取得するには、次のコードスニペットを使用してください。

role = event['requestContext']['authorizer']['claims']['cognito:preferred_role']

ユーザーが自身の Amazon Cognito ロールで Lambda を実行できることを確認するには、次の手順に従います。

  1. クライアントアプリケーションを開き、Amazon Cognito ユーザープールのユーザーとしてログインします。
  2. ログイン後、受け取った ID トークンを使用して API を呼び出します。
  3. Amazon Cognito ユーザープールロールで定義されるものと同じリソースにアクセスできることを確認してください。
  4. 必要に応じて、CloudWatch Logs を確認し assume_role コマンドが成功したことを確認します。

注意: API へのアクセスを許可するためにユーザープール承認者に代わって API Gateway の Lambda 承認者を使用する場合は、承認者によって検証されたユーザープールトークンを必ず使用してください。トークンの役割を引き受ける前に、トークンを検証する必要があります。