Skip to content

Commit 9b89aaf

Browse files
authored
Redshift Serverless test infrastructure (#1588)
1 parent 14e4402 commit 9b89aaf

File tree

5 files changed

+144
-59
lines changed

5 files changed

+144
-59
lines changed

test_infra/app.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
11
#!/usr/bin/env python3
2-
from aws_cdk import App
2+
import os
3+
4+
from aws_cdk import App, Environment
35
from stacks.base_stack import BaseStack
46
from stacks.databases_stack import DatabasesStack
57
from stacks.lakeformation_stack import LakeFormationStack
68
from stacks.opensearch_stack import OpenSearchStack
79

810
app = App()
911

10-
base = BaseStack(app, "aws-sdk-pandas-base")
12+
env = {"env": Environment(account=os.environ["CDK_DEFAULT_ACCOUNT"], region=os.environ["CDK_DEFAULT_REGION"])}
13+
14+
base = BaseStack(
15+
app,
16+
"aws-sdk-pandas-base",
17+
**env,
18+
)
1119

1220
DatabasesStack(
1321
app,
1422
"aws-sdk-pandas-databases",
1523
base.get_vpc,
1624
base.get_bucket,
1725
base.get_key,
26+
**env,
1827
)
1928

20-
LakeFormationStack(app, "aws-sdk-pandas-lakeformation")
29+
LakeFormationStack(
30+
app,
31+
"aws-sdk-pandas-lakeformation",
32+
**env,
33+
)
2134

2235
OpenSearchStack(
2336
app,
2437
"aws-sdk-pandas-opensearch",
2538
base.get_vpc,
2639
base.get_bucket,
2740
base.get_key,
41+
**env,
2842
)
2943

3044
app.synth()

test_infra/poetry.lock

Lines changed: 73 additions & 50 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test_infra/pyproject.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ license = "Apache License 2.0"
77

88
[tool.poetry.dependencies]
99
python = ">=3.7.1, <3.11"
10-
"aws-cdk-lib" = "^2.20.0"
11-
"constructs" = "^10.0.119"
12-
"aws-cdk.aws-glue-alpha" = "^2.20.0a0"
13-
"aws-cdk.aws-redshift-alpha" = "^2.20.0a0"
14-
"aws-cdk.aws-neptune-alpha" = "^2.20.0a0"
10+
"aws-cdk-lib" = "^2.35.0"
11+
"constructs" = "^10.1.67"
12+
"aws-cdk.aws-glue-alpha" = "^2.35.0a0"
13+
"aws-cdk.aws-redshift-alpha" = "^2.35.0a0"
14+
"aws-cdk.aws-neptune-alpha" = "^2.35.0a0"

test_infra/stacks/base_stack.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs: str) -> None:
9696
value=self.vpc.public_subnets[1].subnet_id,
9797
export_name="aws-sdk-pandas-base-PublicSubnet2",
9898
)
99+
CfnOutput(
100+
self,
101+
"PublicSubnet3",
102+
value=self.vpc.public_subnets[2].subnet_id,
103+
export_name="aws-sdk-pandas-base-PublicSubnet3",
104+
)
99105
CfnOutput(
100106
self,
101107
"PrivateSubnet",

test_infra/stacks/databases_stack.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from aws_cdk import aws_neptune_alpha as neptune
1010
from aws_cdk import aws_rds as rds
1111
from aws_cdk import aws_redshift_alpha as redshift
12+
from aws_cdk import aws_redshiftserverless as redshiftserverless
1213
from aws_cdk import aws_s3 as s3
1314
from aws_cdk import aws_secretsmanager as secrets
1415
from aws_cdk import aws_ssm as ssm
@@ -42,6 +43,7 @@ def __init__(
4243
self._set_catalog_encryption()
4344
if databases_context["redshift"]:
4445
self._setup_redshift()
46+
self._setup_redshift_serverless()
4547
if databases_context["postgresql"]:
4648
self._setup_postgresql()
4749
if databases_context["mysql"]:
@@ -297,6 +299,46 @@ def _setup_redshift(self) -> None:
297299
CfnOutput(self, "RedshiftSchema", value=schema)
298300
CfnOutput(self, "RedshiftRole", value=redshift_role.role_arn)
299301

302+
def _setup_redshift_serverless(self) -> None:
303+
database = "test"
304+
redshift_cfn_namespace = redshiftserverless.CfnNamespace(
305+
self,
306+
"aws-sdk-pandas-redshift-serverless-namespace",
307+
namespace_name="aws-sdk-pandas-redshift-serverless-namespace",
308+
admin_username=self.db_username,
309+
admin_user_password=self.db_password,
310+
db_name=database,
311+
)
312+
redshift_cfn_workgroup = redshiftserverless.CfnWorkgroup(
313+
self,
314+
"aws-sdk-pandas-redshift-serverless-workgroup",
315+
workgroup_name="aws-sdk-pandas-redshift-serverless-workgroup",
316+
namespace_name=redshift_cfn_namespace.namespace_name,
317+
publicly_accessible=True,
318+
security_group_ids=[self.db_security_group.security_group_id],
319+
subnet_ids=[subnet.subnet_id for subnet in self.vpc.public_subnets],
320+
)
321+
redshift_cfn_workgroup.node.add_dependency(redshift_cfn_namespace)
322+
secret = secrets.Secret(
323+
self,
324+
"aws-sdk-pandas-redshift-serverless-secret",
325+
secret_name="aws-sdk-pandas/redshift-serverless",
326+
description="Redshift Serverless credentials",
327+
generate_secret_string=secrets.SecretStringGenerator(
328+
generate_string_key="dummy",
329+
secret_string_template=json.dumps(
330+
{
331+
"username": self.db_username,
332+
"password": self.db_password,
333+
"engine": "redshift-serverless",
334+
}
335+
),
336+
),
337+
)
338+
CfnOutput(self, "RedshiftServerlessSecretArn", value=secret.secret_arn)
339+
CfnOutput(self, "RedshiftServerlessWorkgroup", value=redshift_cfn_workgroup.workgroup_name)
340+
CfnOutput(self, "RedshiftServerlessDatabase", value=database)
341+
300342
def _setup_postgresql(self) -> None:
301343
port = 3306
302344
database = "postgres"
@@ -483,7 +525,7 @@ def _setup_mysql_serverless(self) -> None:
483525
),
484526
backup_retention=Duration.days(1),
485527
vpc=self.vpc,
486-
vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT),
528+
vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS),
487529
subnet_group=self.rds_subnet_group,
488530
security_groups=[self.db_security_group],
489531
enable_data_api=True,

0 commit comments

Comments
 (0)