Как интегрировать AWS Lambda со службой Fargate с балансировкой нагрузки приложений

Я пытаюсь защитить конечную точку (например, /protected) в моем API, размещенном в службе Fargate с балансировкой нагрузки приложения (ALB), с помощью функции JWTAuthorizer Lambda.

Но я не смог найти хороший пример, показывающий, как я могу это сделать. До сих пор я пробовал:

private createContainerCopilotService() {

    const cluster = new ecs.Cluster(this.stack, 'Cluster', {
        vpc: this.stack.resources.external.vpc,
        clusterName: `${this.config.getStackName()}-Cluster`,
        containerInsights: true,
    });


    const loadBalancedFargateService = new ecsPatterns.ApplicationLoadBalancedFargateService(this.stack, 'LoadBalancedService', {
        cluster,
        memoryLimitMiB: 1024,
        desiredCount: 1,
        cpu: 512,
        publicLoadBalancer: true,
        redirectHTTP: true,
        protocol: aws_elasticloadbalancingv2.ApplicationProtocol.HTTPS,
        taskImageOptions: {
            image: ecs.ContainerImage.fromAsset('.',
                {
                    file: 'src/docker/Dockerfile',
                    buildArgs: { NODE_VERSION: '20' },
                },
            ),
            environment: {
                // Env variables
            },
        },
        loadBalancerName: `${this.config.getStackName()}-LoadBalancer`,
        domainName: this.config.getDomainName(),
        domainZone: this.stack.resources.external.hostedZone,
        securityGroups: [this.stack.resources.external.consumerOpenSearchAccessSecurityGroup],
    });

    loadBalancedFargateService.targetGroup.configureHealthCheck({
        path: '/',
    });

    return loadBalancedFargateService;
}

private createApiGateway(loadBalancedFargateService: ecsPatterns.ApplicationLoadBalancedFargateService) {

    const api = new apigw2.HttpApi(this.stack, 'HttpGateWay');

    const jwtAuthorizerFunction = lambda.Function.fromFunctionAttributes(
        this.stack,
        'ImportedJwtAuthorizer',
        {
            functionArn: this.config.getAuthorizerLambdaArn(),
            skipPermissions: true,
        }
    );

    const jwtAuthorizerIntegration = new apigw.LambdaIntegration(jwtAuthorizerFunction);

    api.addRoutes({
        path: '/sessions/{proxy+}',
        methods: [apigw2.HttpMethod.GET],
        integration: new apigw2Integrations.HttpAlbIntegration('AuthIntegration', loadBalancedFargateService.listener,
            {
                // Here I don't know how can I use the jwtAuthorizerIntegration
            }
        )
    })
}

Есть ли у кого-нибудь опыт подключения функций Lambda к ALB. Должен ли я использовать API-шлюз или какие-либо предложения о том, как правильно защитить конечную точку с помощью авторизатора Lambda?

Вам это нужно в аргументе «авторизатор», а не в «интеграции». Термин для поиска — «пользовательский авторизатор лямбда-выражений» (например, это руководство или официальная документация ).

defaultUsernameN 04.07.2024 14:03

@defaultUsernameN спасибо за ответ. Я следовал руководству, но до сих пор не могу понять, как мне установить связь между Alb и шлюзом API. Я попробовал пару вещей, но остановился на target group does not have an associated load balancer

Murat Colyaran 04.07.2024 15:24

ALB может быть впереди APIGW или позади него, как в вашем случае? Если во-вторых, вот вопрос, связанный с - эта настройка, насколько я вижу, не будет мешать авторизатору лямбды.

defaultUsernameN 04.07.2024 20:13

И вообще, я предполагаю, что вы знаете, почему вы этого хотите... но одновременное использование APIGW и ALB - это своего рода необычная установка (хотя и не неслыханная) - вы полностью уверены, что это то, что вы хотите? Какую первоначальную проблему вы решали?

defaultUsernameN 04.07.2024 20:17

@defaultUsernameN На самом деле я не планировал использовать APIGW, я просто хотел использовать лямбда-функцию для защиты конечных точек /sessions/**. Я читал, что APIGW упрощает реализацию лямбды. Если вы считаете, что это ненужно, я бы с радостью удалил это. Я просто хочу, чтобы при поступлении запроса в /sessions лямбда-код проверял заголовок авторизации.

Murat Colyaran 05.07.2024 01:09

Ох, хорошо. По какой причине вы бы не использовали Cognito+ALB вместо идеи APIGW? Это обычный путь для подобных вещей

defaultUsernameN 05.07.2024 20:43

@defaultUsernameN моя компания использует тот же авторизатор лямбда-выражений, и я хотел использовать его и здесь. Я думал, что это будет легко. Но, возможно, я бы просто использовал лямбду и для операций с сеансами. Это было бы более плавное решение.

Murat Colyaran 05.07.2024 22:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

проверьте lib aws-cdk-lib/aws-apigatewayv2-authorizers: и импортируйте этот класс HttpLambdaAuthorizer

после создания авторизатора вы можете прикрепить его примерно так:

    const apiGateway = new HttpApi(this, "ApiGateway", {
        corsPreflight: {
            allowHeaders: ["*"],
            allowCredentials: true,
            allowMethods: [
                CorsHttpMethod.PATCH,
                CorsHttpMethod.POST,
                CorsHttpMethod.GET,
                CorsHttpMethod.PUT,
                CorsHttpMethod.DELETE,
                CorsHttpMethod.OPTIONS,
            ],
            allowOrigins: ["*"
            ],
            maxAge: cdk.Duration.days(1),
        },
        defaultAuthorizer: lambdaAuthorizer,
    });

Благодарю за ваш ответ. Но я думаю, мне тоже нужен vpc.

Murat Colyaran 05.07.2024 22:19

да, но vpc должен быть определен в вашем кластере и на вашем ALB, эта конфигурация для шлюза API не нужна. Если вам нужно, чтобы ваш лямбда-авторизатор работал в vpc, вам следует поместить его в jwtAuthorizerFunction (используя следующие свойства: vpc, SecurityGroups и vpcSubnets).

Math.Random 09.07.2024 20:05

Другие вопросы по теме