← Index

Purpose

DDK promotes a trunk based development approach where small changes are frequently applied to the main branch. As a result, this core branch is the one source of truth and the same infrastructure as code is used across multiple environments. However, there is often a need to apply distinct configuration to different environments (i.e. dev, qa, prd…). This How-To guide describes how this can be achieved in the DDK.

Configuration

DDK Core supports environment specific configuration with the usage of the ddk.json file. You can leverage it to apply different configurations to each of your DDK environments.

Example

{
    "environments": {
        "dev": {
            "account": "222222222222",
            "region": "us-east-1",
            "resources": {
                "ddk-bucket": {"versioned": false, "removal_policy": "destroy"},
                "ddk-sqs-lambda-function": {"memory_size": 128},
                "ddk-sqs-lambda-queue": {"retention_period": 5040}
            },
            "tags": {"CostCenter": "1984"}
        },
        "prod": {
            "account": "333333333333",
            "region": "us-east-1",
            "resources": {
                "ddk-bucket": {"versioned": true, "removal_policy": "retain"},
                "ddk-sqs-lambda-function": {"memory_size": 512},
                "ddk-sqs-lambda-queue": {"retention_period": 10080}
            },
            "tags": {"CostCenter": "2014"}
        }
    }
}

For instance, based on the above configuration, the DDK Lambda function resource with id ddk-sqs-lambda-function has a memory size of 128 Mb in in the dev environment compared to 512 in the prod environment.

Implementation

Most DDK constructs can be configured via ddk.json. For example, the DDK BaseStack class allows the following parameters:

prefix: str
qualifier: str
termination_protection: str
tags: Dict[str, str]

If the construct supports environment configuration, it will be listed in the documentation under Supported DDK Environment Configuration. See the API Documentation for a list of DDK constructs.

Resource Specific Configuration

Resource specific configuration can be set in ddk.json within the resources{} object of any given environment. For example given a configuration:

{
    "environments": {
        "test": {
            "account": "444444444444",
            "region": "us-east-1",
            "resources": {
                "ddk-glue-transform-job": {"timeout": 300, "worker_count": 2},
            }
        }
    }
}

Any underlying CDK resource matching the id: “ddk-glue-transform-job” would be passed the properties “timeout” and “worker_count” in the test environment.

Property Precedence

Explicit properties will always take precedence over config values.

# A DDK resource is configured with an explicit property 'shard_count'
data_stream = KinesisStreamsFactory.data_stream(
    self, id=f"example-data-stream", environment_id=environment_id, shard_count=10
)

The above Kinesis Data Stream will be created with value ‘shard_count=10’ even if ddk.json has a different value

This configuration value would be overridden

{
    "environments": {
        "test": {
            "account": "3333333333333",
            "region": "us-east-1",
            "resources": {
                "example-data-stream": {"shard_count": 5},
            }
        }
    }
}