From a76c0f50b6d640476ebff076f5ad34a5dc348c13 Mon Sep 17 00:00:00 2001 From: Michael Wunderlich Date: Wed, 22 Apr 2026 05:54:23 +0000 Subject: [PATCH] Use shared prereq bucket in all bucket-creating tutorials 7 tutorials updated to check for tutorial-prereqs-bucket CFN stack. If available, uses the shared bucket instead of creating one. Skips bucket deletion in cleanup when using shared bucket. Falls back to creating its own bucket if stack doesn't exist. Tested: detection works with and without the stack deployed. --- tuts/003-s3-gettingstarted/REVISION-HISTORY.md | 5 +++++ tuts/003-s3-gettingstarted/s3-gettingstarted.sh | 16 ++++++++++++++-- .../REVISION-HISTORY.md | 5 +++++ .../cloudfront-gettingstarted.sh | 12 +++++++++++- .../REVISION-HISTORY.md | 5 +++++ .../sagemaker-featurestore.sh | 12 +++++++++++- tuts/037-emr-gs/REVISION-HISTORY.md | 5 +++++ tuts/037-emr-gs/emr-gs.sh | 12 +++++++++++- tuts/053-aws-config-gs/REVISION-HISTORY.md | 5 +++++ tuts/053-aws-config-gs/aws-config-gs.sh | 16 ++++++++++++++-- tuts/061-amazon-athena-gs/REVISION-HISTORY.md | 5 +++++ tuts/061-amazon-athena-gs/amazon-athena-gs.sh | 12 +++++++++++- tuts/074-amazon-textract-gs/REVISION-HISTORY.md | 5 +++++ .../amazon-textract-getting-started.sh | 12 +++++++++++- 14 files changed, 118 insertions(+), 9 deletions(-) diff --git a/tuts/003-s3-gettingstarted/REVISION-HISTORY.md b/tuts/003-s3-gettingstarted/REVISION-HISTORY.md index 38f36f58..8fc38bc8 100644 --- a/tuts/003-s3-gettingstarted/REVISION-HISTORY.md +++ b/tuts/003-s3-gettingstarted/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - Remove SDK content from CFN branch (belongs on SDK branches) + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/003-s3-gettingstarted/s3-gettingstarted.sh b/tuts/003-s3-gettingstarted/s3-gettingstarted.sh index 9c6bd096..ef6f1b74 100755 --- a/tuts/003-s3-gettingstarted/s3-gettingstarted.sh +++ b/tuts/003-s3-gettingstarted/s3-gettingstarted.sh @@ -20,7 +20,17 @@ fi # ============================================================================ UNIQUE_ID=$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 12 | head -n 1) -BUCKET_NAME="s3api-${UNIQUE_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $BUCKET_NAME" +else + BUCKET_IS_SHARED=false + BUCKET_NAME="s3api-${UNIQUE_ID}" +fi TEMP_DIR=$(mktemp -d) LOG_FILE="${TEMP_DIR}/s3-gettingstarted.log" @@ -83,7 +93,9 @@ cleanup() { fi echo "Deleting bucket: ${BUCKET_NAME}" - aws s3api delete-bucket --bucket "$BUCKET_NAME" 2>&1 || echo "WARNING: Failed to delete bucket ${BUCKET_NAME}" + if [ "$BUCKET_IS_SHARED" = "false" ]; then + aws s3api delete-bucket --bucket "$BUCKET_NAME" 2>&1 || echo "WARNING: Failed to delete bucket ${BUCKET_NAME}" + fi echo "" echo "Cleaning up temp directory: ${TEMP_DIR}" diff --git a/tuts/005-cloudfront-gettingstarted/REVISION-HISTORY.md b/tuts/005-cloudfront-gettingstarted/REVISION-HISTORY.md index 6bce4542..a446e5a6 100644 --- a/tuts/005-cloudfront-gettingstarted/REVISION-HISTORY.md +++ b/tuts/005-cloudfront-gettingstarted/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - Remove SDK content from CFN branch (belongs on SDK branches) + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/005-cloudfront-gettingstarted/cloudfront-gettingstarted.sh b/tuts/005-cloudfront-gettingstarted/cloudfront-gettingstarted.sh index 42a0f7ff..56bcdb59 100755 --- a/tuts/005-cloudfront-gettingstarted/cloudfront-gettingstarted.sh +++ b/tuts/005-cloudfront-gettingstarted/cloudfront-gettingstarted.sh @@ -106,7 +106,17 @@ cleanup() { # Generate a random identifier for the bucket name RANDOM_ID=$(openssl rand -hex 6) -BUCKET_NAME="cloudfront-${RANDOM_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $BUCKET_NAME" +else + BUCKET_IS_SHARED=false + BUCKET_NAME="cloudfront-${RANDOM_ID}" +fi echo "Using bucket name: $BUCKET_NAME" # Create a temporary directory for content diff --git a/tuts/028-sagemaker-featurestore/REVISION-HISTORY.md b/tuts/028-sagemaker-featurestore/REVISION-HISTORY.md index 219d7337..4470d2ab 100644 --- a/tuts/028-sagemaker-featurestore/REVISION-HISTORY.md +++ b/tuts/028-sagemaker-featurestore/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - unordered list bullets and trailing whitespace + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/028-sagemaker-featurestore/sagemaker-featurestore.sh b/tuts/028-sagemaker-featurestore/sagemaker-featurestore.sh index d14a1b13..973c86c6 100755 --- a/tuts/028-sagemaker-featurestore/sagemaker-featurestore.sh +++ b/tuts/028-sagemaker-featurestore/sagemaker-featurestore.sh @@ -201,7 +201,17 @@ if [ -z "$REGION" ]; then else echo "Using region: $REGION" fi -S3_BUCKET_NAME="sagemaker-featurestore-${RANDOM_ID}-${ACCOUNT_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + S3_BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $S3_BUCKET_NAME" +else + BUCKET_IS_SHARED=false + S3_BUCKET_NAME="sagemaker-featurestore-${RANDOM_ID}-${ACCOUNT_ID}" +fi PREFIX="featurestore-tutorial" CURRENT_TIME=$(date +%s) diff --git a/tuts/037-emr-gs/REVISION-HISTORY.md b/tuts/037-emr-gs/REVISION-HISTORY.md index ec023214..df66dbe0 100644 --- a/tuts/037-emr-gs/REVISION-HISTORY.md +++ b/tuts/037-emr-gs/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - security and consistency updates + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/037-emr-gs/emr-gs.sh b/tuts/037-emr-gs/emr-gs.sh index e9748640..b7d46bf4 100755 --- a/tuts/037-emr-gs/emr-gs.sh +++ b/tuts/037-emr-gs/emr-gs.sh @@ -63,7 +63,17 @@ cleanup() { # Generate a random identifier for S3 bucket RANDOM_ID=$(openssl rand -hex 6) -BUCKET_NAME="emr${RANDOM_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $BUCKET_NAME" +else + BUCKET_IS_SHARED=false + BUCKET_NAME="emr${RANDOM_ID}" +fi echo "Using bucket name: $BUCKET_NAME" # Create S3 bucket diff --git a/tuts/053-aws-config-gs/REVISION-HISTORY.md b/tuts/053-aws-config-gs/REVISION-HISTORY.md index b54c697c..54a716c0 100644 --- a/tuts/053-aws-config-gs/REVISION-HISTORY.md +++ b/tuts/053-aws-config-gs/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - unordered list bullets and trailing whitespace + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/053-aws-config-gs/aws-config-gs.sh b/tuts/053-aws-config-gs/aws-config-gs.sh index e9df7b3f..67401e75 100755 --- a/tuts/053-aws-config-gs/aws-config-gs.sh +++ b/tuts/053-aws-config-gs/aws-config-gs.sh @@ -78,7 +78,9 @@ cleanup_resources() { aws s3 rm "s3://$S3_BUCKET_NAME" --recursive 2>/dev/null || true echo "Deleting S3 bucket..." - aws s3api delete-bucket --bucket "$S3_BUCKET_NAME" 2>/dev/null || true + if [ "$BUCKET_IS_SHARED" = "false" ]; then + aws s3api delete-bucket --bucket "$S3_BUCKET_NAME" 2>/dev/null || true + fi fi } @@ -118,7 +120,17 @@ RANDOM_ID=$(generate_random_id) echo "Generated random identifier: $RANDOM_ID" # Step 1: Create an S3 bucket -S3_BUCKET_NAME="configservice-${RANDOM_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + S3_BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $S3_BUCKET_NAME" +else + BUCKET_IS_SHARED=false + S3_BUCKET_NAME="configservice-${RANDOM_ID}" +fi echo "Creating S3 bucket: $S3_BUCKET_NAME" # Get the current region diff --git a/tuts/061-amazon-athena-gs/REVISION-HISTORY.md b/tuts/061-amazon-athena-gs/REVISION-HISTORY.md index 6c97e5ef..ff95137c 100644 --- a/tuts/061-amazon-athena-gs/REVISION-HISTORY.md +++ b/tuts/061-amazon-athena-gs/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - use specific athena sample data bucket + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/061-amazon-athena-gs/amazon-athena-gs.sh b/tuts/061-amazon-athena-gs/amazon-athena-gs.sh index 879bf5ae..d7abdf48 100755 --- a/tuts/061-amazon-athena-gs/amazon-athena-gs.sh +++ b/tuts/061-amazon-athena-gs/amazon-athena-gs.sh @@ -34,7 +34,17 @@ handle_error() { # Generate a random identifier for S3 bucket RANDOM_ID=$(openssl rand -hex 6) -S3_BUCKET="athena-${RANDOM_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + S3_BUCKET="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $S3_BUCKET" +else + BUCKET_IS_SHARED=false + S3_BUCKET="athena-${RANDOM_ID}" +fi DATABASE_NAME="mydatabase" TABLE_NAME="cloudfront_logs" diff --git a/tuts/074-amazon-textract-gs/REVISION-HISTORY.md b/tuts/074-amazon-textract-gs/REVISION-HISTORY.md index cd5b3cd5..5d295a9b 100644 --- a/tuts/074-amazon-textract-gs/REVISION-HISTORY.md +++ b/tuts/074-amazon-textract-gs/REVISION-HISTORY.md @@ -10,3 +10,8 @@ - Type: functional - security and consistency updates + +### 2026-04-22 v2 shared bucket +- Type: functional +- Script checks for prereq bucket stack before creating its own S3 bucket +- Skips bucket deletion if using shared bucket diff --git a/tuts/074-amazon-textract-gs/amazon-textract-getting-started.sh b/tuts/074-amazon-textract-gs/amazon-textract-getting-started.sh index 6116eb20..abffcb02 100644 --- a/tuts/074-amazon-textract-gs/amazon-textract-getting-started.sh +++ b/tuts/074-amazon-textract-gs/amazon-textract-getting-started.sh @@ -81,7 +81,17 @@ fi # Generate a random identifier for S3 bucket RANDOM_ID=$(openssl rand -hex 6) -BUCKET_NAME="textract-${RANDOM_ID}" +# Check for shared prereq bucket +PREREQ_BUCKET=$(aws cloudformation describe-stacks --stack-name tutorial-prereqs-bucket \ + --query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue' --output text 2>/dev/null) +if [ -n "$PREREQ_BUCKET" ] && [ "$PREREQ_BUCKET" != "None" ]; then + BUCKET_NAME="$PREREQ_BUCKET" + BUCKET_IS_SHARED=true + echo "Using shared bucket: $BUCKET_NAME" +else + BUCKET_IS_SHARED=false + BUCKET_NAME="textract-${RANDOM_ID}" +fi DOCUMENT_NAME="document.png" RESOURCES_CREATED=()