AWS Lambda プロキシ統合を使用した Amazon API ゲートウェイ REST API に Amazon Cognito ユーザープール認証があります。ユーザーが、ユーザープールグループの AWS Identity and Access Management (IAM) ロールを使用して、Lambda 関数の実行することを許可する方法を教えてください。
解決策
注:Amazon Cognito ユーザープールの他にも、ID プールを API へのアクセスを許可する設定が可能です。詳細については、「ロールベースアクセスコントロール」を参照してください。
ユーザーの 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 ログにアクセスするためのアクセス権限が必要です。また、このロールには、assume_role コマンドを実行するための AssumeRole API コールも必要です。
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 を呼び出します。
**注: **返されたトークンの id\ _token 値を必ず使用してください。
3. Amazon Cognito ユーザープールロールに定義されているものと同じリソースにアクセスできることを確認します。
4. オプションで、CloudWatch ログをチェックして、assume_role コマンドが成功したことを確認します。
**注: **API Gateway Lambda オーソライザーを使用して API へのアクセスを認証する場合は、オーソライザーによって検証されたユーザープールトークンを使用してください。トークンのロールを引き受ける前に、トークンを検証する必要があります。
関連情報
Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する
Lambda 統合で API Gateway REST API を構築する
AWS Lambda 実行ロール