in lib/ide-services-cloudfront.ts [23:90]
constructor(scope: Construct, id: string, props: IdeServicesCloudfrontProps) {
super(scope, id, props);
const {cluster, ideServicesChart} = props;
const vpc = cluster.vpc;
const findLoadBalancerFunction = this.createFindLoadBalancerFunction();
// Provision a custom resource provider framework
const provider = new cr.Provider(this, 'FindLoadBalancerProvider', {
onEventHandler: findLoadBalancerFunction,
logGroup: new logs.LogGroup(this, 'FindLoadBalancerLogs', {
retention: logs.RetentionDays.ONE_DAY,
}),
});
// Create a custom resource to look up the ALB by its DNS name
const ingressNamePrefix = "k8s-ideservicesgroup-"
const findLoadBalancer = new CustomResource(this , 'FindLoadBalancer', {
serviceToken: provider.serviceToken,
properties: {
namePrefix: ingressNamePrefix,
},
});
findLoadBalancer.node.addDependency(ideServicesChart)
// Extract the load balancer ARN and security group ID from the Lambda function's response
const loadBalancerArn = findLoadBalancer.getAttString('loadBalancerArn');
const loadBalancerDnsName = findLoadBalancer.getAttString('dnsName');
const securityGroupId = findLoadBalancer.getAttString('securityGroupId');
// Import the ALB using its attributes
const alb = elasticloadbalancingv2.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(
this,
'ImportedAlb',
{
loadBalancerArn: loadBalancerArn,
loadBalancerDnsName: loadBalancerDnsName,
securityGroupId: securityGroupId,
vpc: vpc,
}
);
// An Application Load Balancer as a VPC origin
const albOrigin = cloudfront_origins.VpcOrigin.withApplicationLoadBalancer(alb, {
// Optional VPC origin configurations
domainName: loadBalancerDnsName,
readTimeout: cdk.Duration.seconds(30),
keepaliveTimeout: cdk.Duration.seconds(5),
protocolPolicy: OriginProtocolPolicy.HTTP_ONLY,
});
// Create CloudFront distribution with ALB as VPC origin
const distribution = new cloudfront.Distribution(this, 'AlbCloudFrontDistribution', {
defaultBehavior: {
origin: albOrigin,
originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER,
allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
},
priceClass: cloudfront.PriceClass.PRICE_CLASS_100, // Use only North America and Europe
enabled: true,
comment: 'CloudFront distribution with VPC origin for ALB',
});
this.deploymentUrl = `https://${distribution.distributionDomainName}`
}