Я пытаюсь защитить конечную точку (например, /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 спасибо за ответ. Я следовал руководству, но до сих пор не могу понять, как мне установить связь между Alb и шлюзом API. Я попробовал пару вещей, но остановился на target group does not have an associated load balancer
ALB может быть впереди APIGW или позади него, как в вашем случае? Если во-вторых, вот вопрос, связанный с - эта настройка, насколько я вижу, не будет мешать авторизатору лямбды.
И вообще, я предполагаю, что вы знаете, почему вы этого хотите... но одновременное использование APIGW и ALB - это своего рода необычная установка (хотя и не неслыханная) - вы полностью уверены, что это то, что вы хотите? Какую первоначальную проблему вы решали?
@defaultUsernameN На самом деле я не планировал использовать APIGW, я просто хотел использовать лямбда-функцию для защиты конечных точек /sessions/**
. Я читал, что APIGW упрощает реализацию лямбды. Если вы считаете, что это ненужно, я бы с радостью удалил это. Я просто хочу, чтобы при поступлении запроса в /sessions лямбда-код проверял заголовок авторизации.
Ох, хорошо. По какой причине вы бы не использовали Cognito+ALB вместо идеи APIGW? Это обычный путь для подобных вещей
@defaultUsernameN моя компания использует тот же авторизатор лямбда-выражений, и я хотел использовать его и здесь. Я думал, что это будет легко. Но, возможно, я бы просто использовал лямбду и для операций с сеансами. Это было бы более плавное решение.
проверьте 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.
да, но vpc должен быть определен в вашем кластере и на вашем ALB, эта конфигурация для шлюза API не нужна. Если вам нужно, чтобы ваш лямбда-авторизатор работал в vpc, вам следует поместить его в jwtAuthorizerFunction (используя следующие свойства: vpc, SecurityGroups и vpcSubnets).
Вам это нужно в аргументе «авторизатор», а не в «интеграции». Термин для поиска — «пользовательский авторизатор лямбда-выражений» (например, это руководство или официальная документация ).