Skip to content

Commit 557c0f6

Browse files
committed
[sdlf-dataset][cdk] ability to provide parameter values without CfnParameter
1 parent cbf3f74 commit 557c0f6

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

sdlf-dataset/deployspec.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ deploy:
1212
build:
1313
commands:
1414
- |-
15-
cdk deploy --all --require-approval never --progress events --app "python src/app.py" --outputs-file ./cdk-exports.json \
16-
--no-previous-parameters \
17-
--parameters DatasetStack:pDatasetName="$SEEDFARMER_PARAMETER_DATASET" \
18-
--parameters DatasetStack:pS3Prefix="$SEEDFARMER_PARAMETER_S3_PREFIX"
15+
cdk deploy --all --require-approval never --progress events --app "python src/app.py" --outputs-file ./cdk-exports.json
1916
- seedfarmer metadata convert -f cdk-exports.json || true
2017
destroy:
2118
phases:

sdlf-dataset/src/app.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,15 @@
1212

1313
if project_name:
1414
stack_name = f"{project_name}-{deployment_name}-{module_name}"
15+
param_prefix = "SEEDFARMER_PARAMETER_"
1516
else: # app.py not used in a seedfarmer context somehow
1617
stack_name = "sdlf-dataset"
18+
param_prefix = ""
19+
20+
21+
def _param(name: str, default: str = None) -> str:
22+
return os.getenv(f"{param_prefix}{name}", default)
23+
1724

1825
app = cdk.App()
1926
lakeformation_cicd_stack = cdk.Stack(app, f"{stack_name}-lakeformation")
@@ -33,7 +40,17 @@
3340

3441
stack = cdk.Stack(app, stack_name)
3542
stack.add_dependency(lakeformation_cicd_stack)
36-
stack_dataset = Dataset(stack, "dataset")
43+
stack_dataset = Dataset(
44+
stack,
45+
"dataset",
46+
raw_bucket=_param("RAW_BUCKET"),
47+
stage_bucket=_param("STAGE_BUCKET"),
48+
analytics_bucket=_param("ANALYTICS_BUCKET"),
49+
artifacts_bucket=_param("ARTIFACTS_BUCKET"),
50+
lakeformation_dataaccess_role=_param("LAKEFORMATION_DATAACCESS_ROLE"),
51+
dataset=_param("DATASET"),
52+
s3_prefix=_param("S3_PREFIX"),
53+
)
3754

3855
cdk.CfnOutput(
3956
scope=stack,

sdlf-dataset/src/dataset.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,37 @@
2828
class Dataset(Construct):
2929
external_interface = {}
3030

31-
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
31+
def __init__(
32+
self,
33+
scope: Construct,
34+
id: str,
35+
dataset: str,
36+
s3_prefix: str,
37+
org: str = None,
38+
data_domain: str = None,
39+
raw_bucket: str = None,
40+
stage_bucket: str = None,
41+
analytics_bucket: str = None,
42+
artifacts_bucket: str = None,
43+
lakeformation_dataaccess_role: str = None,
44+
**kwargs,
45+
) -> None:
3246
super().__init__(scope, id)
3347

34-
# using context values would be better(?) for CDK but we haven't decided yet what the story is around ServiceCatalog and CloudFormation modules
35-
# perhaps both (context values feeding into CfnParameter) would be a nice-enough solution. Not sure though. TODO
48+
# if arguments are passed to the constructor, their values are fed to CfnParameter() below as default
49+
# if arguments aren't specified, standard SDLF SSM parameters are checked instead
50+
# the jury is still out on the usage of CfnParameter(),
51+
# and there is still work to get the latest SSM parameter values as well as using a prefix to allow multiple deployments TODO
52+
raw_bucket = raw_bucket or "{{resolve:ssm:/sdlf/storage/rRawBucket:1}}"
53+
stage_bucket = stage_bucket or "{{resolve:ssm:/sdlf/storage/rStageBucket:1}}"
54+
analytics_bucket = analytics_bucket or "{{resolve:ssm:/sdlf/storage/rAnalyticsBucket:1}}"
55+
artifacts_bucket = artifacts_bucket or "{{resolve:ssm:/sdlf/storage/rArtifactsBucket:1}}"
56+
lakeformation_dataaccess_role = (
57+
lakeformation_dataaccess_role or "{{resolve:ssm:/sdlf/storage/rLakeFormationDataAccessRoleArn:1}}"
58+
)
59+
org = org or "{{resolve:ssm:/sdlf/storage/rOrganization:1}}"
60+
data_domain = data_domain or "{{resolve:ssm:/sdlf/storage/rDomain:1}}"
61+
3662
p_pipelinereference = CfnParameter(
3763
self,
3864
"pPipelineReference",
@@ -45,54 +71,54 @@ def __init__(self, scope: Construct, id: str, **kwargs) -> None:
4571
"pOrg",
4672
description="Name of the organization owning the datalake",
4773
type="String",
48-
default="{{resolve:ssm:/sdlf/storage/pOrg:1}}",
74+
default="{{resolve:ssm:/sdlf/storage/rOrganization:1}}",
4975
)
5076
p_org.override_logical_id("pOrg")
5177
p_domain = CfnParameter(
5278
self,
5379
"pDomain",
5480
description="Data domain name",
5581
type="String",
56-
default="{{resolve:ssm:/sdlf/storage/pDomain:1}}",
82+
default="{{resolve:ssm:/sdlf/storage/rDomain:1}}",
5783
)
5884
p_domain.override_logical_id("pDomain")
5985
p_rawbucket = CfnParameter(
6086
self,
6187
"pRawBucket",
6288
description="The raw bucket for the solution",
6389
type="String",
64-
default="{{resolve:ssm:/sdlf/storage/rRawBucket:1}}",
90+
default=raw_bucket,
6591
)
6692
p_rawbucket.override_logical_id("pRawBucket")
6793
p_stagebucket = CfnParameter(
6894
self,
6995
"pStageBucket",
7096
description="The stage bucket for the solution",
7197
type="String",
72-
default="{{resolve:ssm:/sdlf/storage/rStageBucket:1}}",
98+
default=stage_bucket,
7399
)
74100
p_stagebucket.override_logical_id("pStageBucket")
75101
p_analyticsbucket = CfnParameter(
76102
self,
77103
"pAnalyticsBucket",
78104
description="The analytics bucket for the solution",
79105
type="String",
80-
default="{{resolve:ssm:/sdlf/storage/rAnalyticsBucket:1}}",
106+
default=analytics_bucket,
81107
)
82108
p_analyticsbucket.override_logical_id("pAnalyticsBucket")
83109
p_artifactsbucket = CfnParameter(
84110
self,
85111
"pArtifactsBucket",
86112
description="The artifacts bucket used by CodeBuild and CodePipeline",
87113
type="String",
88-
default="{{resolve:ssm:/sdlf/storage/rArtifactsBucket:1}}",
114+
default=artifacts_bucket,
89115
)
90116
p_artifactsbucket.override_logical_id("pArtifactsBucket")
91117
p_lakeformationdataaccessrole = CfnParameter(
92118
self,
93119
"pLakeFormationDataAccessRole",
94120
type="String",
95-
default="{{resolve:ssm:/sdlf/storage/rLakeFormationDataAccessRoleArn:1}}",
121+
default=lakeformation_dataaccess_role,
96122
)
97123
p_lakeformationdataaccessrole.override_logical_id("pLakeFormationDataAccessRole")
98124
p_datasetname = CfnParameter(
@@ -101,6 +127,7 @@ def __init__(self, scope: Construct, id: str, **kwargs) -> None:
101127
description="The name of the dataset (all lowercase, no symbols or spaces)",
102128
type="String",
103129
allowed_pattern="[a-z0-9]{2,14}",
130+
default=dataset,
104131
)
105132
p_datasetname.override_logical_id("pDatasetName")
106133
p_s3prefix = CfnParameter(
@@ -109,6 +136,7 @@ def __init__(self, scope: Construct, id: str, **kwargs) -> None:
109136
description="S3 prefix or full bucket if empty/not provided",
110137
type="String",
111138
allowed_pattern="[a-z0-9]*",
139+
default=s3_prefix,
112140
)
113141
p_s3prefix.override_logical_id("pS3Prefix")
114142
p_cicdrole = CfnParameter(

0 commit comments

Comments
 (0)