亚马逊弹性负载平衡 V2 构造库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
这个 @aws-cdk/aws-elasticloadbalancingv2 软件包提供构造
配置应用程序和网络负荷平衡器.
更多信息见AWS文档 应用程序负载平衡器 财务报告和审定财务报表 网络负载平衡器。 。 。 .
定义应用程序负载平衡器
您通过创建实例定义应用程序负载平衡器
ApplicationLoadBalancer,在负载平衡器中添加一个收听器
并在听众中添加目标:
import { AutoScalingGroup } from '@aws-cdk/aws-autoscaling';
declare const asg: AutoScalingGroup;
declare const vpc: ec2.Vpc;
// Create the load balancer in a VPC. 'internetFacing' is 'false'
// by default, which creates an internal load balancer.
const lb = new elbv2.ApplicationLoadBalancer(this, 'LB', {
vpc,
internetFacing: true
});
// Add a listener and open up the load balancer's security group
// to the world.
const listener = lb.addListener('Listener', {
port: 80,
// 'open: true' is the default, you can leave it out if you want. Set it
// to 'false' and use `listener.connections` if you want to be selective
// about who can access the load balancer.
open: true,
});
// Create an AutoScaling group and add it as a load balancing
// target to the listener.
listener.addTargets('ApplicationFleet', {
port: 8080,
targets: [asg]
});
负载平衡器和目标的安全组自动 更新以允许网络流量.
一个(或更多)安全小组可以与负载平衡器有关; 如果不提供安全小组,将自动创建一个安全小组.
declare const vpc: ec2.Vpc;
const securityGroup1 = new ec2.SecurityGroup(this, 'SecurityGroup1', { vpc });
const lb = new elbv2.ApplicationLoadBalancer(this, 'LB', {
vpc,
internetFacing: true,
securityGroup: securityGroup1, // Optional - will be automatically created otherwise
});
const securityGroup2 = new ec2.SecurityGroup(this, 'SecurityGroup2', { vpc });
lb.addSecurityGroup(securityGroup2);
条件
根据进站时的条件,可以将交通路线通向目标
HTTP请求. 例如,以下将路径请求到指定的
自动缩放 仅在请求中请求的主机为
example.com/ok 或者说 example.com/path数字 :
declare const listener: elbv2.ApplicationListener;
declare const asg: autoscaling.AutoScalingGroup;
listener.addTargets('Example.Com Fleet', {
priority: 10,
conditions: [
elbv2.ListenerCondition.hostHeaders(['example.com']),
elbv2.ListenerCondition.pathPatterns(['/ok', '/path']),
],
port: 8080,
targets: [asg]
});
有条件的目标包含其中之一 pathPatterns 或者说 hostHeader,或
都一样 如果两者都得到明确,则满足两项条件,这些要求才能:
被引导到给定的目标. priority 是添加时需要的字段
有条件的目标。 最少数取胜.
每个听众必须无条件地至少有一个目标,即: 所有不符合任何条件的请求都会被发出.
方便方法和更复杂的行动
将流量从负载平衡器运行到目标需要以下步骤:
- 创建目标组, 将目标注册到目标组
- 给收听者添加一个动作,将流量传送到目标组.
通过调用可添加到装入平衡器的新收听器 addListener()。 。 。 .
已添加到负载平衡器的收听器可以使用
listeners 属性。 注意 listeners 属性会出错
用于导入或查询负载平衡器.
各种方法 Listener 照顾好这份工作 让你更伟大
或程度较小:
addTargets()执行两个步骤:自动创建目标组和 需要采取行动.addTargetGroups()给您更多的控制:您创建目标组( 或 (目标组)你自己和这个方法 创建行动,引导交通 目标团体.addAction()完全控制:提供动作并把它接通 直接访问目标组(或访问其他ELB路由特性之一).
使用 addAction() 允许您访问弹性载荷的一些特性
平衡器 其他两种方便方法不:
- 摇摆自如: 使用
ListenerAction.forward()供应astickinessDuration确保请求被传送到同一个目标群体 期限. - 加权目标群体: 使用
ListenerAction.weightedForward()对不同的目标群体给予不同的权重. - 固定答复: 使用
ListenerAction.fixedResponse()服务 a 静态反应(仅限ALB). - 重定向: 使用
ListenerAction.redirect()为 HTTP 服务 重定向响应(仅限ALB). - 认证: 使用
ListenerAction.authenticateOidc()改为 在满足请求之前进行 OpenID 认证(参见@aws-cdk/aws-elasticloadbalancingv2-actions用于直接认证的软件包 与Cognitto融合(仅ALB).
这里有一个例子 提供固定的响应 /ok URL :
declare const listener: elbv2.ApplicationListener;
listener.addAction('Fixed', {
priority: 10,
conditions: [
elbv2.ListenerCondition.pathPatterns(['/ok']),
],
action: elbv2.ListenerAction.fixedResponse(200, {
contentType: elbv2.ContentType.TEXT_PLAIN,
messageBody: 'OK',
})
});
以下是在转发到目标组之前使用 OIDC 认证的例子 :
declare const listener: elbv2.ApplicationListener;
declare const myTargetGroup: elbv2.ApplicationTargetGroup;
listener.addAction('DefaultAction', {
action: elbv2.ListenerAction.authenticateOidc({
authorizationEndpoint: 'https://example.com/openid',
// Other OIDC properties here
clientId: '...',
clientSecret: SecretValue.secretsManager('...'),
issuer: '...',
tokenEndpoint: '...',
userInfoEndpoint: '...',
// Next
next: elbv2.ListenerAction.forward([myTargetGroup]),
}),
});
如果您只是想要将一个港口的所有进港流量转向另一个港口,您可以使用以下代码:
declare const lb: elbv2.ApplicationLoadBalancer;
lb.addRedirect({
sourceProtocol: elbv2.ApplicationProtocol.HTTPS,
sourcePort: 8443,
targetProtocol: elbv2.ApplicationProtocol.HTTP,
targetPort: 8080,
});
如果您不为这种方法提供任何选项,它会将HTTP端口80重定向到HTTPS端口443.
默认情况下,所有入港交通都将被允许进入源端口. 如果你想更有选择
然后设定入侵规则 open: false 并使用听众的 connections 反对有选择地给予听众访问权限.
定义网络负载平衡器
网络负载平衡器的定义类似于应用程序负载 余额 :
declare const vpc: ec2.Vpc;
declare const asg: autoscaling.AutoScalingGroup;
// Create the load balancer in a VPC. 'internetFacing' is 'false'
// by default, which creates an internal load balancer.
const lb = new elbv2.NetworkLoadBalancer(this, 'LB', {
vpc,
internetFacing: true
});
// Add a listener on a particular port.
const listener = lb.addListener('Listener', {
port: 443,
});
// Add targets on a particular port.
listener.addTargets('AppFleet', {
port: 443,
targets: [asg]
});
要记住的一件事是 网络负荷平衡器没有安全性 组合,没有为您完成自动安全组配置。 你会的 必须配置目标的安全组 允许通过 客户端和/或装入平衡器实例,视目标类型而定。 见 您网络装入的目标组 余额 财务报告和审定财务报表 以目标注册目标 组 更多信息.
目标群体
应用程序和网络负载平衡器在目标中组织负载平衡目标
组. 如果您添加了平衡目标( 如自动缩放组、 ECS)
服务或个别实例)直接、适当
TargetGroup 将自动为你们创造.
如果您需要更多控制创建的目标组,请创建实例
ApplicationTargetGroup 或者说 NetworkTargetGroup你应当增加你所欲增加的成员,
并把它加入听众的行列 addTargetGroups 改为 addTargets。 。 。 .
addTargets() 将永远归还它刚刚为你创建的目标组:
declare const listener: elbv2.NetworkListener;
declare const asg1: autoscaling.AutoScalingGroup;
declare const asg2: autoscaling.AutoScalingGroup;
const group = listener.addTargets('AppFleet', {
port: 443,
targets: [asg1],
});
group.addTarget(asg2);
应用程序加载平衡器的粘接会话
默认情况下,一个应用程序负载平衡器将每个请求独立地通向基于所选负载平衡算法的已注册目标. 然而,可以使用粘接会话特性(也叫会话亲和性)来使负载平衡器能够将用户会话绑定到特定的目标上. 这确保了用户在会话中的所有请求都被发送到同一个目标. 这个功能对维护状态信息的服务器有用,以便为客户端提供持续的经验. 要使用粘接会话,客户端必须支持cookie.
应用程序负载平衡器支持两种基于持续时间的饼干(lb_cookie)和基于应用程序的饼干(app_cookie) (中文(简体) ). 管理粘滞会话的关键在于确定您的负载平衡器应该将用户的请求始终引导到同一个目标. 在目标群体一级启用了粘接会。 可以综合使用以持续时间为主的粘度,应用为主的粘度,并且所有目标群体之间不粘度.
declare const vpc: ec2.Vpc;
// Target group with duration-based stickiness with load-balancer generated cookie
const tg1 = new elbv2.ApplicationTargetGroup(this, 'TG1', {
targetType: elbv2.TargetType.INSTANCE,
port: 80,
stickinessCookieDuration: Duration.minutes(5),
vpc,
});
// Target group with application-based stickiness
const tg2 = new elbv2.ApplicationTargetGroup(this, 'TG2', {
targetType: elbv2.TargetType.INSTANCE,
port: 80,
stickinessCookieDuration: Duration.minutes(5),
stickinessCookieName: 'MyDeliciousCookie',
vpc,
});
更多信息见: https://docs.aws.amazon.com/弹性负载平衡/latest/应用/sticky-sessions.html#应用-基于应用-stickness
设定目标群体协议版本
默认情况下,应用程序负载平衡器会使用HTTP/1.1向目标发送请求. 你可以用这个 协议版本 用 HTTP/2 或 gRPC 向目标发送请求.
declare const vpc: ec2.Vpc;
const tg = new elbv2.ApplicationTargetGroup(this, 'TG', {
targetType: elbv2.TargetType.IP,
port: 50051,
protocol: elbv2.ApplicationProtocol.HTTP,
protocolVersion: elbv2.ApplicationProtocolVersion.GRPC,
healthCheck: {
enabled: true,
healthyGrpcCodes: '0-99',
},
vpc,
});
使用 Lambda 目标
要使用 Lambda 函数作为目标,请使用
@aws-cdk/aws-elasticloadbalancingv2-targets 软件包 :
import * as lambda from '@aws-cdk/aws-lambda';
import * as targets from '@aws-cdk/aws-elasticloadbalancingv2-targets';
declare const lambdaFunction: lambda.Function;
declare const lb: elbv2.ApplicationLoadBalancer;
const listener = lb.addListener('Listener', { port: 80 });
listener.addTargets('Targets', {
targets: [new targets.LambdaTarget(lambdaFunction)],
// For Lambda Targets, you need to explicitly enable health checks if you
// want them.
healthCheck: {
enabled: true,
}
});
只有单一的Lambda函数可以被添加到单一的收听者规则中.
使用应用程序负载平衡器目标
要使用单个应用程序负载平衡器作为网络负载平衡器的目标,请使用
@aws-cdk/aws-elasticloadbalancingv2-targets 软件包 :
import * as targets from '@aws-cdk/aws-elasticloadbalancingv2-targets';
import * as ecs from '@aws-cdk/aws-ecs';
import * as patterns from '@aws-cdk/aws-ecs-patterns';
declare const vpc: ec2.Vpc;
const task = new ecs.FargateTaskDefinition(this, 'Task', { cpu: 256, memoryLimitMiB: 512 });
task.addContainer('nginx', {
image: ecs.ContainerImage.fromRegistry('public.ecr.aws/nginx/nginx:latest'),
portMappings: [{ containerPort: 80 }],
});
const svc = new patterns.ApplicationLoadBalancedFargateService(this, 'Service', {
vpc,
taskDefinition: task,
publicLoadBalancer: false,
});
const nlb = new elbv2.NetworkLoadBalancer(this, 'Nlb', {
vpc,
crossZoneEnabled: true,
internetFacing: true,
});
const listener = nlb.addListener('listener', { port: 80 });
listener.addTargets('Targets', {
targets: [new targets.AlbTarget(svc.loadBalancer, 80)],
port: 80,
});
new CfnOutput(this, 'NlbEndpoint', { value: `http://${nlb.loadBalancerDnsName}`})
只有网络负载平衡器被允许添加应用程序负载平衡器作为目标.
配置健康检查
建立目标群体后,将进行健康检查:
declare const listener: elbv2.ApplicationListener;
declare const asg: autoscaling.AutoScalingGroup;
listener.addTargets('AppFleet', {
port: 8080,
targets: [asg],
healthCheck: {
path: '/ping',
interval: Duration.minutes(1),
}
});
创建后也可以通过调用配置健康检查
configureHealthCheck() 在创建对象上.
没有尝试为您所在的端口配置安全组 配置健康检查,但如果健康检查在同一港口 安全小组已经允许了交通. 否则,您必须适当配置安全小组:
declare const lb: elbv2.ApplicationLoadBalancer;
declare const listener: elbv2.ApplicationListener;
declare const asg: autoscaling.AutoScalingGroup;
listener.addTargets('AppFleet', {
port: 8080,
targets: [asg],
healthCheck: {
port: '8088',
}
});
asg.connections.allowFrom(lb, ec2.Port.tcp(8088));
使用不同堆栈的负载平衡器
如果您想要将您的负载平衡器和目标置入, 它正在装入平衡器
不同的堆栈, 您可能无法使用方便方法
loadBalancer.addListener() 财务报告和审定财务报表 listener.addTargets()。 。 。 .
原因是,这些方法将创造资源 在同一 Stack 与
它们被调用的对象,这可能导致堆栈之间的循环引用.
相反,你将不得不创建一个 ApplicationListener 在目标堆栈中,
或为空 TargetGroup 在您附加的负载平衡堆栈中
服务.
例如,在向ECS服务加载平衡时,可使用替代品 中央/交叉堆放负载平衡器 实例。 。 。 .
负载平衡目标协议
要成为负载平衡器目标的构造应执行
IApplicationLoadBalancerTarget 和(或) INetworkLoadBalancerTarget,以及
提供此功能的执行 attachToXxxTargetGroup(),可以这样
在负载平衡器上调用函数,并应返回关于
负载平衡目标 :
class MyTarget implements elbv2.IApplicationLoadBalancerTarget {
public attachToApplicationTargetGroup(targetGroup: elbv2.ApplicationTargetGroup): elbv2.LoadBalancerTargetProps {
// If we need to add security group rules
// targetGroup.registerConnectable(...);
return {
targetType: elbv2.TargetType.IP,
targetJson: { id: '1.2.3.4', port: 8080 },
};
}
}
targetType 应该是一个 Instance 或者说 Ip如果目标可以是:
直接加入目标群体, targetJson 应包含 id 联 合 国
目标(视类型而定是实例ID还是IP地址)和
可选 port 或者说 availabilityZone 超过.
应用程序负载平衡器目标可以调用 registerConnectable() 编辑
将自己登记在负载平衡器安全之外的目标群体
团体规则.
如果您的负载平衡器目标要求目标组是
注册前与 LoadBalancer 相关联(例如
以ECS服务为例)
targetGroup.loadBalancerAttached 内容如下:
declare const resource: Resource;
declare const targetGroup: elbv2.ApplicationTargetGroup;
// Make sure that the listener has been created, and so the TargetGroup
// has been associated with the LoadBalancer, before 'resource' is created.
Node.of(resource).addDependency(targetGroup.loadBalancerAttached);
正在寻找装入平衡器和收听器
您可以使用其中之一查找加载平衡器和加载平衡器的收听器 以下查找方法:
ApplicationLoadBalancer.fromlookup(options)- 查找应用程序载荷 平衡点.ApplicationListener.fromLookup(options)- 查找应用程序载荷 平衡者倾听者.NetworkLoadBalancer.fromLookup(options)- 寻找一个网络负载平衡器.NetworkListener.fromLookup(options)- 找一个网络负荷平衡器 听着.
装入平衡器搜索选项
您可以通过 ARN 或 关联标签查询负载平衡器 。 当你看起来像一个 由 ARN 向上加载平衡器, 除非 CDK 检测到, 该加载平衡器将返回 表示负载平衡器属于错误类型。 当你查到一个负载平衡器 标记, CDK 将返回匹配所有指定标记的负载平衡器。 如果更多的话 超过一个负载平衡器匹配, CDK 将丢出一个错误请求您 提供更具体的标准.
通过 ARN 查找应用程序加载平衡器
const loadBalancer = elbv2.ApplicationLoadBalancer.fromLookup(this, 'ALB', {
loadBalancerArn: 'arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/my-load-balancer/1234567890123456',
});
通过标签查找应用程序加载平衡器
const loadBalancer = elbv2.ApplicationLoadBalancer.fromLookup(this, 'ALB', {
loadBalancerTags: {
// Finds a load balancer matching all tags.
some: 'tag',
someother: 'tag',
},
});
装入平衡器收听器查询选项
您可以按照以下标准查询一个负载平衡器的收听器:
- 相关负载平衡器 ARN
- 相关负载平衡标记
- 收听器 ARN
- 听声音端口
- 听众协议
查找方法将返回匹配的收听器 。 如果不止一个听众 匹配, CDK 将丢出错误, 请求您指定额外 标准.
通过关联的负载平衡器、 端口和协议查找收听器
const listener = elbv2.ApplicationListener.fromLookup(this, 'ALBListener', {
loadBalancerArn: 'arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/my-load-balancer/1234567890123456',
listenerProtocol: elbv2.ApplicationProtocol.HTTPS,
listenerPort: 443,
});
通过相关负载平衡器标记、 端口和协议查找收听器
const listener = elbv2.ApplicationListener.fromLookup(this, 'ALBListener', {
loadBalancerTags: {
Cluster: 'MyClusterName',
},
listenerProtocol: elbv2.ApplicationProtocol.HTTPS,
listenerPort: 443,
});
通过关联的负载平衡器标记、 端口和协议查找网络收听器
const listener = elbv2.NetworkListener.fromLookup(this, 'ALBListener', {
loadBalancerTags: {
Cluster: 'MyClusterName',
},
listenerProtocol: elbv2.Protocol.TCP,
listenerPort: 12345,
});