Develop Serverless Applications on Cloud Run

Solution for Develop Serverless Applications on Cloud Run. 1 lab: GSP328. Fast copy-paste commands for Google Cloud.

GSP328 — Develop Serverless Applications on Cloud Run: Challenge Lab

Estimated time: 1 hour 15 minutes

# 🚀 Develop Serverless Applications on Cloud Run: Challenge Lab > ⚠️ **Disclaimer:** This guide is for educational purposes only, intended to help you understand Google Cloud services and prepare for certifications. Always follow Qwiklabs' terms of service. ## 🛠️ Step-by-Step Guide ### 🔹 Step 1 — Open Cloud Shell Open your **Cloud Shell** terminal. ### 🔹 Step 2 — Run the Master Automation Script Copy and paste the **entire script** below into your terminal and press **Enter**. **Comma

clear
CYAN='\e[1;36m'
BLUE='\e[1;34m'
RESET='\e[0m'
BOLD='\e[1m'
GREEN='\e[1;32m'
YELLOW='\e[1;33m'
MAGENTA='\e[1;35m'
WHITE='\e[1;37m'
RED='\e[1;31m'

echo -e "${CYAN}${BOLD}"
cat << "EOF"
  ____       _     _ _    ___   __  ___
 / __ \     | |   (_) |  / _ \ / _|/ _ \
| |  | |_ __| |__  _| |_| | | | |_| | | |_ __  ___
| |  | | '__| '_ \| | __| | | |  _| | | | '_ \/ __|
| |__| | |  | |_) | | |_| |_| | | | |_| | |_) \__ \
 \____/|_|  |_.__/|_|\__|\___/|_|  \___/| .__/|___/
                                        | |
                                        |_|
EOF
echo -e "${RESET}"
echo -e "${BLUE}${BOLD}╔════════════════════════════════════════════════════════════╗${RESET}"
echo -e "${BLUE}${BOLD}║   🚀 BROUGHT TO YOU BY ORBIT OF OPS                        ║${RESET}"
echo -e "${BLUE}${BOLD}╚════════════════════════════════════════════════════════════╝${RESET}\n"

# ==============================================================================
# PRE-FLIGHT CHECKS & VARIABLES
# ==============================================================================
echo -e "${BOLD}${YELLOW}Auto-fetching Project details...${RESET}"

export PROJECT_ID=$(gcloud config get-value project 2>/dev/null)
if [[ -z "$PROJECT_ID" ]]; then
    export PROJECT_ID=$DEVSHELL_PROJECT_ID
fi
gcloud config set project $PROJECT_ID --quiet

export DETECTED_REGION=$(gcloud compute project-info describe \
  --format="value(commonInstanceMetadata.items.google-compute-default-region)" 2>/dev/null)

if [[ -z "$DETECTED_REGION" ]]; then
    read -p "$(echo -e ${BOLD}${CYAN}Please enter the lab Region [e.g., us-east4]: ${RESET})" REGION
else
    read -p "$(echo -e ${BOLD}${CYAN}Detected Region is ${GREEN}$DETECTED_REGION${CYAN}. Press Enter to confirm or type a new one: ${RESET})" INPUT_REGION
    REGION=${INPUT_REGION:-$DETECTED_REGION}
fi
export REGION

gcloud config set run/region $REGION 2>/dev/null
gcloud config set run/platform managed 2>/dev/null

echo -e "✅ Project ID: ${GREEN}$PROJECT_ID${RESET}"
echo -e "✅ Region:     ${GREEN}$REGION${RESET}\n"

# Prompt ONLY for lab-specific dynamic parameters from the Qwiklabs panel
echo -e "${YELLOW}${BOLD}Please copy the exact names from your Qwiklabs instructions panel:${RESET}"
read -p "$(echo -e ${WHITE}Task 1: Enter Public Billing Service name: ${RESET})" PUBLIC_BILLING_SERVICE
read -p "$(echo -e ${WHITE}Task 2: Enter Frontend Staging Service name: ${RESET})" FRONTEND_STAGING_SERVICE
read -p "$(echo -e ${WHITE}Task 3: Enter Private Billing Service name: ${RESET})" PRIVATE_BILLING_SERVICE
read -p "$(echo -e ${WHITE}Task 4: Enter Billing Service Account name: ${RESET})" BILLING_SERVICE_ACCOUNT
read -p "$(echo -e ${WHITE}Task 5: Enter Billing Prod Service name: ${RESET})" BILLING_PROD_SERVICE
read -p "$(echo -e ${WHITE}Task 6: Enter Frontend Service Account name: ${RESET})" FRONTEND_SERVICE_ACCOUNT
read -p "$(echo -e ${WHITE}Task 7: Enter Frontend Production Service name: ${RESET})" FRONTEND_PRODUCTION_SERVICE

echo -e "\n${BOLD}${BLUE}Cloning Source Code Repository...${RESET}"
rm -rf pet-theory
git clone https://github.com/rosera/pet-theory.git

# ==============================================================================
# TASK 1: DEPLOY PUBLIC BILLING SERVICE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 1] Deploying Public Billing Service...${RESET}"
cd ~/pet-theory/lab07/unit-api-billing
gcloud builds submit --tag gcr.io/$PROJECT_ID/billing-staging-api:0.1 .
gcloud run deploy $PUBLIC_BILLING_SERVICE \
    --image gcr.io/$PROJECT_ID/billing-staging-api:0.1 \
    --allow-unauthenticated \
    --quiet
echo -e "${GREEN}✅ Task 1 Completed.${RESET}"

# ==============================================================================
# TASK 2: DEPLOY FRONTEND SERVICE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 2] Deploying Staging Frontend Service...${RESET}"
cd ~/pet-theory/lab07/staging-frontend-billing
gcloud builds submit --tag gcr.io/$PROJECT_ID/frontend-staging:0.1 .
gcloud run deploy $FRONTEND_STAGING_SERVICE \
    --image gcr.io/$PROJECT_ID/frontend-staging:0.1 \
    --allow-unauthenticated \
    --quiet
echo -e "${GREEN}✅ Task 2 Completed.${RESET}"

# ==============================================================================
# TASK 3: DEPLOY PRIVATE BILLING SERVICE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 3] Deleting old service & Deploying Private Billing Service...${RESET}"
gcloud run services delete $PUBLIC_BILLING_SERVICE --quiet
cd ~/pet-theory/lab07/staging-api-billing
gcloud builds submit --tag gcr.io/$PROJECT_ID/billing-staging-api:0.2 .
gcloud run deploy $PRIVATE_BILLING_SERVICE \
    --image gcr.io/$PROJECT_ID/billing-staging-api:0.2 \
    --no-allow-unauthenticated \
    --quiet
echo -e "${GREEN}✅ Task 3 Completed.${RESET}"

# ==============================================================================
# TASK 4: CREATE BILLING SERVICE ACCOUNT
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 4] Creating Billing Service Account...${RESET}"
gcloud iam service-accounts create $BILLING_SERVICE_ACCOUNT \
    --display-name "Billing Service Cloud Run"
echo -e "${YELLOW}Waiting 10 seconds for IAM propagation...${RESET}"
sleep 10
echo -e "${GREEN}✅ Task 4 Completed.${RESET}"

# ==============================================================================
# TASK 5: DEPLOY PRODUCTION BILLING SERVICE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 5] Deploying Production Billing Service...${RESET}"
cd ~/pet-theory/lab07/prod-api-billing
gcloud builds submit --tag gcr.io/$PROJECT_ID/billing-prod-api:0.1 .
gcloud run deploy $BILLING_PROD_SERVICE \
    --image gcr.io/$PROJECT_ID/billing-prod-api:0.1 \
    --no-allow-unauthenticated \
    --service-account $BILLING_SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \
    --quiet
echo -e "${GREEN}✅ Task 5 Completed.${RESET}"

# ==============================================================================
# TASK 6: CREATE FRONTEND SERVICE ACCOUNT & BIND ROLE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 6] Creating Frontend Service Account & Binding IAM Roles...${RESET}"
gcloud iam service-accounts create $FRONTEND_SERVICE_ACCOUNT \
    --display-name "Billing Service Cloud Run Invoker"

echo -e "${YELLOW}Waiting 10 seconds for IAM propagation...${RESET}"
sleep 10

gcloud run services add-iam-policy-binding $BILLING_PROD_SERVICE \
    --region $REGION \
    --member="serviceAccount:$FRONTEND_SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/run.invoker" \
    --quiet
echo -e "${GREEN}✅ Task 6 Completed.${RESET}"

# ==============================================================================
# TASK 7: DEPLOY PRODUCTION FRONTEND SERVICE
# ==============================================================================
echo -e "\n${CYAN}${BOLD}[Task 7] Deploying Production Frontend Service...${RESET}"
cd ~/pet-theory/lab07/prod-frontend-billing
gcloud builds submit --tag gcr.io/$PROJECT_ID/frontend-prod:0.1 .
gcloud run deploy $FRONTEND_PRODUCTION_SERVICE \
    --image gcr.io/$PROJECT_ID/frontend-prod:0.1 \
    --allow-unauthenticated \
    --service-account $FRONTEND_SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \
    --quiet
echo -e "${GREEN}✅ Task 7 Completed.${RESET}\n"

echo -e "${MAGENTA}${BOLD}╔════════════════════════════════════════════════════════════╗${RESET}"
echo -e "${MAGENTA}${BOLD}║             🎉 AUTOMATION COMPLETED SUCCESSFULLY 🎉          ║${RESET}"
echo -e "${MAGENTA}${BOLD}╚════════════════════════════════════════════════════════════╝${RESET}"