AWS CDK - привяжите пул пользователей Cognito к API Gateway

Я пытаюсь создать довольно простую инфраструктуру с помощью AWS CDK, состоящую из

  • Пул пользователей Cognito
  • Лямбда
  • Авторизатор
  • API GW с корневым и дополнительным путем и несколькими методами
  • Путь, который должен использовать пул пользователей Cognito в качестве авторизатора

Проблема: я не знаю, как правильно создать Authorizer, чтобы он принимался API GW

Синтез шаблона CF работает нормально, но во время развертывания я получаю следующую ошибку:

Invalid authorizer ID specified. Setting the authorization type to CUSTOM or COGNITO_USER_POOLS requires a valid authorizer.

Итак, похоже, что мой авторизатор недостаточно подходит, даже если создание самого авторизатора помечено как успешное во время развертывания.

Любые идеи?

Вот что у меня в коде:

from aws_cdk import (
    core,
    aws_lambda,
    aws_apigateway,
    aws_cognito
)


class PlayGroundStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Basic lamdba setup
        my_lambda = aws_lambda.Function(
            scope=self,
            id="lambda-1",
            runtime=aws_lambda.Runtime.PYTHON_3_6,
            code=aws_lambda.Code.asset('lambda'),
            handler='hello.handler'
        )

        # Few MethodOptions for the API GW
        my_get_operation = aws_apigateway.MethodOptions(operation_name="GET")
        my_post_operation = aws_apigateway.MethodOptions(operation_name="POST")

        # The API itself
        rest_api = aws_apigateway.LambdaRestApi(
            scope=self,
            id="rest-api-1",
            handler=my_lambda,
            proxy=False,
            default_method_options=my_get_operation
        )

        # User Pool used for auth
        api_userpool = aws_cognito.UserPool(
            scope=self,
            id="user-pool-1",
            sign_in_type=aws_cognito.SignInType.EMAIL
        )

        # The authorizer that should be attached to API GW
        my_cfn_authorizer = aws_apigateway.CfnAuthorizer(
            id='api_authorizer_cfn',
            rest_api_id=rest_api.rest_api_id,
            name='api_authorizer_cfn_name',
            scope=self,
            type='COGNITO_USER_POOLS',
            identity_source='method.request.header.Authorization',
            provider_arns=[api_userpool.user_pool_arn]
        )

        # Set methods for root node
        rest_api.root.add_method(my_get_operation.operation_name)
        rest_api.root.add_method(my_post_operation.operation_name)

        # Create a resource
        my_resource = rest_api.root.add_resource("my_sub_url")
        # And attach the Authorizer
        # This is where I get the error
        my_resource.add_method(http_method="GET",
                               authorization_type=aws_apigateway.AuthorizationType.COGNITO,
                               authorizer=my_cfn_authorizer)

person ximarin    schedule 26.12.2019    source источник


Ответы (2)


Я понял. Вам нужно установить

authorization_type = my_cfn_authorizer.auth_type

и это все исправляет. Было бы намного лучше, если бы они могли просто сказать нам сделать это в документации, но документации на Python мало.


class PlayGroundStack(core.Stack):

        ...

        # The authorizer that should be attached to API GW
        my_cfn_authorizer = aws_apigateway.CfnAuthorizer(
            id='api_authorizer_cfn',
            rest_api_id=rest_api.rest_api_id,
            name='api_authorizer_cfn_name',
            scope=self,
            type='COGNITO_USER_POOLS',
            identity_source='method.request.header.Authorization',
            provider_arns=[api_userpool.user_pool_arn]
        )

        # Set methods for root node
        rest_api.root.add_method(my_get_operation.operation_name)
        rest_api.root.add_method(my_post_operation.operation_name)

        my_resource = rest_api.root.add_resource("my_sub_url")
        # FIX HERE!!!!!!!
        my_resource.add_method(http_method="GET",
                               authorization_type=my_cfn_authorizer.auth_type, 
                               authorizer=my_cfn_authorizer)
person MoneyBall    schedule 02.01.2021

вы не можете использовать строковый литерал для поля идентификатора. Логический идентификатор, который вы предоставляете для каждого ресурса, объединяется с хешем во время выполнения. Другими словами, ID, который вы видите, и ID, который вы получаете, не совпадают. Подробнее здесь

Вы должны использовать getter api для получения идентификатора вашего ресурса. Например rest_api.rest_api_id ()

cdk документация

person EchoSysBen    schedule 16.01.2020