diff --git a/infrastructure/stack.py b/infrastructure/stack.py index 466cac4..d2d748b 100644 --- a/infrastructure/stack.py +++ b/infrastructure/stack.py @@ -275,6 +275,25 @@ class IptvManagerStack(Stack): associate_public_ip_address=True, ) + # Ensure instance depends on SSM parameters being created + instance.node.add_dependency(db) + ssm_params = [ + ssm.StringParameter.from_string_parameter_name( + self, "DBHostParamRef", "/iptv-manager/DB_HOST" + ), + ssm.StringParameter.from_string_parameter_name( + self, "DBNameParamRef", "/iptv-manager/DB_NAME" + ), + ssm.StringParameter.from_string_parameter_name( + self, "DBUserParamRef", "/iptv-manager/DB_USER" + ), + ssm.StringParameter.from_string_parameter_name( + self, "DBPassParamRef", "/iptv-manager/DB_PASSWORD" + ), + ] + for param in ssm_params: + instance.node.add_dependency(param) + # Option: 2: Create Elastic IP (not free tier compatible) # eip = ec2.CfnEIP( # self, "IptvManagerEIP", diff --git a/infrastructure/userdata.sh b/infrastructure/userdata.sh index 6d0b389..32e6432 100644 --- a/infrastructure/userdata.sh +++ b/infrastructure/userdata.sh @@ -16,11 +16,32 @@ cd iptv-manager-service # Install Python packages with --ignore-installed to prevent conflicts with RPM packages pip3 install --ignore-installed -r requirements.txt -# Retrieve DB credentials from SSM Parameter Store -export DB_HOST=$(aws ssm get-parameter --name "/iptv-manager/DB_HOST" --query "Parameter.Value" --output text) -export DB_NAME=$(aws ssm get-parameter --name "/iptv-manager/DB_NAME" --query "Parameter.Value" --output text) -export DB_USER=$(aws ssm get-parameter --name "/iptv-manager/DB_USER" --query "Parameter.Value" --output text) -export DB_PASSWORD=$(aws ssm get-parameter --name "/iptv-manager/DB_PASSWORD" --query "Parameter.Value" --output text) +# Retrieve DB credentials from SSM Parameter Store with retries +echo "Attempting to retrieve DB credentials from SSM..." +for i in {1..30}; do + DB_HOST=$(aws ssm get-parameter --name "/iptv-manager/DB_HOST" --query "Parameter.Value" --output text 2>/dev/null) + DB_NAME=$(aws ssm get-parameter --name "/iptv-manager/DB_NAME" --query "Parameter.Value" --output text 2>/dev/null) + DB_USER=$(aws ssm get-parameter --name "/iptv-manager/DB_USER" --query "Parameter.Value" --output text 2>/dev/null) + DB_PASSWORD=$(aws ssm get-parameter --name "/iptv-manager/DB_PASSWORD" --query "Parameter.Value" --output text 2>/dev/null) + + if [ -n "$DB_HOST" ] && [ -n "$DB_NAME" ] && [ -n "$DB_USER" ] && [ -n "$DB_PASSWORD" ]; then + echo "Successfully retrieved all DB credentials" + break + fi + + echo "Waiting for SSM parameters to be available... (attempt $i/30)" + sleep 5 +done + +if [ -z "$DB_HOST" ] || [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASSWORD" ]; then + echo "ERROR: Failed to retrieve all required DB credentials after 30 attempts" + exit 1 +fi + +export DB_HOST +export DB_NAME +export DB_USER +export DB_PASSWORD # Set PGPASSWORD for psql to use export PGPASSWORD=$DB_PASSWORD