monkey
monkey

Reputation: 1597

AWS CDK: There can only be one default behavior across all sources

Background

I have a piece of cdk code that runs in a function. Each time through it creates a cloud front distribution. I want one instance to have a different value of behavior. This seems like a very simple thing, but I always get the error below that I do not understand.

Code

      // 1. Default:
        let behavior: cloudfront.Behavior = {isDefaultBehavior: true};

        // Lambda Edge / Cloudfront Function Authentication... 
        if (subDomain == "monkey-ops") {

            // 2. Cloudfront Function.
            const cfFunct = new cloudfront.Function(this, 'id', {
                functionName: 'http-auth-ops',
                comment: 'http-auth for monkey-ops.monkeytronics.co.nz static site',
                code: cloudfront.FunctionCode.fromFile({filePath: __dirname + '\\http-auth-ops-cf.js'})
            });

            behavior = {
                isDefaultBehavior: false,
                functionAssociations: [{
                    eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,
                    function: cfFunct
                }] 
            };
            
            // behavior = {isDefaultBehavior: true};
        } else {
            behavior = {isDefaultBehavior: true};
        }
        

        let cloudFrontDistribution = new cloudfront.CloudFrontWebDistribution(this, subDomain + 'Distribution', {
            originConfigs: [
                {
                    customOriginSource: {
                        domainName: s3Bucket.bucketWebsiteDomainName,
                        originProtocolPolicy: cloudfront.OriginProtocolPolicy.HTTP_ONLY,
                    },          
                    // behaviors : [ {isDefaultBehavior: true} ],
                    behaviors : [ behavior ],
                }
            ],
            viewerCertificate: cloudfront.ViewerCertificate.fromAcmCertificate(
                tslCert,
                {
                    aliases: [ subDomain + '.monkeytronics.co.nz' ],
                    // securityPolicy: cloudfront.SecurityPolicyProtocol.SSL_V3, // default
                    securityPolicy: cloudfront.SecurityPolicyProtocol.TLS_V1_2_2021,
                    sslMethod: cloudfront.SSLMethod.SNI, // default
                },
            ),
        });

Error

Gives the following error, which I can't unpick...

    Error: There can only be one default behavior across all sources. [ One default behavior per distribution ].
        at new CloudFrontWebDistribution (D:\MonkeySource\2-Cloud\cdk_stacks\node_modules\aws-cdk-lib\aws-cloudfront\lib\web-distribution.js:1:6631)
        at new StaticSite (D:\MonkeySource\2-Cloud\cdk_stacks\lib\factory\static-site\static-site-factory.ts:120:42)
        at new SnWebStack (D:\MonkeySource\2-Cloud\cdk_stacks\lib\sn-web-stack.ts:57:7)
        at Object.<anonymous> (D:\MonkeySource\2-Cloud\cdk_stacks\bin\cdk.ts:19:1)
        at Module._compile (node:internal/modules/cjs/loader:1101:14)
        at Module.m._compile (D:\MonkeySource\2-Cloud\cdk_stacks\node_modules\ts-node\src\index.ts:1056:23)
        at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
        at Object.require.extensions.<computed> [as .ts] (D:\MonkeySource\2-Cloud\cdk_stacks\node_modules\ts-node\src\index.ts:1059:12)
        at Module.load (node:internal/modules/cjs/loader:981:32)
        at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    
    Subprocess exited with error 1

Upvotes: 2

Views: 1150

Answers (2)

dead_webdev
dead_webdev

Reputation: 256

It means that you need to have only single default behavior.

But you can add multiple behaviors.

Cloudfront let's you create multiple behaviors and origins, which then can be used for multiple purposes.

Check the examples here

https://kuchbhilearning.blogspot.com/2022/10/add-cloudfront-behavior-and-origin.html

https://kuchbhilearning.blogspot.com/2022/10/api-gateway-and-cloud-front-in-same.html

Upvotes: 0

Andrew Gillis
Andrew Gillis

Reputation: 3865

The error message is misleading. You are getting it because you have no default behavior configured.

{
    isDefaultBehavior: true, // <-- This needs to be true for one behavior
    functionAssociations: [{
        eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,
        function: cfFunct
    }] 
}

Upvotes: 2

Related Questions