Skip to content

Commit 14334ef

Browse files
committed
use cdk context instead of CfnParameter
1 parent f7da03f commit 14334ef

8 files changed

+45
-60
lines changed

README.md

+17-25
Original file line numberDiff line numberDiff line change
@@ -60,40 +60,32 @@ For more information about how to create a package for Amazon Lambda Layer, see
6060

6161
### Deploy
6262

63-
At this point you can now synthesize the CloudFormation template for this code.
63+
Before to synthesize the CloudFormation template for this code, you should update `cdk.context.json` file.<br/>
64+
In particular, you need to fill the s3 location of the previously created lambda lay codes.
65+
66+
For example,
67+
<pre>
68+
{
69+
"firehose_data_tranform_lambda": {
70+
"s3_bucket_name": "<i>lambda-layer-resources</i>",
71+
"s3_object_key": "<i>var/fastavro-lib.zip</i>"
72+
},
73+
....
74+
}
75+
</pre>
76+
77+
Now you are ready to synthesize the CloudFormation template for this code.<br/>
6478

6579
<pre>
6680
(.venv) $ export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
6781
(.venv) $ export CDK_DEFAULT_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)
68-
(.venv) $ cdk synth WebAnalyticsVpc
69-
(.venv) $ cdk synth WebAnalyticsKdsProxyApiGw
70-
(.venv) $ cdk synth WebAnalyticsKinesisStream \
71-
--parameters KinesisStreamName=<i>'your-kinesis-data-stream-name'</i> \
72-
(.venv) $ cdk synth WebAnalyticsFirehoseDataTransformLambda \
73-
--parameters LambdaLayerCodeS3BucketName=<i>'your-s3-bucket-name-for-lambda-layer-code'</i> \
74-
--parameters LambdaLayerCodeS3ObjectKey=<i>'your-s3-object-key-for-lambda-layer-code'</i>
75-
(.venv) $ cdk synth WebAnalyticsFirehose \
76-
--parameters FirehoseStreamName=<i>'your-delivery-stream-name'</i>
77-
(.venv) $ cdk synth WebAnalyticsAthenaWorkGroup
78-
(.venv) $ cdk synth WebAnalyticsMergeSmallFiles
79-
(.venv) $ cdk synth WebAnalyticsAthenaNamedQueries
82+
(.venv) $ cdk synth --all
8083
</pre>
8184

8285
Use `cdk deploy` command to create the stack shown above.
8386

8487
<pre>
85-
(.venv) $ cdk deploy --require-approval never WebAnalyticsVpc
86-
(.venv) $ cdk deploy --require-approval never WebAnalyticsKdsProxyApiGw
87-
(.venv) $ cdk deploy --require-approval never WebAnalyticsKinesisStream \
88-
--parameters KinesisStreamName=<i>'your-kinesis-data-stream-name'</i> \
89-
(.venv) $ cdk deploy --require-approval never WebAnalyticsFirehoseDataTransformLambda \
90-
--parameters LambdaLayerCodeS3BucketName=<i>'your-s3-bucket-name-for-lambda-layer-code'</i> \
91-
--parameters LambdaLayerCodeS3ObjectKey=<i>'your-s3-object-key-for-lambda-layer-code'</i>
92-
(.venv) $ cdk deploy --require-approval never WebAnalyticsFirehose \
93-
--parameters FirehoseStreamName=<i>'your-delivery-stream-name'</i>
94-
(.venv) $ cdk deploy --require-approval never WebAnalyticsAthenaWorkGroup
95-
(.venv) $ cdk deploy --require-approval never WebAnalyticsMergeSmallFiles
96-
(.venv) $ cdk deploy --require-approval never WebAnalyticsAthenaNamedQueries
88+
(.venv) $ cdk deploy --require-approval never --all
9789
</pre>
9890

9991
To add additional dependencies, for example other CDK libraries, just add

app.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,33 @@
2626

2727
firehose_data_transform_lambda = FirehoseDataTransformLambdaStack(app,
2828
'WebAnalyticsFirehoseDataTransformLambda')
29+
firehose_data_transform_lambda.add_dependency(vpc_stack)
2930

3031
firehose_stack = FirehoseStack(app, 'WebAnalyticsFirehose',
3132
kds_stack.target_kinesis_stream.stream_arn,
3233
firehose_data_transform_lambda.schema_validator_lambda_fn)
34+
firehose_stack.add_dependency(kds_stack)
35+
firehose_stack.add_dependency(firehose_data_transform_lambda)
3336

3437
athena_work_group_stack = AthenaWorkGroupStack(app,
3538
'WebAnalyticsAthenaWorkGroup'
3639
)
40+
athena_work_group_stack.add_dependency(firehose_stack)
3741

3842
merge_small_files_stack = MergeSmallFilesLambdaStack(app,
3943
'WebAnalyticsMergeSmallFiles',
4044
firehose_stack.s3_dest_bucket_name,
4145
firehose_stack.s3_dest_folder_name,
4246
athena_work_group_stack.athena_work_group_name
4347
)
48+
merge_small_files_stack.add_dependency(athena_work_group_stack)
4449

45-
AthenaNamedQueryStack(app,
50+
athena_named_query_stack = AthenaNamedQueryStack(app,
4651
'WebAnalyticsAthenaNamedQueries',
4752
athena_work_group_stack.athena_work_group_name,
4853
merge_small_files_stack.s3_json_location,
4954
merge_small_files_stack.s3_parquet_location
5055
)
56+
athena_named_query_stack.add_dependency(merge_small_files_stack)
5157

5258
app.synth()

cdk.context.json

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
{
2+
"firehose_data_tranform_lambda": {
3+
"s3_bucket_name": "s3-bucket-name-for-lambda-layer-resources",
4+
"s3_object_key": "var/fastavro-lib.zip"
5+
},
26
"firehose": {
37
"buffer_size_in_mbs": 128,
48
"buffer_interval_in_seconds": 300,

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
aws-cdk-lib==2.53.0
1+
aws-cdk-lib==2.55.1
22
constructs>=10.0.0,<11.0.0

web_analytics/athena_workgroup.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,7 @@ class AthenaWorkGroupStack(Stack):
2121
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
2222
super().__init__(scope, construct_id, **kwargs)
2323

24-
ATHENA_WORK_GROUP_NAME = cdk.CfnParameter(self, 'AthenaWorkGroupName',
25-
type='String',
26-
description='Amazon Athena Workgroup Name',
27-
default='WebAnalyticsGroup'
28-
)
24+
ATHENA_WORK_GROUP_NAME = self.node.try_get_context('athena_workgroup_name') or 'WebAnalyticsGroup'
2925

3026
S3_BUCKET_SUFFIX = ''.join(random.sample((string.ascii_lowercase + string.digits), k=7))
3127
s3_bucket = s3.Bucket(self, "s3bucket",
@@ -34,15 +30,15 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
3430
region=cdk.Aws.REGION, suffix=S3_BUCKET_SUFFIX))
3531

3632
athena_cfn_work_group = aws_athena.CfnWorkGroup(self, 'AthenaCfnWorkGroup',
37-
name=ATHENA_WORK_GROUP_NAME.value_as_string,
33+
name=ATHENA_WORK_GROUP_NAME,
3834

3935
# the properties below are optional
4036
description='workgroup for developer',
4137
recursive_delete_option=False,
4238
state='ENABLED', # [DISABLED, ENABLED]
4339
tags=[cdk.CfnTag(
4440
key='Name',
45-
value=ATHENA_WORK_GROUP_NAME.value_as_string
41+
value=ATHENA_WORK_GROUP_NAME
4642
)],
4743
work_group_configuration=aws_athena.CfnWorkGroup.WorkGroupConfigurationProperty(
4844
#XXX: EnforceWorkGroupConfiguration

web_analytics/firehose.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,10 @@ def __init__(self, scope: Construct, construct_id: str, source_kinesis_stream_ar
2727
bucket_name="web-analytics-{region}-{suffix}".format(
2828
region=cdk.Aws.REGION, suffix=S3_BUCKET_SUFFIX))
2929

30-
FIREHOSE_STREAM_NAME = cdk.CfnParameter(self, 'FirehoseStreamName',
31-
type='String',
32-
description='kinesis data firehose name',
33-
default='PUT-S3-{}'.format(''.join(random.sample((string.ascii_letters), k=5)))
34-
)
35-
30+
FIREHOSE_DEFAULT_STREAM_NAME = 'PUT-S3-{}'.format(''.join(random.sample((string.ascii_letters), k=5)))
3631
firehose_config = self.node.try_get_context('firehose')
3732

33+
FIREHOSE_STREAM_NAME = firehose_config.get('stream_name', FIREHOSE_DEFAULT_STREAM_NAME)
3834
FIREHOSE_BUFFER_SIZE = firehose_config['buffer_size_in_mbs']
3935
FIREHOSE_BUFFER_INTERVAL = firehose_config['buffer_interval_in_seconds']
4036
FIREHOSE_LAMBDA_BUFFER_SIZE = firehose_config['lambda_buffer_size_in_mbs']
@@ -87,7 +83,7 @@ def __init__(self, scope: Construct, construct_id: str, source_kinesis_stream_ar
8783
"kinesis:GetRecords"]
8884
))
8985

90-
firehose_log_group_name = f"/aws/kinesisfirehose/{FIREHOSE_STREAM_NAME.value_as_string}"
86+
firehose_log_group_name = f"/aws/kinesisfirehose/{FIREHOSE_STREAM_NAME}"
9187
firehose_role_policy_doc.add_statements(aws_iam.PolicyStatement(
9288
effect=aws_iam.Effect.ALLOW,
9389
#XXX: The ARN will be formatted as follows:
@@ -112,7 +108,7 @@ def __init__(self, scope: Construct, construct_id: str, source_kinesis_stream_ar
112108

113109
firehose_role = aws_iam.Role(self, "KinesisFirehoseDeliveryRole",
114110
role_name="KinesisFirehoseServiceRole-{stream_name}-{region}".format(
115-
stream_name=FIREHOSE_STREAM_NAME.value_as_string, region=cdk.Aws.REGION),
111+
stream_name=FIREHOSE_STREAM_NAME, region=cdk.Aws.REGION),
116112
assumed_by=aws_iam.ServicePrincipal("firehose.amazonaws.com"),
117113
#XXX: use inline_policies to work around https://github.com/aws/aws-cdk/issues/5221
118114
inline_policies={
@@ -179,7 +175,7 @@ def __init__(self, scope: Construct, construct_id: str, source_kinesis_stream_ar
179175
)
180176

181177
firehose_to_s3_delivery_stream = aws_kinesisfirehose.CfnDeliveryStream(self, "KinesisFirehoseToS3",
182-
delivery_stream_name=FIREHOSE_STREAM_NAME.value_as_string,
178+
delivery_stream_name=FIREHOSE_STREAM_NAME,
183179
delivery_stream_type="KinesisStreamAsSource",
184180
kinesis_stream_source_configuration={
185181
"kinesisStreamArn": source_kinesis_stream_arn,

web_analytics/firehose_dtata_transform_lambda.py

+5-11
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,15 @@ class FirehoseDataTransformLambdaStack(Stack):
1717
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
1818
super().__init__(scope, construct_id, **kwargs)
1919

20-
LAMBDA_LAYER_CODE_S3_BUCKET = cdk.CfnParameter(self, 'LambdaLayerCodeS3BucketName',
21-
type='String',
22-
description='S3 bucket for lambda layer codes'
23-
)
24-
25-
LAMBDA_LAYER_CODE_S3_OBJ_KEY = cdk.CfnParameter(self, 'LambdaLayerCodeS3ObjectKey',
26-
type='String',
27-
description='S3 object key for lambda layer codes'
28-
)
20+
firehose_data_transform_lambda_config = self.node.try_get_context('firehose_data_tranform_lambda')
21+
LAMBDA_LAYER_CODE_S3_BUCKET = firehose_data_transform_lambda_config['s3_bucket_name']
22+
LAMBDA_LAYER_CODE_S3_OBJ_KEY = firehose_data_transform_lambda_config['s3_object_key']
2923

30-
s3_lambda_layer_lib_bucket = s3.Bucket.from_bucket_name(self, "LambdaLayerS3Bucket", LAMBDA_LAYER_CODE_S3_BUCKET.value_as_string)
24+
s3_lambda_layer_lib_bucket = s3.Bucket.from_bucket_name(self, "LambdaLayerS3Bucket", LAMBDA_LAYER_CODE_S3_BUCKET)
3125
lambda_lib_layer = aws_lambda.LayerVersion(self, "SchemaValidatorLib",
3226
layer_version_name="fastavro-lib",
3327
compatible_runtimes=[aws_lambda.Runtime.PYTHON_3_9],
34-
code=aws_lambda.Code.from_bucket(s3_lambda_layer_lib_bucket, LAMBDA_LAYER_CODE_S3_OBJ_KEY.value_as_string)
28+
code=aws_lambda.Code.from_bucket(s3_lambda_layer_lib_bucket, LAMBDA_LAYER_CODE_S3_OBJ_KEY)
3529
)
3630

3731
SCHEMA_VALIDATOR_LAMBDA_FN_NAME = "SchemaValidator"

web_analytics/kds.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,13 @@ class KdsStack(Stack):
1919
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
2020
super().__init__(scope, construct_id, **kwargs)
2121

22-
KINESIS_STREAM_NAME = cdk.CfnParameter(self, 'KinesisStreamName',
23-
type='String',
24-
description='kinesis data stream name',
25-
default='PUT-Firehose-{}'.format(''.join(random.sample((string.ascii_letters), k=5)))
26-
)
22+
KINESIS_DEFAULT_STREAM_NAME = 'PUT-Firehose-{}'.format(''.join(random.sample((string.ascii_letters), k=5)))
23+
KINESIS_STREAM_NAME = self.node.try_get_context('kinesis_stream_name') or KINESIS_DEFAULT_STREAM_NAME
2724

2825
source_kinesis_stream = aws_kinesis.Stream(self, "SourceKinesisStreams",
2926
retention_period=Duration.hours(24),
3027
stream_mode=aws_kinesis.StreamMode.ON_DEMAND,
31-
stream_name=KINESIS_STREAM_NAME.value_as_string)
28+
stream_name=KINESIS_STREAM_NAME)
3229

3330
self.target_kinesis_stream = source_kinesis_stream
3431

0 commit comments

Comments
 (0)