我们可以使用 CDK 在 Route53 中为 ALB 创建一个 DNS 记录。代码很简单。遗憾的是,如果 DNS 区域不是由 AWS Route53 托管,则此解决方案无法正常工作。
[网络负载均衡器] 您可以从一个或多个中指定子网
可用区。您可以为每个子网指定一个弹性 IP 地址
如果您的面向互联网的负载需要静态 IP 地址
平衡器。
问题 7424 已有两年多了。如果必须的话,我们可能想寻求解决方法,而不是等待。
将弹性 IP 地址分配给 NLB 的解决方法
我们将注册一个弹性 IP 地址,创建一个网络负载均衡器并为其分配 IP 地址。我还添加代码以导入 VPC 并创建一个简单的 Application Load Balancer 以确保完整性。请检查下面的代码和代码上的 cmets。请注意,网络负载均衡器和弹性 IP 在堆栈创建后开始响应,但有一些延迟。
import { App, Stack } from 'aws-cdk-lib'
import { CfnEIP, Port, Vpc } from 'aws-cdk-lib/aws-ec2'
import { ApplicationLoadBalancer, ListenerAction, NetworkLoadBalancer } from 'aws-cdk-lib/aws-elasticloadbalancingv2'
import { AlbTarget } from 'aws-cdk-lib/aws-elasticloadbalancingv2-targets'
import { env } from 'process'
function createStack (scope, id, props) {
const stack = new Stack(scope, id, props)
// 1. Prepare required resources: import VPC and create simple ALB.
const vpc = Vpc.fromLookup(stack, 'Vpc', { vpcName: 'BlogVpc' })
const alb = new ApplicationLoadBalancer(stack, 'ALB', {
internetFacing: false,
port: 80,
vpc
})
const albListener = alb.addListener('HttpListener', {
defaultAction: ListenerAction.fixedResponse(200, {
contentType: 'text/plain', messageBody: 'Hello World!'
}),
open: true,
port: 80,
})
// 2. Create an Elastic IP address.
const elasticIp = new CfnEIP(stack, 'ElasticIp', {domain: 'vpc'})
// 3.1. Create a network load balancer.
const nlb = new NetworkLoadBalancer(stack, 'NLB', {
crossZoneEnabled: true,
internetFacing: true,
vpc
})
// 3.2. Add listener and target group to forward traffic to ALB.
const nlbTargetGroup = nlb
.addListener('AlbListener', {port: 80})
.addTargets('AlbTargets', {targets: [new AlbTarget(alb, 80)], port: 80});
// 3.3. We should create an ALB listener before creating the target group. This dependency is not added automatically.
// https://github.com/aws/aws-cdk/issues/17208
nlbTargetGroup.node.addDependency(albListener);
// 3.4. Replace Subnets with SubnetMappings.
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html
// We can have mappings for all public subnets. I did one for simplicity.
const cfnNlb = nlb.node.defaultChild
cfnNlb.addDeletionOverride('Properties.Subnets')
cfnNlb.subnetMappings = [{
allocationId: elasticIp.attrAllocationId,
subnetId: vpc.publicSubnets[0].subnetId
}]
return stack
}
const app = new App()
createStack(app, 'StaticIpStack', {
env: { account: env.CDK_DEFAULT_ACCOUNT, region: env.CDK_DEFAULT_REGION }
})
下面的屏幕截图显示了控制台中的 IP 地址关联。您可以向cfnNlb.subnetMappings 列表添加更多关联。如果要删除一些,则必须重新创建负载均衡器。