diff --git a/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.expected.json b/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.expected.json index b3d92abe8d269..a0e2688a424f7 100644 --- a/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.expected.json +++ b/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.expected.json @@ -72,9 +72,19 @@ "ForwardedValues": { "QueryString": false }, - "TargetOriginId": "cloudfrontorigingroupDistributionOrigin137659A54", + "TargetOriginId": "cloudfrontorigingroupDistributionOriginGroup10B57F1D1", "ViewerProtocolPolicy": "allow-all" }, + "CacheBehaviors": [ + { + "ForwardedValues": { + "QueryString": false + }, + "PathPattern": "/api", + "TargetOriginId": "cloudfrontorigingroupDistributionOriginGroup10B57F1D1", + "ViewerProtocolPolicy": "allow-all" + } + ], "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, diff --git a/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.ts b/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.ts index 31557317a9b40..aa210ad2755fa 100644 --- a/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.ts +++ b/packages/@aws-cdk/aws-cloudfront-origins/test/integ.origin-group.ts @@ -17,6 +17,11 @@ const originGroup = new origins.OriginGroup({ new cloudfront.Distribution(stack, 'Distribution', { defaultBehavior: { origin: originGroup }, + additionalBehaviors: { + '/api': { + origin: originGroup, + }, + }, }); app.synth(); diff --git a/packages/@aws-cdk/aws-cloudfront-origins/test/origin-group.test.ts b/packages/@aws-cdk/aws-cloudfront-origins/test/origin-group.test.ts index 00dce3cc8c39e..2d343b686dff9 100644 --- a/packages/@aws-cdk/aws-cloudfront-origins/test/origin-group.test.ts +++ b/packages/@aws-cdk/aws-cloudfront-origins/test/origin-group.test.ts @@ -28,8 +28,12 @@ describe('Origin Groups', () => { const primaryOriginId = 'DistributionOrigin13547B94F'; const failoverOriginId = 'DistributionOrigin2C85CC43B'; + const originGroupId = 'DistributionOriginGroup1A1A31B49'; expect(stack).toHaveResourceLike('AWS::CloudFront::Distribution', { DistributionConfig: { + DefaultCacheBehavior: { + TargetOriginId: originGroupId, + }, Origins: [ { Id: primaryOriginId, diff --git a/packages/@aws-cdk/aws-cloudfront/lib/distribution.ts b/packages/@aws-cdk/aws-cloudfront/lib/distribution.ts index dee47eaa122df..c3b9d840e0edd 100644 --- a/packages/@aws-cdk/aws-cloudfront/lib/distribution.ts +++ b/packages/@aws-cdk/aws-cloudfront/lib/distribution.ts @@ -57,6 +57,7 @@ export interface DistributionAttributes { interface BoundOrigin extends OriginBindOptions, OriginBindConfig { readonly origin: IOrigin; + readonly originGroupId?: string; } /** @@ -291,30 +292,35 @@ export class Distribution extends Resource implements IDistribution { private addOrigin(origin: IOrigin, isFailoverOrigin: boolean = false): string { const existingOrigin = this.boundOrigins.find(boundOrigin => boundOrigin.origin === origin); if (existingOrigin) { - return existingOrigin.originId; + return existingOrigin.originGroupId ?? existingOrigin.originId; } else { const originIndex = this.boundOrigins.length + 1; const scope = new Construct(this, `Origin${originIndex}`); const originId = scope.node.uniqueId; const originBindConfig = origin.bind(scope, { originId }); - this.boundOrigins.push({ origin, originId, ...originBindConfig }); - if (originBindConfig.failoverConfig) { + if (!originBindConfig.failoverConfig) { + this.boundOrigins.push({origin, originId, ...originBindConfig}); + } else { if (isFailoverOrigin) { throw new Error('An Origin cannot use an Origin with its own failover configuration as its fallback origin!'); } + const groupIndex = this.originGroups.length + 1; + const originGroupId = new Construct(this, `OriginGroup${groupIndex}`).node.uniqueId; + this.boundOrigins.push({origin, originId, originGroupId, ...originBindConfig}); + const failoverOriginId = this.addOrigin(originBindConfig.failoverConfig.failoverOrigin, true); - this.addOriginGroup(originBindConfig.failoverConfig.statusCodes, originId, failoverOriginId); + this.addOriginGroup(originGroupId, originBindConfig.failoverConfig.statusCodes, originId, failoverOriginId); + return originGroupId; } return originId; } } - private addOriginGroup(statusCodes: number[] | undefined, originId: string, failoverOriginId: string): void { + private addOriginGroup(originGroupId: string, statusCodes: number[] | undefined, originId: string, failoverOriginId: string): void { statusCodes = statusCodes ?? [500, 502, 503, 504]; if (statusCodes.length === 0) { throw new Error('fallbackStatusCodes cannot be empty'); } - const groupIndex = this.originGroups.length + 1; this.originGroups.push({ failoverCriteria: { statusCodes: { @@ -322,7 +328,7 @@ export class Distribution extends Resource implements IDistribution { quantity: statusCodes.length, }, }, - id: new Construct(this, `OriginGroup${groupIndex}`).node.uniqueId, + id: originGroupId, members: { items: [ { originId },