@@ -166,54 +166,50 @@ echo "Setting up VPC peering connection..."
166166# Validate AWS CLI
167167validate_aws_cli
168168
169- # Check for existing VPCs
170- echo " Checking for existing VPCs..."
171- EXISTING_VPCS=$( aws ec2 describe-vpcs --region " $AWS_REGION " --query ' Vpcs[?State==`available`].[VpcId,CidrBlock]' --output text 2> /dev/null || echo " " )
172-
173- if [ -z " $EXISTING_VPCS " ]; then
174- echo " No existing VPCs found. Creating new VPCs..."
175- CREATE_VPCS=true
176- else
177- echo " Found existing VPCs:"
178- echo " $EXISTING_VPCS "
179- echo " "
180- echo " Using existing VPCs..."
181- CREATE_VPCS=false
182- # Get the first two available VPCs
183- VPC1_INFO=$( echo " $EXISTING_VPCS " | head -n 1)
184- VPC2_INFO=$( echo " $EXISTING_VPCS " | head -n 2 | tail -n 1)
185-
186- if [ -z " $VPC2_INFO " ]; then
187- echo " Only one VPC found. Creating a second VPC..."
188- VPC1_ID=$( echo " $VPC1_INFO " | awk ' {print $1}' )
189- VPC1_CIDR=$( echo " $VPC1_INFO " | awk ' {print $2}' )
190-
191- # Sanitize extracted values
192- VPC1_ID=$( sanitize_var " $VPC1_ID " ) || check_error 1 " Invalid VPC1_ID format"
193- VPC1_CIDR=$( sanitize_var " $VPC1_CIDR " ) || check_error 1 " Invalid VPC1_CIDR format"
194-
195- validate_cidr " $VPC1_CIDR " || check_error 1 " Invalid VPC1 CIDR"
196- CREATE_VPC2_ONLY=true
197- else
198- VPC1_ID=$( echo " $VPC1_INFO " | awk ' {print $1}' )
199- VPC1_CIDR=$( echo " $VPC1_INFO " | awk ' {print $2}' )
200- VPC2_ID=$( echo " $VPC2_INFO " | awk ' {print $1}' )
201- VPC2_CIDR=$( echo " $VPC2_INFO " | awk ' {print $2}' )
202-
203- # Sanitize extracted values
204- VPC1_ID=$( sanitize_var " $VPC1_ID " ) || check_error 1 " Invalid VPC1_ID format"
205- VPC1_CIDR=$( sanitize_var " $VPC1_CIDR " ) || check_error 1 " Invalid VPC1_CIDR format"
206- VPC2_ID=$( sanitize_var " $VPC2_ID " ) || check_error 1 " Invalid VPC2_ID format"
207- VPC2_CIDR=$( sanitize_var " $VPC2_CIDR " ) || check_error 1 " Invalid VPC2_CIDR format"
208-
209- validate_cidr " $VPC1_CIDR " || check_error 1 " Invalid VPC1 CIDR"
210- validate_cidr " $VPC2_CIDR " || check_error 1 " Invalid VPC2 CIDR"
211- CREATE_VPC2_ONLY=false
169+ # Check VPC quota — need room for up to 2 new VPCs
170+ VPC_COUNT=$( aws ec2 describe-vpcs --region " $AWS_REGION " --query ' length(Vpcs)' --output text 2> /dev/null || echo 99)
171+ VPC_LIMIT=5
172+ VPCS_NEEDED=2
173+
174+ # Check if prereq stack provides a VPC we can use as VPC1
175+ PREREQ_VPC_ID=" "
176+ PREREQ_STACK=$( aws cloudformation describe-stacks --region " $AWS_REGION " --stack-name tutorial-prereqs-vpc-public --query ' Stacks[0].StackStatus' --output text 2> /dev/null || echo " " )
177+ if [[ " $PREREQ_STACK " == " CREATE_COMPLETE" || " $PREREQ_STACK " == " UPDATE_COMPLETE" ]]; then
178+ PREREQ_VPC_ID=$( aws cloudformation describe-stacks --region " $AWS_REGION " --stack-name tutorial-prereqs-vpc-public --query ' Stacks[0].Outputs[?OutputKey==`VpcId`].OutputValue' --output text 2> /dev/null || echo " " )
179+ if [ -n " $PREREQ_VPC_ID " ]; then
180+ echo " Found prereq stack VPC: $PREREQ_VPC_ID (10.0.0.0/16)"
181+ VPCS_NEEDED=1
212182 fi
213183fi
214184
215- # Create VPCs if needed
216- if [ " $CREATE_VPCS " = true ]; then
185+ AVAILABLE=$(( VPC_LIMIT - VPC_COUNT))
186+ if [ " $AVAILABLE " -lt " $VPCS_NEEDED " ]; then
187+ echo " ERROR: Need $VPCS_NEEDED VPC slots but only $AVAILABLE available ($VPC_COUNT /$VPC_LIMIT used in $AWS_REGION )."
188+ echo " Free up VPCs or run in a different region: AWS_REGION=<region> bash $0 "
189+ exit 1
190+ fi
191+
192+ # Set up VPCs
193+ if [ -n " $PREREQ_VPC_ID " ]; then
194+ # Use prereq VPC as VPC1, create VPC2
195+ VPC1_ID=" $PREREQ_VPC_ID "
196+ VPC1_CIDR=" 10.0.0.0/16"
197+ echo " Using prereq stack VPC as VPC1: $VPC1_ID ($VPC1_CIDR )"
198+
199+ echo " Creating VPC2..."
200+ VPC2_ID=$( log_cmd " aws ec2 create-vpc --region '$AWS_REGION ' --cidr-block 10.2.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=VPC2-Peering-Demo}]' --query 'Vpc.VpcId' --output text" )
201+ check_error $? " Failed to create VPC2"
202+ VPC2_ID=$( sanitize_var " $VPC2_ID " ) || check_error 1 " Invalid VPC2_ID returned"
203+ VPC2_CIDR=" 10.2.0.0/16"
204+ CREATED_RESOURCES+=(" VPC2: $VPC2_ID " )
205+ CLEANUP_COMMANDS+=(" aws ec2 delete-vpc --region '$AWS_REGION ' --vpc-id '$VPC2_ID '" )
206+ echo " VPC2 created with ID: $VPC2_ID "
207+
208+ echo " Waiting for VPC2 to be available..."
209+ log_cmd " aws ec2 wait vpc-available --region '$AWS_REGION ' --vpc-ids '$VPC2_ID '"
210+ check_error $? " Timeout waiting for VPC2 to become available"
211+ else
212+ # Create both VPCs
217213 echo " Creating VPC1..."
218214 VPC1_ID=$( log_cmd " aws ec2 create-vpc --region '$AWS_REGION ' --cidr-block 10.1.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=VPC1-Peering-Demo}]' --query 'Vpc.VpcId' --output text" )
219215 check_error $? " Failed to create VPC1"
@@ -222,7 +218,7 @@ if [ "$CREATE_VPCS" = true ]; then
222218 CREATED_RESOURCES+=(" VPC1: $VPC1_ID " )
223219 CLEANUP_COMMANDS+=(" aws ec2 delete-vpc --region '$AWS_REGION ' --vpc-id '$VPC1_ID '" )
224220 echo " VPC1 created with ID: $VPC1_ID "
225-
221+
226222 echo " Creating VPC2..."
227223 VPC2_ID=$( log_cmd " aws ec2 create-vpc --region '$AWS_REGION ' --cidr-block 10.2.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=VPC2-Peering-Demo}]' --query 'Vpc.VpcId' --output text" )
228224 check_error $? " Failed to create VPC2"
@@ -231,26 +227,10 @@ if [ "$CREATE_VPCS" = true ]; then
231227 CREATED_RESOURCES+=(" VPC2: $VPC2_ID " )
232228 CLEANUP_COMMANDS+=(" aws ec2 delete-vpc --region '$AWS_REGION ' --vpc-id '$VPC2_ID '" )
233229 echo " VPC2 created with ID: $VPC2_ID "
234-
235- # Wait for VPCs to be available
230+
236231 echo " Waiting for VPCs to be available..."
237232 log_cmd " aws ec2 wait vpc-available --region '$AWS_REGION ' --vpc-ids '$VPC1_ID ' '$VPC2_ID '"
238233 check_error $? " Timeout waiting for VPCs to become available"
239-
240- elif [ " $CREATE_VPC2_ONLY " = true ]; then
241- echo " Creating VPC2..."
242- VPC2_ID=$( log_cmd " aws ec2 create-vpc --region '$AWS_REGION ' --cidr-block 10.2.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=VPC2-Peering-Demo}]' --query 'Vpc.VpcId' --output text" )
243- check_error $? " Failed to create VPC2"
244- VPC2_ID=$( sanitize_var " $VPC2_ID " ) || check_error 1 " Invalid VPC2_ID returned"
245- VPC2_CIDR=" 10.2.0.0/16"
246- CREATED_RESOURCES+=(" VPC2: $VPC2_ID " )
247- CLEANUP_COMMANDS+=(" aws ec2 delete-vpc --region '$AWS_REGION ' --vpc-id '$VPC2_ID '" )
248- echo " VPC2 created with ID: $VPC2_ID "
249-
250- # Wait for VPC2 to be available
251- echo " Waiting for VPC2 to be available..."
252- log_cmd " aws ec2 wait vpc-available --region '$AWS_REGION ' --vpc-ids '$VPC2_ID '"
253- check_error $? " Timeout waiting for VPC2 to become available"
254234fi
255235
256236echo " Using the following VPCs:"
@@ -263,8 +243,9 @@ log_cmd "aws ec2 describe-vpcs --region '$AWS_REGION' --vpc-ids '$VPC1_ID' '$VPC
263243check_error $? " Failed to verify VPCs"
264244
265245# Determine subnet CIDR blocks based on VPC CIDR blocks
266- VPC1_SUBNET_CIDR=$( echo " $VPC1_CIDR " | sed ' s/0\.0\/16/1.0\/24/' )
267- VPC2_SUBNET_CIDR=$( echo " $VPC2_CIDR " | sed ' s/0\.0\/16/1.0\/24/' )
246+ # Use .100.0/24 to avoid overlap with prereq stack subnets (.1-.4)
247+ VPC1_SUBNET_CIDR=$( echo " $VPC1_CIDR " | sed ' s/0\.0\/16/100.0\/24/' )
248+ VPC2_SUBNET_CIDR=$( echo " $VPC2_CIDR " | sed ' s/0\.0\/16/100.0\/24/' )
268249
269250# Sanitize subnet CIDR blocks
270251VPC1_SUBNET_CIDR=$( sanitize_var " $VPC1_SUBNET_CIDR " ) || check_error 1 " Invalid VPC1_SUBNET_CIDR format"
@@ -382,7 +363,7 @@ echo "Route Table 2 ID: $RTB2_ID"
382363echo " Route Table 2 Association ID: $RTB2_ASSOC_ID "
383364echo " "
384365echo " Created resources:"
385- for resource in " ${CREATED_RESOURCES[@]} " ; do
366+ for resource in " ${CREATED_RESOURCES[@]+ " ${CREATED_RESOURCES[@]} " } " ; do
386367 echo " - $resource "
387368done
388369echo " =============================================="
0 commit comments