From 6383129abf7dabc0cb96b2247521b275d64fa47e Mon Sep 17 00:00:00 2001 From: Rehan Haider Date: Sun, 22 Oct 2023 15:57:06 +0000 Subject: [PATCH] ART: update CDK app --- ...cdk-new-app.md => 50001000-cdk-new-app.md} | 2 +- content/aws/50002000-cdk-update-app.md | 55 ++++++++++++++++++ .../aws/87500000-cdk-api-gateway-route53.md | 1 - .../50002000-cdk-cdk-diff-changes.png | Bin 0 -> 14048 bytes 4 files changed, 56 insertions(+), 2 deletions(-) rename content/aws/{50005000-cdk-new-app.md => 50001000-cdk-new-app.md} (99%) create mode 100644 content/aws/50002000-cdk-update-app.md create mode 100644 content/images/aws-academy/50002000-cdk-cdk-diff-changes.png diff --git a/content/aws/50005000-cdk-new-app.md b/content/aws/50001000-cdk-new-app.md similarity index 99% rename from content/aws/50005000-cdk-new-app.md rename to content/aws/50001000-cdk-new-app.md index 2ac5e09..9f77813 100644 --- a/content/aws/50005000-cdk-new-app.md +++ b/content/aws/50001000-cdk-new-app.md @@ -3,7 +3,7 @@ Date: 2023-10-22 Category: AWS Academy Series: AWS CDK series_index: 4 -Tags: aws, cdk +Tags: aws, cdk, python Author: Rehan Haider Summary: How to create a new CDK app that uses Python as the programming language Keywords: AWS diff --git a/content/aws/50002000-cdk-update-app.md b/content/aws/50002000-cdk-update-app.md new file mode 100644 index 0000000..bb7b5ed --- /dev/null +++ b/content/aws/50002000-cdk-update-app.md @@ -0,0 +1,55 @@ +Title: Update an existing CDK app +Date: 2023-10-22 +Category: AWS Academy +Series: AWS CDK +series_index: 5 +Tags: aws, cdk, python +Author: Rehan Haider +Summary: How to update an existing CDK app +Keywords: AWS + + +In this post, we'll update an existing CDK app that uses Python as the programming language. + +If you haven't created a new CDK app yet, follow the steps in [Creating a new CDK app with Python]({filename}50001000-cdk-new-app.md). + +!!! note + Ensure that [AWS CDK is installed & configured]({filename}00000100-cdk-installing-cdk-sam-cli.md) before proceeding. + +## Updating an existing CDK app + +We can simply update the stack bby modifying the `cdk_app/cdk_app_stack.py` file. + +For example, we can change the retention policy by modifying the `cdk_app/cdk_app_stack.py` file as follows: + +```python + +from aws_cdk import ( + Stack, + aws_s3 as s3, + RemovalPolicy, # New Import +) + +from constructs import Construct + +class CdkAppStack(Stack): + + BUCKET_NAME = "MyFirstBucket" + + def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: + super().__init__(scope, construct_id, **kwargs) + + # Updated code. This will delete the bucket when the stack is deleted + s3.Bucket(self, "MyFirstBucket", removal_policy=RemovalPolicy.DESTROY) +``` + +Check the changes by running `cdk diff`. As you can see below, there is a change in Bucket policy being implemented. + +![CDK diff]({static}/images/aws-academy/50002000-cdk-cdk-diff-changes.png) + + +Now run `cdk deploy` to deploy the changes. When you destroy the stack by running `cdk destroy`, you'll notice that the bucket is deleted as well. + + + + diff --git a/content/aws/87500000-cdk-api-gateway-route53.md b/content/aws/87500000-cdk-api-gateway-route53.md index e2ab94b..7f04753 100644 --- a/content/aws/87500000-cdk-api-gateway-route53.md +++ b/content/aws/87500000-cdk-api-gateway-route53.md @@ -1,7 +1,6 @@ Title: CDK API Gateway with Custom Domain Date: 2022-10-24 Category: AWS Academy -Series: AWS CDK Tags: aws, cdk, python Author: Rehan Haider Summary: Create API Gateway and connect it with a custom domain / subdomain using Route53 diff --git a/content/images/aws-academy/50002000-cdk-cdk-diff-changes.png b/content/images/aws-academy/50002000-cdk-cdk-diff-changes.png new file mode 100644 index 0000000000000000000000000000000000000000..c9464558be905d2cd595063536632b1939f338a0 GIT binary patch literal 14048 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