AWS CDK:为ApiGateway VPC链接获取ElasticBeanstalk环境的LoadBalancer ARN

时间:2020-06-02 14:07:12

标签: amazon-elastic-beanstalk aws-api-gateway aws-cdk aws-load-balancer

我正在使用AWS CDK通过网络负载均衡器创建Elastic Beanstalk环境。

Elastic Beanstalk应用程序和负载均衡器均位于VPC的专用子网中。 我想将API网关与使用网络负载平衡器的VPC链接一起使用。

在CDK应用程序中,我正在创建一个elasticbeanstalk.CfnEnvironment。对于我的ApiGateway,我有一个这样的VPC链接:

const env: elasticbeanstalk.CfnEnvironment = this.createElasticBeanstalkEnvironment();
const loadBalancer = elbv2.NetworkLoadBalancer.fromNetworkLoadBalancerAttributes(this.stack, `DjangoNetworkLoadBalancer`, {
    loadBalancerArn: env.loadBalancerArn (not available!)
})

const link = new apigateway.VpcLink(this.stack, `DjangoLoadBalancerLink`, {
    targets: [loadBalancer],
});

...

private createElasticBeanstalkEnvironment() {
    const env = new elasticbeanstalk.CfnEnvironment(this.stack, 'DjangoBeanstalkEnv', {
        applicationName: 'TestApp',
        environmentName: 'TestAppDev',
        solutionStackName: '64bit Amazon Linux 2 v3.0.1 running Python 3.7'
    });

    env.optionSettings = [
        {
            namespace: 'aws:elasticbeanstalk:environment',
            optionName: 'LoadBalancerType',
            value: 'network'
        },
        {
            namespace: 'aws:elbv2:listener:443',
            optionName: 'ListenerEnabled',
            value: 'true'
        },
        {
            namespace: 'aws:elbv2:listener:default',
            optionName: 'ListenerEnabled',
            value: 'false' 
        }
    ]

    return env;
}

很遗憾,我不能使用env.loadBalancerArn语句。 我有什么办法可以检索环境的负载均衡器信息?

1 个答案:

答案 0 :(得分:0)

我记得我曾经尝试过类似的方法,但是发生的事情是,由于从Cloudformation创建Elasticbeanstalk的方式,不可能检索负载均衡器ARN。

如果您在Cloudformation中观察ElasticBeanstalk的创建过程,则在达到环境要求时,它将衍生出另一个Cloudformation脚本来构建环境。因此,您将无法检索这些信息,例如EC2,负载均衡器信息

最后,我最终将ECS与API Gateway结合使用,ECS可以为您提供负载均衡器ARN

例如

    const apiService = new ecs_patterns.NetworkLoadBalancedEc2Service(
      this,
      "my-service",
      {
        cluster: cluster,
        desiredCount: 1,        
        memoryLimitMiB: 500,
        // other detail omit...        
        publicLoadBalancer: false
      }
    );
    
    const nlb = apiService.loadBalancer;