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 を実行するようにユーザーを設定する前に、次の設定を必ず行ってください。
- 関連付けられた IAM ロールを持つ Amazon Cognito ユーザープールおよびユーザープールグループ
- Amazon Cognito ユーザー認証を使用したクライアントアプリケーション
- Lambda プロキシ統合を使用した API Gateway REST API
ユーザーが自身の Amazon Cognito アクセス許可で Lambda を実行可能にするには、次の手順に従います。
- API Gateway コンソールを使用して、Amazon Cognito ユーザープールを承認者として確立します。次に、Amazon Cognito ユーザープールを API のメソッドの承認者として割り当てます。手順については、REST API と Amazon Cognito ユーザープールを統合するを参照してください。
- AWS Lambda コンソールを開きます。
- API のプロキシリソースとして設定された Lambda 関数を選択してください。
- 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 を実行できることを確認するには、次の手順に従います。
- クライアントアプリケーションを開き、Amazon Cognito ユーザープールのユーザーとしてログインします。
- ログイン後に受け取った ID トークンを使用して API を呼び出します。
注: 返されたトークンの id_token 値を使用してください。 - Amazon Cognito ユーザープールのロールで定義したリソースと同じリソースにアクセスできることを確認します。
- 必要に応じて、CloudWatch Logs を確認し assume_role コマンドが成功したことを確認します。
注意: API へのアクセスを許可するためにユーザープール承認者に代わって API Gateway の Lambda 承認者を使用する場合は、承認者によって検証されたユーザープールトークンを必ず使用してください。トークンの役割を引き受ける前に、トークンを検証する必要があります。