জেমিনি ক্লাউড অ্যাসিস্টের সাহায্যে অ্যাপ্লিকেশনের সমস্যা খুঁজুন এবং সমাধান করুন।

১. ভূমিকা

জেমিনি ক্লাউড অ্যাসিস্ট একটি পূর্ণাঙ্গ এজেন্ট যা আপনার গুগল ক্লাউড ওয়ার্কলোডগুলোকে সমর্থন করে। নতুন অ্যাপ্লিকেশন ডিজাইন করা বা বিদ্যমান অ্যাপ্লিকেশন আপডেট করা, গুগল ক্লাউডে ওয়ার্কলোড ডেপ্লয় ও রান করা, ওয়ার্কলোডের সমস্যা সমাধান করা এবং খরচ ও পারফরম্যান্সের জন্য সেগুলোকে অপ্টিমাইজ করার ক্ষেত্রে এই এজেন্টটি আপনার সহযোগী।

জেমিনি ক্লাউড অ্যাসিস্ট অপ্রত্যাশিত ত্রুটি এবং ডাউনটাইমের ক্ষেত্রে আপনার প্রতিক্রিয়া জানানোর ক্ষমতা উন্নত করে।

আপনি যা শিখবেন

  1. ডেপ্লয়মেন্ট: গুগল ক্লাউডে কীভাবে একটি বেসিক ব্যাকএন্ড এবং ডেটাবেস ডেপ্লয় করবেন।
  2. ডিবাগ: জেমিনি ক্লাউড অ্যাসিস্ট কীভাবে ক্লাউড এবং কোড সংক্রান্ত সমস্যার অনুসন্ধান ও মূল কারণ বিশ্লেষণকে স্বয়ংক্রিয় করে তোলে।
  3. প্রতিকার: কীভাবে জেমিনি ক্লাউড অ্যাসিস্ট মূল কারণের উপর ভিত্তি করে সমাধান শনাক্ত করতে সাহায্য করে।

২. প্রজেক্ট সেটআপ

গুগল অ্যাকাউন্ট

যদি আপনার আগে থেকে কোনো ব্যক্তিগত গুগল অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি গুগল অ্যাকাউন্ট তৈরি করতে হবে।

কর্মক্ষেত্র বা শিক্ষা প্রতিষ্ঠানের অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন

গুগল ক্লাউড কনসোলে সাইন-ইন করুন

আপনার ব্যক্তিগত গুগল অ্যাকাউন্ট ব্যবহার করে গুগল ক্লাউড কনসোলে সাইন-ইন করুন।

বিলিং সক্ষম করুন

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করুন

আপনি যদি গুগল ক্লাউড ক্রেডিট ব্যবহার করে বিলিং সেট আপ করেন, তাহলে এই ধাপটি এড়িয়ে যেতে পারেন।

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করতে, ক্লাউড কনসোলে বিলিং চালু করার জন্য এখানে যান

কিছু নোট:

  • এই ল্যাবটি সম্পন্ন করতে ক্লাউড রিসোর্সে ১ মার্কিন ডলারেরও কম খরচ হওয়া উচিত।
  • পরবর্তী চার্জ এড়াতে, এই ল্যাবের শেষে দেওয়া ধাপগুলো অনুসরণ করে আপনি রিসোর্সগুলো মুছে ফেলতে পারেন।
  • নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়ালের জন্য যোগ্য।

একটি প্রকল্প তৈরি করুন (ঐচ্ছিক)

এই ল্যাবের জন্য ব্যবহার করার মতো আপনার যদি কোনো চলমান প্রজেক্ট না থাকে, তাহলে এখানে একটি নতুন প্রজেক্ট তৈরি করুন

৩. ক্লাউড শেল এডিটর খুলুন

  1. সরাসরি ক্লাউড শেল এডিটর- এ যেতে এই লিঙ্কে ক্লিক করুন।
  2. আজ যেকোনো সময়ে অনুমোদনের জন্য অনুরোধ করা হলে, চালিয়ে যাওয়ার জন্য 'অনুমোদন করুন' (Authorize) বোতামে ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. যদি স্ক্রিনের নিচে টার্মিনালটি দেখা না যায়, তাহলে এটি খুলুন:
    • ভিউ ক্লিক করুন
    • টার্মিনালে ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  4. টার্মিনালে এই কমান্ডটি দিয়ে আপনার প্রজেক্ট সেট করুন:
    gcloud config set project [PROJECT_ID]
    
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • আপনি যদি আপনার প্রজেক্ট আইডি মনে রাখতে না পারেন, তাহলে নিম্নলিখিত উপায়ে আপনার সমস্ত প্রজেক্ট আইডি তালিকাভুক্ত করতে পারেন:
      gcloud projects list
      
      ক্লাউড শেল এডিটর টার্মিনালে প্রজেক্ট আইডি সেট করুন
  5. আপনি এই বার্তাটি দেখতে পাবেন:
    Updated property [core/project].
    

৪. এপিআই সক্রিয় করুন

অ্যাপ্লিকেশন কম্পোনেন্টগুলো ডেপ্লয় করতে এবং গুগল ক্লাউড অ্যাসিস্ট ব্যবহার করতে নিম্নলিখিত API-গুলো সক্রিয় করুন:

টার্মিনালে এপিআইগুলো সক্রিয় করুন:

```bash
gcloud services enable \
  container.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  alloydb.googleapis.com \
  run.googleapis.com
```
<br>
When the command finishes, you should see an output like the following: 
<br>

```console
Operation "operations/acf.p2-176675280136-b03ab5e4-3483-4ebf-9655-43dc3b345c63" finished successfully.
```

৫. প্রকল্পটি প্রস্তুত করুন

ক্লাউড অ্যাসিস্ট পরীক্ষা করার জন্য আপনি বেসিক অ্যাপ্লিকেশন এবং ডেপ্লয়মেন্ট তৈরি করবেন।

ডিরেক্টরি তৈরি করুন

  1. ক্লাউড শেল এডিটর অথবা আপনার পছন্দের ডেভেলপার এনভায়রনমেন্টটি খুলুন।
  2. একটি নতুন ফোল্ডার তৈরি করুন:
    mkdir -p ~/gemini-cloud-assist-debug
    mkdir -p ~/gemini-cloud-assist-debug/auth_issue_demo
    mkdir -p ~/gemini-cloud-assist-debug/terraform
    cd ~/gemini-cloud-assist-debug
    
  3. টার্মিনালে একটি ক্লাউড শেল এডিটর ওয়ার্কস্পেস খুলতে নিম্নলিখিত কমান্ডটি চালান:
cloudshell open-workspace ~/gemini-cloud-assist-debug

ফাইলগুলো তৈরি করুন

এখন আপনি অ্যাপ্লিকেশনটির জন্য প্রয়োজনীয় স্টার্টার ফাইলগুলো তৈরি করবেন।

  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে Dockerfile-টি তৈরি করুন। এই ফাইলটি অ্যাপ্লিকেশন কন্টেইনার তৈরির কাজটি করে।
cat <<EOF > ~/gemini-cloud-assist-debug/auth_issue_demo/Dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY main.py .

CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]
EOF
  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে main.py ফাইলটি তৈরি করুন। এই ফাইলে পাইথনে লেখা অ্যাপ্লিকেশনটি রয়েছে।
cat <<EOF > ~/gemini-cloud-assist-debug/auth_issue_demo/main.py
import os
import logging
from flask import Flask
from google.cloud.alloydb.connector import Connector
import sqlalchemy

app = Flask(__name__)

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Configuration from Environment Variables
# The fully qualified instance URI: projects/<PROJECT>/locations/<REGION>/clusters/<CLUSTER>/instances/<INSTANCE>
ALLOYDB_URI = os.environ.get("ALLOYDB_URI") 
DB_USER = os.environ.get("DB_USER", "auth-debug")
DB_PASS = os.environ.get("DB_PASS", "debug-auth")
DB_NAME = os.environ.get("DB_NAME", "postgres")
USE_PUBLIC_IP = os.environ.get("USE_PUBLIC_IP", "false").lower() == "true"

# Initialize Connector lazily
_connector = None

def get_connector():
    global _connector
    if _connector is None:
        _connector = Connector()
    return _connector

def getconn():
    connector = get_connector()
    ip_type = "PUBLIC" if USE_PUBLIC_IP else "PRIVATE"
    
    conn = connector.connect(
        ALLOYDB_URI,
        "pg8000",
        user=DB_USER,
        password=DB_PASS,
        db=DB_NAME,
        ip_type=ip_type
    )
    return conn

@app.route("/")
def index():
    return "AlloyDB Auth Demo. /connect to test.", 200

@app.route("/connect")
def connect_db():
    if not ALLOYDB_URI:
        return "FAILURE: ALLOYDB_URI env var is not set.", 500

    try:
        logger.info(f"Attempting connection to {ALLOYDB_URI} with user {DB_USER}...")
        
        # Create connection pool
        pool = sqlalchemy.create_engine(
            "postgresql+pg8000://",
            creator=getconn,
        )
        
        with pool.connect() as db_conn:
            # Simple query to validate connection
            result = db_conn.execute(sqlalchemy.text("SELECT NOW()")).fetchone()
            timestamp = result[0]
            
        msg = f"SUCCESS: Connected to AlloyDB! DB Time: {timestamp}"
        logger.info(msg)
        return msg, 200

    except Exception as e:
        logger.exception("Connection failed")
        # Return the error to the caller to visualize the auth failure
        return f"FAILURE: Connection Error.\nDetails: {str(e)}", 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে requirements.txt ফাইলটি তৈরি করুন। এই ফাইলটি পাইথন প্যাকেজের প্রয়োজনীয়তাগুলো পরিচালনা করে।
cat <<EOF > ~/gemini-cloud-assist-debug/auth_issue_demo/requirements.txt
flask==3.1.3
gunicorn==25.3.0
google-cloud-alloydb-connector[pg8000]==1.12.1
sqlalchemy==2.0.49
EOF
  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে main.tf ফাইলটি তৈরি করুন। এই ফাইলটি ভবিষ্যতে তৈরি হতে যাওয়া গুগল ক্লাউড রিসোর্সগুলো পরিচালনা করে।
cat <<EOF > ~/gemini-cloud-assist-debug/terraform/main.tf
provider "google" {
  project = var.project_id
  region  = var.region
}

# Enable APIs
locals {
  apis = [
    "alloydb.googleapis.com",
    "run.googleapis.com",
    "artifactregistry.googleapis.com",
    "compute.googleapis.com",
    "geminicloudassist.googleapis.com",
    "monitoring.googleapis.com",
    "cloudasset.googleapis.com",
    "cloudbuild.googleapis.com",
    "recommender.googleapis.com",
    "appoptimize.googleapis.com"
  ]
}

resource "random_password" "db_pass" {
  count            = var.db_password == null ? 1 : 0
  length           = 16
  special          = true
  override_special = "!#$%&*()-_=+[]{}<>:?"
}

locals {
  db_password = var.db_password != null ? var.db_password : random_password.db_pass[0].result
}

resource "google_project_service" "apis" {
  for_each           = toset(local.apis)
  service            = each.value
  disable_on_destroy = false
}

# Service Account
resource "google_service_account" "auth_demo_sa" {
  account_id   = var.service_account_name
  display_name = "Auth Demo SA"
}

# AlloyDB Cluster
resource "google_alloydb_cluster" "rma_cluster" {
  cluster_id = var.cluster_id
  location   = var.region

  # Initial password, managed via variable or generated randomly
  initial_user {
    password = local.db_password
  }

  # Use default network as in the manual setup
  network_config {
    network = "projects/${var.project_id}/global/networks/default"
  }

  depends_on = [google_project_service.apis["alloydb.googleapis.com"]]
}

# AlloyDB Instance
resource "google_alloydb_instance" "rma_instance_1" {
  cluster       = google_alloydb_cluster.rma_cluster.name
  instance_id   = var.instance_id
  instance_type = "PRIMARY"

  machine_config {
    cpu_count = 2
  }

  network_config {
    enable_public_ip = true
  }

  depends_on = [google_alloydb_cluster.rma_cluster]
}

# Cloud Run Service
resource "google_cloud_run_service" "auth_issue_demo" {
  name     = var.cloud_run_service_name
  location = var.region

  template {
    spec {
      containers {
        image = var.cloud_run_image
        env {
          name  = "ALLOYDB_URI"
          value = "projects/${var.project_id}/locations/${var.region}/clusters/${var.cluster_id}/instances/${var.instance_id}"
        }
        env {
          name  = "DB_USER"
          value = "postgres"
        }
        env {
          name  = "DB_PASS"
          value = local.db_password
        }
        env {
          name  = "USE_PUBLIC_IP"
          value = "true"
        }
      }
      service_account_name = google_service_account.auth_demo_sa.email
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }

  depends_on = [google_project_service.apis["run.googleapis.com"], google_alloydb_instance.rma_instance_1]
}

# Allow unauthenticated access to Cloud Run service (matching --allow-unauthenticated)
resource "google_cloud_run_service_iam_member" "public_access" {
  location = google_cloud_run_service.auth_issue_demo.location
  project  = google_cloud_run_service.auth_issue_demo.project
  service  = google_cloud_run_service.auth_issue_demo.name
  role     = "roles/run.invoker"
  member   = "allUsers"
}
EOF
  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে variables.tf ফাইলটি তৈরি করুন। এই ফাইলটি গুগল ক্লাউড রিসোর্সগুলির জন্য টেরাফর্ম ভেরিয়েবল পরিচালনা করে।
cat <<EOF > ~/gemini-cloud-assist-debug/terraform/variables.tf
variable "project_id" {
  description = "The ID of the Google Cloud project."
  type        = string
}

variable "region" {
  description = "The region to deploy resources in."
  type        = string
  default     = "us-central1"
}

variable "cluster_id" {
  description = "The ID of the AlloyDB cluster."
  type        = string
  default     = "rma-cluster"
}

variable "instance_id" {
  description = "The ID of the AlloyDB instance."
  type        = string
  default     = "rma-instance-1"
}

variable "service_account_name" {
  description = "The name of the service account."
  type        = string
  default     = "auth-demo-sa"
}

variable "cloud_run_service_name" {
  description = "The name of the Cloud Run service."
  type        = string
  default     = "auth-issue-demo"
}

variable "cloud_run_image" {
  description = "The container image for the Cloud Run service."
  type        = string
}

variable "db_password" {
  description = "The database password. If not provided, a random one will be generated."
  type        = string
  sensitive   = true
  default     = null
}
EOF
  1. টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে setup_via_tf.sh ফাইলটি তৈরি করুন। এই ফাইলটি পাইথন প্যাকেজের প্রয়োজনীয়তাগুলো পরিচালনা করে।
cat <<EOF > ~/gemini-cloud-assist-debug/setup_via_tf.sh
#!/bin/bash
set -e

# Get script directory and change to project root
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"

# Load configuration from .env
if [ -f .env ]; then
    set -a
    source .env
    set +a
else
    echo "ERROR: .env file not found. Please create one with PROJECT_ID."
    exit 1
fi

if [ -z "$PROJECT_ID" ]; then
    echo "ERROR: PROJECT_ID is not set in .env file."
    exit 1
fi

REGION="us-central1"
CLUSTER_ID="rma-cluster"
INSTANCE_ID="rma-instance-1"
SA_NAME="auth-demo-sa"
SERVICE_NAME="auth-issue-demo"

echo "--- Terraform Setup for Auth Demo ---"
echo "Using Project: $PROJECT_ID"

# Get current Cloud Run image
echo "Fetching current Cloud Run image..."
IMAGE=$(gcloud run services describe $SERVICE_NAME --region=$REGION --project=$PROJECT_ID --format="value(spec.template.spec.containers[0].image)" 2>/dev/null || true)

if [ -z "$IMAGE" ]; then
    echo "WARNING: Could not find existing Cloud Run service image."
    echo "Using a placeholder image (gcr.io/cloudrun/hello) for initial Terraform apply."
    IMAGE="gcr.io/cloudrun/hello"
fi

echo "Found Image: $IMAGE"

cd terraform

# Initialize Terraform
echo "Initializing Terraform..."
terraform init

echo "Formatting Terraform files..."
terraform fmt

echo "Validating Terraform configuration..."
terraform validate

echo "------------------------------------------------"
echo "Applying changes..."
echo "------------------------------------------------"

terraform apply -var="project_id=$PROJECT_ID" -var="cloud_run_image=$IMAGE" -auto-approve

echo "------------------------------------------------"
echo "Building and deploying updated Cloud Run service..."
echo "------------------------------------------------"

gcloud run deploy $SERVICE_NAME \
  --source ../auth_issue_demo \
  --region $REGION \
  --project $PROJECT_ID \
  --service-account $SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
  --quiet
EOF
  1. শেল স্ক্রিপ্টটিকে নির্বাহযোগ্য করতে নিম্নলিখিত কমান্ডটি চালান:
chmod +x ~/gemini-cloud-assist-debug/setup_via_tf.sh
  1. ডিপ্লয়মেন্টের জন্য আপনার গুগল ক্লাউড প্রজেক্ট আইডি সহ একটি .env ফাইল তৈরি করুন। YOUR_PROJECT_ID ফিল্ডটি আপডেট করুন:
cat <<EOF > ~/gemini-cloud-assist-debug/.env
PROJECT_ID=YOUR_PROJECT_ID
USE_PUBLIC_IP=true
EOF

৬. অ্যাপ্লিকেশনটি স্থাপন করুন

অ্যাপ্লিকেশন কোড এবং গুগল ক্লাউড রিসোর্সগুলো ডেপ্লয় করার জন্য প্রস্তুত। এতে সর্বোচ্চ ১৫ মিনিট সময় লাগতে পারে।

টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান:

cd ~/gemini-cloud-assist-debug
./setup_via_tf.sh

কম্পোনেন্টগুলো ডেপ্লয় হওয়ার সময়, আরও জানতে ক্লাউড শেল এডিটর-এ ফাইলগুলো ব্রাউজ করুন।

৭. একটি ত্রুটি তৈরি করুন এবং ডিবাগ করুন

এখন, আমরা অ্যাপ্লিকেশন থেকে একটি ত্রুটি ঘটাবো। বাম দিকের প্যানেলে ক্লাউড রান খুলুন। তারপর, auth-issue-demo সার্ভিসটিতে ক্লিক করুন।

  1. সার্ভিসের বিবরণ পেজের একদম উপরে একটি URL আছে। URL-টি কপি করে একটি নতুন ব্রাউজার ট্যাব খুলুন। URL-টি পেস্ট করে এর সাথে /connect যোগ করুন। আপনার URL-টি দেখতে অনেকটা এরকম হবে:

https://auth-issue-demo- .us-central1.run.app/connect

  1. ইউআরএল-টিতে যান। ক্লাউড রান ইনস্ট্যান্সটি চালু হতে কয়েক সেকেন্ড সময় লাগতে পারে। আপনি একটি এরর পাবেন।
  2. ক্লাউড রান সার্ভিস ডিটেইলস পেজে ফিরে যান। ‘অবজার্ভেবিলিটি’- তে ক্লিক করুন, তারপর ‘লগস’-এ ক্লিক করুন। আপনি কন্টেইনারটির লগ দেখতে পাবেন, যার মধ্যে একটি এররও থাকবে। যদি এরর লগটি এখনও পাওয়া না যায়, তবে কয়েক সেকেন্ড অপেক্ষা করুন এবং উপরের ডানদিকের আইকনটি ব্যবহার করে পেজটি রিফ্রেশ করুন।
  3. আরও পড়তে এরর লগ-এ ক্লিক করুন। মূল লগের লাইনে থাকা ইনভেস্টিগেট আইকনে ক্লিক করুন। তারপর, ইনভেস্টিগেট লগ-এ ক্লিক করুন।

ক্লাউড অ্যাসিস্ট চ্যাট প্যানেলটি খুলে যাবে। তদন্তটি সম্পন্ন হতে ২ থেকে ৩ মিনিট সময় লাগে।

তদন্ত সম্পন্ন হলে, আপনি ফলাফল এবং সুপারিশগুলো পড়তে পারবেন। ক্লাউড রান-এর অ্যালয়ডিবি ইনস্ট্যান্স অ্যাক্সেস করার জন্য সার্ভিস অ্যাকাউন্টে যথাযথ গ্রান্ট যোগ করার একটি সুপারিশ রয়েছে।

৮. ত্রুটিটি সংশোধন করুন।

সার্ভিস অ্যাকাউন্টের অনুমতি সংক্রান্ত ত্রুটিটি সমাধান করুন।

  1. ক্লাউড আইএএম- এ যান।
  2. অ্যাক্সেস মঞ্জুর করুন (Grant Access) বোতামে ক্লিক করুন। প্রিন্সিপাল প্যানে, প্রথমে auth-demo টাইপ করুন এবং সার্ভিস অ্যাকাউন্টটি প্রদর্শিত হওয়া পর্যন্ত অপেক্ষা করুন।
  3. এরপরে, সার্ভিস অ্যাকাউন্টে AlloyDB Client রোলটি যোগ করুন, তারপর সেভ-এ ক্লিক করুন।

এটি ছড়িয়ে পড়তে এক মিনিট পর্যন্ত সময় লাগে।

কিছুক্ষণ অপেক্ষা করার পর, ফিরে গিয়ে অ্যাপ্লিকেশনটি রিফ্রেশ করুন। এবার আপনি AlloyDB ডাটাবেস থেকে একটি সফলতার বার্তা দেখতে পাবেন।

৯. অভিনন্দন

অভিনন্দন! আপনি ক্লাউড ইনভেস্টিগেশন- এর এই পরিচিতি এবং গুগল ক্লাউডে কোনো অ্যাপ্লিকেশনের পারমিশন ডিবাগ করার প্রক্রিয়াটি সফলভাবে সম্পন্ন করেছেন।

এরপর কী?