Search code examples
pythonpostgresqlamazon-rds

Amazon Aurora PostgreSQL instance creation using CDK in python


I want to create Aurora PostgreSQL cluster and DB instance using CDK in python. I have gone through to the documents but unable to create it. Following is the code

import json

from constructs import Construct
from aws_cdk import (
Stack,
aws_secretsmanager as asm,
aws_ssm as ssm,
aws_rds as rds,
)

from settings import settings


class DatabaseDeploymentStack(Stack):

def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
    super().__init__(scope, construct_id, **kwargs)

    stage_name = settings.stage
    region = Stack.of(self).region
    account = Stack.of(self).account

    db_username = 'customdbuser' #settings.db_username
    db_name = f'netsol_{stage_name}_db'
    db_resource_prefix = f'netsol-{region}-{stage_name}'

    print(db_resource_prefix)

    is_staging: bool = stage_name == 'staging'

    generated_secret_string = asm.SecretStringGenerator(
        secret_string_template=json.dumps({"username": f"{db_username}"}),
        exclude_punctuation=True,
        include_space=False,            
        generate_string_key='password'
    )

    db_credentials_secret = asm.Secret(
        self, 'db_credentials_secret',
        secret_name=f'{db_resource_prefix}-credentials',
        generate_secret_string=generated_secret_string
    )

    ssm.StringParameter(
        self, 'db_credentials_arn',
        parameter_name=f'{db_resource_prefix}-credentials-arn',
        string_value=db_credentials_secret.secret_arn
    )

    scaling_configuration = rds.CfnDBCluster.ScalingConfigurationProperty(
        auto_pause=True,
        max_capacity=4 if is_staging else 384,
        min_capacity=2,
        seconds_until_auto_pause=900 if is_staging else 10800
    )

    db_cluster = rds.CfnDBCluster(
        self, 'db_cluster',
        db_cluster_identifier=f'{db_resource_prefix}-clusterabz',
        engine_mode='serverless',
        engine='aurora-postgresql',            
        engine_version='10.14',
        enable_http_endpoint=True,
        database_name=db_name,
        master_username='abz', 
        master_user_password='Password123',
        backup_retention_period=1 if is_staging else 30,
        scaling_configuration=scaling_configuration,
        deletion_protection=False if is_staging else False
        
    )

    db_cluster_arn = f'arn:aws:rds:{region}:{account}:cluster:{db_cluster.ref}'

    ssm.StringParameter(
        self, 'db_resource_arn',
        parameter_name=f'{db_resource_prefix}-resource-arn',
        string_value=db_cluster_arn
    )

    cfn_dBInstance = rds.CfnDBInstance(
        self, "db_instance",
        db_instance_class="db.t3.medium",
        
        )

When I run this code then found following error.

"db_instance (dbinstance) Property AllocatedStorage cannot be empty"

I have gone through aws documents which says that this property is not required for amazon aurora. Moreover, I have also tried by giving this property along with other properties but still not able to create the instance

Can anyone help me to figure out the problem please?

Note: When I run the code without db instance then cluster created successfully.

Required Output Required output is required as per below image. Aurora postgreSQL


Solution

  • After spending some time I figured out the issue. Following are the details:

    Actually code was perfect if I execute DB cluster and DB instance separately but when I execute the whole code then system was trying to crate the DB instance before creating the DB cluster. And because of that system showing error.

    Problem was resolved after creating the dependency like below.

    cfn_dBInstance.add_depends_on(db_cluster)
    

    Above line ensures that DB instance will only be crated once DB cluster will be successfully created.