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 사용자 풀 외에도 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 역할을 가져온 다음 역할을 가정합니다.

참고: 이 코드 조각을 실행하려면 Amazon CloudWatch Logs에 액세스하고 assume_role 명령을 실행할 수 있는 Lambda IAM 역할이 있어야 합니다.

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 역할이 포함될 수 있습니다. 사용자가 둘 이상의 그룹에 속하는 경우 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 Gateway Lambda 권한 부여자를 사용하여 API에 대한 액세스 권한을 부여하는 경우 권한 부여자에 의해 유효성이 검증된 사용자 풀 토큰을 사용해야 합니다. 토큰의 역할을 가정하기 전에 토큰의 유효성을 검사해야 합니다.