如何用Python CDK为Elastic Beanstalk应用负载均衡器配置HTTPS
通过CDK为Elastic Beanstalk ALB配置HTTPS监听器的方案
方案一:直接在EB环境中配置HTTPS监听器
不需要提前创建独立ALB,通过CDK定义EB环境时,指定负载均衡器的HTTPS配置参数即可:
- 确保已在AWS Certificate Manager(ACM)中持有目标域名的SSL证书
- 在CDK中创建EB环境时,添加
OptionSetting配置项,针对aws:elbv2:listener:443命名空间设置以下参数:ListenerEnabled:trueProtocol:HTTPSSSLCertificateArns: 你的ACM证书ARNDefaultProcess:default(或自定义进程名)- 可选:设置
aws:elbv2:listener:80的ListenerEnabled为false,禁用HTTP访问
示例CDK代码(TypeScript):
import * as cdk from 'aws-cdk-lib'; import * as elasticbeanstalk from 'aws-cdk-lib/aws-elasticbeanstalk'; import * as acm from 'aws-cdk-lib/aws-acm'; export class EbHttpsStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 引用已存在的ACM证书,或在此创建新证书 const sslCert = acm.Certificate.fromCertificateArn(this, 'SslCert', 'arn:aws:acm:us-east-1:123456789012:certificate/xxxx-xxxx-xxxx-xxxx'); const app = new elasticbeanstalk.CfnApplication(this, 'MyApp', { applicationName: 'MyEBApp', }); const env = new elasticbeanstalk.CfnEnvironment(this, 'MyEnv', { applicationName: app.applicationName, solutionStackName: '64bit Amazon Linux 2 v3.4.10 running Node.js 16', // 根据你的运行时选择对应栈 optionSettings: [ // 配置HTTPS监听器 { namespace: 'aws:elbv2:listener:443', optionName: 'ListenerEnabled', value: 'true', }, { namespace: 'aws:elbv2:listener:443', optionName: 'Protocol', value: 'HTTPS', }, { namespace: 'aws:elbv2:listener:443', optionName: 'SSLCertificateArns', value: sslCert.certificateArn, }, { namespace: 'aws:elbv2:listener:443', optionName: 'DefaultProcess', value: 'default', }, // 可选:禁用HTTP 80端口 { namespace: 'aws:elbv2:listener:80', optionName: 'ListenerEnabled', value: 'false', }, // 指定负载均衡器类型为Application Load Balancer { namespace: 'aws:elasticbeanstalk:environment', optionName: 'LoadBalancerType', value: 'application', }, ], }); } }
方案二:提前创建独立ALB并关联到EB环境
如果需要对ALB做更复杂的自定义配置(比如额外监听器、WAF关联等),可以提前创建ALB并关联到EB环境:
- 提前创建ALB、目标组和HTTPS监听器:在CDK中独立创建ALB,关联ACM证书配置HTTPS监听器,并创建对应目标组
- 配置EB环境使用自定义负载均衡器:通过EB选项设置指定已创建的ALB和目标组ARN,同时确保EB实例端口与目标组匹配
注意事项:
- 提前创建的ALB需与EB环境在同一VPC,子网配置匹配
- EB的Auto Scaling Group会自动注册到指定目标组,无需手动关联
- 确保ALB安全组允许EB实例的应用端口流量(如5000/8080)
示例CDK代码片段:
import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; // 引用现有VPC const vpc = ec2.Vpc.fromLookup(this, 'Vpc', { vpcId: 'vpc-xxxxxx' }); // 提前创建ALB const alb = new elbv2.ApplicationLoadBalancer(this, 'CustomALB', { vpc: vpc, internetFacing: true, }); // 创建EB实例对应的目标组 const targetGroup = new elbv2.ApplicationTargetGroup(this, 'EbTargetGroup', { vpc: vpc, port: 80, protocol: elbv2.ApplicationProtocol.HTTP, targetType: elbv2.TargetType.INSTANCE, }); // 添加HTTPS监听器 alb.addListener('HttpsListener', { port: 443, protocol: elbv2.ApplicationProtocol.HTTPS, certificates: [elbv2.ListenerCertificate.fromCertificateArn(sslCert.certificateArn)], defaultAction: elbv2.ListenerAction.forward([targetGroup]), }); // 创建EB环境并关联自定义ALB const env = new elasticbeanstalk.CfnEnvironment(this, 'MyEnv', { applicationName: app.applicationName, solutionStackName: '64bit Amazon Linux 2 v3.4.10 running Node.js 16', optionSettings: [ { namespace: 'aws:elasticbeanstalk:environment', optionName: 'LoadBalancerType', value: 'application', }, { namespace: 'aws:elbv2:loadbalancer', optionName: 'LoadBalancerArn', value: alb.loadBalancerArn, }, { namespace: 'aws:elbv2:targetgroup', optionName: 'TargetGroupArn', value: targetGroup.targetGroupArn, }, // 配置EB实例端口与目标组一致 { namespace: 'aws:elasticbeanstalk:environment:process:default', optionName: 'Port', value: '80', }, ], });
关键说明
- 方案一操作更简洁,无需管理独立ALB,所有配置通过EB选项完成,EB会自动维护ALB与ASG的关联
- 方案二适合需要高度自定义ALB配置的场景
内容的提问来源于stack exchange,提问作者schierkolk
相关产品推荐
相关产品推荐

