【问题标题】:Assign a Static Elastic IP to Application Load Balancer将静态弹性 IP 分配给 Application Load Balancer
【发布时间】:2022-12-03 22:24:34
【问题描述】:

如何使用 AWS CDK 在 Application Load Balancer 前面创建一个具有一个或多个弹性 IP 地址的网络负载均衡器?

这应该允许负载均衡器拥有固定的 IP 地址。文章I need a static IP address for my Application Load Balancer. How can I register an Application Load Balancer behind a Network Load Balancer?推荐了这种做法。

CDK API 手册不涵盖此用例。 class NetworkLoadBalancer (construct) 缺少 SubnetMappings 属性的定义。这看起来像是文档或库中的问题。

代码应该在 TypeScript 中更可取。

【问题讨论】:

  • 您可以使用 Global Accelerator 为您的 ALB 获取静态 IP。这不需要 NLB。另外,您当前的代码是什么,为什么它不起作用?
  • @Marcin 我没有任何代码可以显示,因为我不知道如何将弹性 IP 关联到 Network Ba​​lancer 我不想使用 Global accelerator
  • @Marcin 如果我使用 Global Accelerator,我如何将它指向我在 aws-cdk 中的 ALB?
  • @AnwarJaved,我更新了你的问题。希望你不要介意。简而言之,他们在 AWS API 文档中没有任何工作示例。而且似乎缺少功能并且需要一些解决方法。
  • 我不认为我们应该关闭这个问题,因为解决方案没有包含在官方手册中,需要一些研究。

标签: amazon-web-services aws-cdk


【解决方案1】:

在回答有关负载均衡器的静态 IP 地址的问题之前,我想提出一个替代解决方案。

替代解决方案 - 向 Route53 注册 ALB

我们可以使用 CDK 在 Route53 中为 ALB 创建一个 DNS 记录。代码很简单。遗憾的是,如果 DNS 区域不是由 AWS Route53 托管,则此解决方案无法正常工作。


  // Create or import your hosted zone.
  const hostedZone = new PublicHostedZone(stack, 'HostedZone', {
    zoneName: 'your.domain.name'
  })

  const loadBalancer = ... // Define your ALB.

  // Create a DNS record for your ALB instead of the static IP address.
  // eslint-disable-next-line no-new
  new ARecord(stack, 'WebServerARecord', {
    recordName: 'www',
    target: RecordTarget.fromAlias(new LoadBalancerTarget(loadBalancer)),
    zone: hostedZone
  })

网络负载均衡器的固定地址问题

在撰写本文时,CDK 构造没有为网络负载均衡器分配静态 IP 地址的选项。 GitHub 上有几个未解决的问题:SubnetMappings support for LoadBalancer #7424Add support for SubnetMapping to Network Load Balancer #9696

简而言之,使用 SubnetMappings 允许负载均衡器指定一个或多个弹性 IP 地址,但 NetworkLoadBalancer 类没有 SubnetMappings 属性。

[网络负载均衡器] 您可以从一个或多个中指定子网 可用区。您可以为每个子网指定一个弹性 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 列表添加更多关联。如果要删除一些,则必须重新创建负载均衡器。

【讨论】:

    【解决方案2】:

    关闭,截至目前,目前不可能在 2022 年 8 月 30 日。

    【解决方案3】:

    您可以将 AWS Global Accelerator link 分配给您的 ALB,而不是直接分配静态 IP,它会依次为您提供两个静态 IP 地址。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2020-08-03
      • 2021-08-20
      • 2019-01-30
      • 2021-11-25
      • 2019-12-16
      • 2021-01-21
      • 2019-02-17
      相关资源
      最近更新 更多