Amazon Cognito 사용자 풀 그룹의 실행 역할을 사용하여 API Gateway REST API 사용자가 Lambda를 실행할 수 있게 하려면 어떻게 해야 합니까?
최종 업데이트 날짜: 2021년 10월 7일
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를 실행할 사용자를 설정하기 전에 다음을 설정해야 합니다.
- 연결된 IAM 역할이 있는 Amazon Cognito 사용자 풀 및 사용자 풀 그룹
- Amazon Cognito 사용자 인증을 사용하는 클라이언트 애플리케이션
- Lambda 프록시 통합을 사용하는 API Gateway REST API
- AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.
사용자가 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 명령을 실행할 수 있는 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 역할이 포함될 수 있습니다. 사용자가 둘 이상의 그룹에 속하는 경우 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 Gateway Lambda 권한 부여자를 사용하여 API에 대한 액세스 권한을 부여하는 경우 권한 부여자에 의해 유효성이 검증된 사용자 풀 토큰을 사용해야 합니다. 토큰의 역할을 가정하기 전에 토큰의 유효성을 검사해야 합니다.