Welcome to the definitive guide on Google Cloud Agent Skills.
The Series:
– Part 1 : What are Google Cloud Skills
– Part 2 : Intermediate Skills in Action (BigQuery and Cloud Run)
– Part 3 : Advanced Ops (WAF Security + Reliability + Cost Optimization)
– Part 4 : Google Cloud Solution Architecture Skill (this blog)
– Part 5-* : More Skills coverage
The google-cloud-solution-architecture skill is designed to interactively discover workload requirements and formulate production-grade, end-to-end multi-product architectural solutions on Google Cloud.

It works across 4 key principles and workflow phases are given below:
- Phase 1: Requirements discovery: Gather detailed requirements related to the cloud workload or use case that the user needs assistance for.
- Phase 2: Solution architecture: Use the requirements that were gathered
in Phase 1 to generate a detailed solution architecture for the cloud
workload or use case. - Phase 3: Solution validation: Create a plan to validate the generated
solution, generate validation instructions and scripts, and run the
validation. - Phase 4: Solution packing and presentation: Consolidate the generated
content and present the solution.
Let’s put it to the test.
We will use the google-cloud-solution-architecture skill to design a production-grade cloud architecture from scratch. This will be done entirely through a conversation with your AI agent.
Scenario
You are a lead developer at a media analytics company. Your product team wants to build a real-time content analytics platform that ingests articles from partner news feeds, analyzes sentiment and topics using AI, and serves insights through a dashboard. They’ve given you these requirements:
- Ingest 5,000 articles per hour from multiple RSS/API sources
- Analyze each article for sentiment, key topics, and named entities using Gemini
- Store results in a queryable data warehouse for historical analysis
- Serve a real-time dashboard showing trending topics and sentiment over time
- Budget: Under $500/month at initial scale
Maybe the system eventually looks all mapped out like this, but I am only giving high level details in the prompt to it.

Your job: get the AI agent to design this system on Google Cloud.
Confirm the Skill
Ensure the google-cloud-solution-architecture skill is installed:
npx skills list
If it’s not listed, install it:
npx skills add google/skills --skill google-cloud-solution-architecture
Updating Skills
If you have installed the skills a while back, it is always a good idea to get the latest version of the skill. You can use the npx update command to update multiple skills in one short or even individual skills.
For e.g. you can use the following command to update an existing installed skill:
npx skills update <skill-name>
Prompt-Driven Architecture Design
You prompt:
Design a Google Cloud architecture for a real-time content analytics platform. Requirements: ingest 5,000 articles per hour from multiple API sources, analyze each article for sentiment and key topics using Gemini, store results in a queryable data warehouse, and serve a real-time dashboard showing trends. Target budget is under $500/month. Use project YOUR_PROJECT_ID.
Notice that we could have a lot deeper and specific with the requirement, but we are keeping it at high level, since I really want to check out, how well it uncovers things as we move along.
This is the first output that the Skill gave:
Revisiting Prompt Requirements
To design an optimal, cost-effective architecture for project PROJECT_ID on Google Cloud, I first need to gather a few key functional
and non-functional requirements.
Gathering these details upfront is critical because non-functional requirements directly dictate your operational SLAs, availability tiers, scaling
configuration, cost budgets, storage choices, and security posture.
──────
### 1. Functional Requirements & Payload Details
• Article Payload Size: What is the average length/word count of an article (e.g., ~500 words vs ~5,000 words)?
• Ingestion Source Mechanisms: How are the multiple API sources structured (e.g., pull/polling via REST APIs, webhook push, RSS feeds)?
• Analytics Output: Beyond sentiment and key topics, are there specific schema requirements (e.g., target language, entity extraction,
categorization taxonomy)?
### 2. Non-Functional Requirements
• Latency & SLA: What is the acceptable latency from article publication/ingestion to dashboard availability (e.g., strictly within seconds vs near-
real-time within 1–5 minutes)?
• Data Retention & Storage Window: How long do you need to retain raw article content vs analyzed aggregate metrics in the data warehouse?
• Security, Privacy & Compliance: Are there specific privacy/compliance constraints (e.g., GDPR, data residency) or encryption requirements?
• Disaster Recovery (DR) & Reliability: What are your target Recovery Point Objective (RPO) and Recovery Time Objective (RTO)?
### 3. Current State & Integration
• Existing Infrastructure: Is this a greenfield deployment, or are there existing components/pipelines already running?
• Dashboard / Visualization Preferences: Do you have a preferred visualization interface (e.g., Looker Studio, custom web UI, Grafana), or should we
specify the best fit?
• API Constraints: Are there rate limits, IP whitelisting, or specific secret/auth requirements for any of the API sources?
──────
Once you provide these details (or let me know if you'd like me to assume standard production defaults for any missing points), I will create a
logical technical decomposition for your review.
As expected, it has taken a look at the requirements thrown at it and in my opinion, it has asked me a few follow up questions to better understand this. Notice how its broken the requirements into categories and asked me a list of questions.
I answer the questions to the best of my ability as given below:
> OK. Here are the answers
1. Article Payload Size: consider an average of 2000 words
2, Ingestion Source, consider pulling stories from a REST API Endpoint.
3. Analytics Output: Consider only sentiment and key topics for now.
4. Latency and SLA : Nothing decided as of now.
5. Data retention : Store the raw article content for 7 days only. The metrics should be available for query for last 6 months.
6. Security, Privacy & Compliance: Nothing at the moment.
7. DR and Reliability : Nothing at the moment.
8. Existing Infrastructure: This is a greenfield deployment.
9. Dashboard : Let's use a custom UI for now. Make it a web application that is available internally.
10. API Constraints: Nothing at the moment. You will be provided an API Key to access the REST API for the new articles.
This seems to be good enough for it to go ahead and provide me some details. It has given me a high level logic technical flow with some of the requirements captured well. And it waits there now to ask me if this is reflecting what my system is about. Ofcourse at this point, you can go back and forth on a few things, but in this blog post, I am going to go ahead with its recommendations for the whole flow.
────────────────────────────────────────────────────────────
▸ Thought for 5s, 1.2k tokens
Analyzing User Input
Thank you for providing those details! Based on your requirements, here is the Technical Decomposition breaking down your system into logical
components:
──────
### Logical Technical Decomposition
[ External REST APIs ]
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 1. Ingestion & Buffering Component │
│ • Periodically fetches raw articles (5,000/hr peak) │
│ • Buffers messages to decouple ingestion from processing │
└──────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. AI Processing & Feature Extraction Component │
│ • Consumes buffered articles │
│ • Truncates/structures article text (~2,000 words) │
│ • Calls Gemini model for sentiment & topic extraction │
│ • Handles errors, retries, and dead-lettering │
└──────────────────────────┬──────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ 3a. Raw Payload Staging │ │ 3b. Analytical Data Warehouse│
│ • Temporary raw storage │ │ • Structured metrics │
│ • Auto-expires in 7 days│ │ • Optimized for trends │
└─────────────────────────────┘ │ • Retains for 6 months │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 4. Custom Internal Web UI │
│ • Serves real-time trends│
│ • Queries data warehouse │
└─────────────────────────────┘
#### Component Breakdown:
1. Ingestion & Buffering Component
• Role: Periodically polls external REST APIs using stored credentials, ingests new articles, and pushes incoming payload items to a resilient
buffer/queue to smooth out throughput surges (5,000 articles/hour = ~1.4 articles/sec).
2. AI Processing & Feature Extraction Component
• Role: Worker process that pulls buffered messages, sends the 2,000-word text to Gemini for structured JSON sentiment/topic extraction, applies
retry logic, and splits outputs into raw payload and analytical data stores. Includes prompt optimization/batching strategy to guarantee total
costs stay under the $500/month budget.
3. Storage Tier
• 3a. Raw Staging Store: Stores full raw article text for auditing/debugging with an automated TTL / lifecycle rule purging records after 7 days.
• 3b. Analytical Data Warehouse: Stores lightweight structured records (timestamp, article ID, sentiment score, topic array) partitioned by time,
automatically expiring partitions older than 6 months.
4. Internal Custom Web Dashboard Component
• Role: Web application providing internal users with interactive real-time trend visualization and analytics dashboards queried directly
against the data warehouse.
5. Security & Management Layer
• Role: Secure storage for REST API keys, IAM access policies, centralized logging/monitoring, and cost-cap alerts.
──────
### Trade-off & Cost Optimization Note
Processing 3.6 million 2,000-word articles per month with LLMs can easily exceed $500/month if using default models without optimization. To
strictly enforce your <$500/month budget, our architecture will leverage Gemini 2.0 Flash-Lite / Batch inference and input truncation strategies
(e.g., analyzing article head/summary & key excerpts (500–800 tokens) rather than full 2,000-word body), which lowers LLM costs to
**$80–$150/month**, leaving ample budget for compute, storage, and data warehousing.
──────
Please review this logical decomposition. Does this accurately reflect your vision? Once approved, we will proceed to Phase 2: Google Cloud Product
Recommendations.
So, I give it a go ahead
> Looks good at the moment. Please go ahead
I like what it did next! Mapped the requirements after I had okay’ed it to Google Cloud Products. This helps me to understand what it has chosen as products and maybe I could even ask it to swap out a product or two. Interestingly, it dives into how the products/services will work across the flow and importantly, discusses costing too.
Analyzing Tool Execution
Here are the recommended Google Cloud products and features for each component of the architecture, along with evaluated alternatives, pros/cons,
and cost projections to ensure we stay well under your $500/month target budget.
──────
### Task 2.1: Recommended Google Cloud Products
┌───────────────────────────┐
│ Cloud Scheduler + IAM │
└─────────────┬─────────────┘
│ (Triggers every 1 min)
▼
┌───────────────────┐ ┌───────────────────────────┐
│ External REST API │ ◄─────── │ Ingestion Service │
└───────────────────┘ (Fetch) │ (Cloud Run Container) │
└─────────────┬─────────────┘
│ (Publish JSON)
▼
┌───────────────────────────┐
│ Pub/Sub Topic & DLQ │
└─────────────┬─────────────┘
│ (Push Subscription)
▼
┌───────────────────────────┐
│ Processing Worker │
│ (Cloud Run Service) │
└──────┬─────────────────┬──┘
│ │
(Extract Sentiment) │ │ (Store Raw Payload)
▼ ▼
┌──────────────────────────┐ ┌──────────────────────────┐
│ Vertex AI Gemini API │ │ Cloud Storage (GCS) │
│ (Gemini 2.0 Flash-Lite) │ │ (7-Day Lifecycle Expiry) │
└────────────┬─────────────┘ └──────────────────────────┘
│ (Structured JSON)
▼
┌──────────────────────────┐
│ BigQuery Warehouse │
│ (6-Month Partition Exp.) │
└────────────┬─────────────┘
│ (SQL Queries)
▼
┌──────────────────────────┐
│ Internal Dashboard App │
│ (Cloud Run + IAP Auth) │
└──────────────────────────┘
──────
#### 1. Ingestion & Buffering Component
• Recommended Product: Cloud Scheduler + Cloud Run + Pub/Sub
• How it works: Cloud Scheduler triggers a Cloud Run ingestion container every minute. The container polls the external REST API using
credentials stored in Secret Manager and publishes article payloads into a Pub/Sub topic with a Dead-Letter Queue (DLQ).
• Alternatives Evaluated:
• Cloud Tasks: Excellent for task-level rate limiting, but Pub/Sub is better for decoupling fan-out processing and scaling worker pools.
• Cloud Composer (Apache Airflow): Overkill for API polling, adding ~$300+/month in fixed cluster management overhead.
• Pros/Cons of Pub/Sub:
• Pros: Completely serverless, auto-scales to thousands of messages/sec, includes native retry policies & DLQ support, costs <$1/month for
3.6M messages.
• Cons: Requires idempotency handling in downstream workers (at-least-once delivery).
#### 2. AI Processing & Feature Extraction
• Recommended Product: Cloud Run (Worker Service) + Vertex AI Gemini 2.0 Flash-Lite API
• How it works: Cloud Run worker instances process incoming articles from Pub/Sub push subscriptions. The worker extracts text and invokes the
gemini-2.0-flash-lite endpoint on Vertex AI using Structured Outputs (response_mime_type="application/json") to output sentiment scores (-1.0 to
+1.0), sentiment category, key topics array, and a brief 2-sentence summary.
• Alternatives Evaluated:
• Cloud Dataflow (Apache Beam): Great for heavy stream transformations, but carries a ~$150-$250/month fixed worker VM cost vs Cloud Run's
scale-to-zero model.
• Gemini 1.5 Pro: Highly capable but unnecessary for sentiment/topic extraction and would cost ~$1,200+/month at 3.6M articles/mo.
• Pros/Cons of Gemini 2.0 Flash-Lite:
• Pros: Ultra-fast latency (~300-600ms response), native JSON enforcement, extremely low pricing ($0.075 / 1M input tokens, $0.30 / 1M
output tokens).
• Cons: Requires prompt formatting to fit within optimal input length (~800 words/article summary or head content).
#### 3. Storage Tier
• 3a. Short-Term Raw Content Storage (7 Days):
• Recommended Product: Cloud Storage (GCS) with Object Lifecycle Management
• How it works: Raw JSON payloads are saved to gs://[PROJECT_ID]-raw-articles/YYYY/MM/DD/[ARTICLE_ID].json. A GCS Object Lifecycle policy
automatically deletes files older than 7 days.
• Alternatives Evaluated:
• Firestore / Cloud Bigtable: Offers database querying for raw text, but costs ~$0.18/GB/mo plus write operation charges vs GCS at $0.
02/GB/mo with automated free lifecycle purging.
• 3b. Analytical Data Warehouse (6 Months Retention):
• Recommended Product: BigQuery (Day-partitioned by ingested_at, clustered by topic_category)
• How it works: The Cloud Run worker streams analyzed metrics directly into BigQuery. Table partition expiration is set to 180 days (6 months),
automatically purging old metrics.
• Alternatives Evaluated:
• Cloud SQL (PostgreSQL): Requires dedicated instance management (~$35–$70/mo) and custom partitioning scripts; BigQuery requires zero
maintenance and scales queries automatically.
#### 4. Custom Internal Web Application & Security
• Recommended Product: Cloud Run (Web App) + Identity-Aware Proxy (IAP) + Secret Manager
• How it works: A lightweight web application (e.g. React + Python FastAPI / Node.js) hosted on Cloud Run queries BigQuery for trend aggregates.
User authentication is secured using GCP Identity-Aware Proxy (IAP) without needing custom auth logic. REST API keys are stored in Secret
Manager.
──────
### Estimated Monthly Cost Breakdown (< $500 Target)
Service │ Estimated Usage / Month │ Est. Cost / Month
────────────────────────────────────────────┼────────────────────────────────────────────────────────────┼──────────────────────────────────────────
Vertex AI (Gemini 2.0 Flash-Lite) │ ~3.6M articles (~2.88 Billion tokens with optimized input) │ ~$215.00
Cloud Run (Ingestion + Workers + Web UI) │ ~500k vCPU-seconds / ~1B Memory-MB-sec │ ~$35.00
Pub/Sub │ 3.6M messages (~3.6 GB ingested/delivered) │ ~$0.50
Cloud Storage (GCS) │ ~15 GB rolling 7-day raw payload storage │ ~$0.30
BigQuery │ ~2 GB 6-month storage + 200 GB interactive query scans │ ~$2.00
Secret Manager / Cloud Scheduler / Logging │ Basic operational metrics │ ~$2.00
Contingency / Peak Surge Buffer │ Unplanned query usage or traffic spikes │ ~$50.00
TOTAL ESTIMATED MONTHLY COST │ │ ~$304.80 / month
(Well within the $500/month target budget!)
──────
Please confirm if you approve these product recommendations. Once approved, I will generate the complete Mermaid architecture diagram.
I gave a go ahead:
Looks good. Please go ahead.
Next, it gave me a Mermaid formatted Architecture Diagram, which I am rendering here. Do zoom in and see the diagram.

Along with the above diagram, it provided me the following too, to help understand the flow vis-a-vis the specific Google Cloud products/services.
### Key Data & Control Flow Summary:
1. Ingestion Trigger: Cloud Scheduler invokes the Cloud Run Ingestion Service every 60 seconds.
2. Secure Fetching: The ingestion container retrieves API keys from Secret Manager, fetches new articles from the external REST API, and pushes
individual article messages to Pub/Sub.
3. AI Processing: Pub/Sub pushes messages to the Cloud Run Worker Service, which formats the prompt and calls Vertex AI Gemini 2.0 Flash-Lite with
structured JSON output enforcement.
4. Dual Storage:
• Raw payload is dumped to Cloud Storage (purged after 7 days via lifecycle rule).
• Analyzed metrics are streamed into BigQuery (purged after 180 days via partition expiration).
5. Dashboard Serving: Cloud Run Web App queries BigQuery for real-time trend aggregates, protected behind Identity-Aware Proxy (IAP).
Please confirm if you approve this architecture diagram.
Once approved, I will proceed to
Task 2.3: Generating the Detailed Architecture Description.
I go ahead and see what it has in store for me via the detailed Architecture Description. I reproduce it here:
### Task 2.3: Comprehensive Architecture Description
Here is the detailed architecture description explaining the purpose of each component, component relationships, data flow, and lifecycle policies.
──────
### 1. Component Roles & Purpose
#### A. Security, Credentials & Operations Layer
• Secret Manager: Securely stores the external REST API credentials and access tokens. Cloud Run services access Secret Manager at runtime using
Workload Identity / Service Account bindings, avoiding hardcoded secrets in code or environment variables.
• Identity-Aware Proxy (IAP): Intercepts web traffic to the internal custom dashboard. It verifies user identity via Google Workspace / Cloud
Identity before routing requests to Cloud Run, eliminating the need to write custom authentication or user management code.
• Cloud Monitoring & Budget Alerts: Tracks service metrics, latency, Pub/Sub queue depth, error rates, and GCP project billing. Configured with
strict budget alerts at $300, $400, and $450 thresholds to ensure total monthly costs stay strictly under the $500/month cap.
#### B. Ingestion & Buffering Tier
• Cloud Scheduler: A serverless cron service configured to trigger the Cloud Run Ingestion Service every 60 seconds (* * * * *).
• Cloud Run Ingestion Service: A lightweight containerized service. When invoked by Cloud Scheduler:
1. Retrieves the external API key from Secret Manager.
2. Requests published articles from the external REST API.
3. Formats each article into a JSON event payload.
4. Publishes article items to the Pub/Sub topic in parallel batches.
• Pub/Sub Topic (article-ingest-topic): Serves as a buffer between API polling and AI enrichment. Decouples ingestion spikes (up to 5,000
articles/hour) from AI processing, guaranteeing zero message loss during surges.
• Dead-Letter Topic (article-dlq): Captures messages that fail processing after maximum retry attempts (e.g. 5 retries), preventing malformed
articles from blocking the pipeline.
#### C. AI Analysis & Processing Tier
• Cloud Run Worker Service (article-processor): Subscribed to Pub/Sub via a Push Subscription. Auto-scales dynamically (from 1 up to 10 instances
based on queue depth) to process incoming articles.
• Vertex AI (Gemini 2.0 Flash-Lite): Receives article text (truncated/summarized to ~800 words if necessary) and extracts:
• Sentiment Score: Continuous float from -1.0 (extremely negative) to +1.0 (extremely positive).
• Sentiment Category: Enum (POSITIVE, NEUTRAL, NEGATIVE).
• Key Topics: JSON Array of up to 5 extracted topic tags (e.g. ["Artificial Intelligence", "Cloud Computing", "Finance"]).
• Summary: A concise 2-sentence summary of the article.
• Uses Structured Outputs (response_mime_type="application/json") to guarantee strict JSON schema compliance directly from the model.
#### D. Storage & Data Warehouse Tier
• Cloud Storage (gs://PROJECT_ID-raw-articles): Standard GCS bucket where full, un-redacted raw JSON article payloads are stored for
debugging or audit purposes. Configured with a GCS Lifecycle Management Rule set to Age: 7 days (Action: Delete).
• BigQuery Data Warehouse (content_analytics.article_sentiment_topics):
• Stores structured metrics for analytical queries and trend visualization.
• Partitioning: Day-partitioned on ingested_at column to ensure query scans only process relevant date ranges, minimizing query costs.
• Clustering: Clustered on sentiment_category and primary_topic for high-speed trend filtering.
• Partition Expiration: Set to 180 days (6 months). BigQuery automatically drops partitions older than 180 days, eliminating manual database
cleanup and enforcing the retention requirement automatically.
#### E. Internal Custom Dashboard Serving Tier
• Cloud Run Web Application: Containerized web application (React frontend + Python FastAPI / Node.js backend).
• Executes optimized SQL queries against BigQuery using Application Default Credentials (ADC) and the BigQuery Storage Read API.
• Serves internal users with real-time sentiment distribution charts, topic volume trends, and recent article feeds.
──────
### 2. End-to-End Task & Data Flow
[Cron Event] [Fetch Articles] [Publish Message] [Push Event]
Cloud Scheduler ──────> Ingestion Service ──────> Pub/Sub Topic ───────> Worker Service
│ │
(Secret Manager) (Vertex AI Gemini)
│ │
[Read API Key] [Structured JSON]
│
┌────────────┴────────────┐
▼ ▼
Cloud Storage BigQuery
(Raw 7-Day TTL) (6-Month Expiry)
│
(SQL Scans)
▼
Internal UI
(IAP Auth)
1. Ingestion Trigger: Every 1 minute, Cloud Scheduler fires an HTTP POST request to the /ingest endpoint on the Cloud Run Ingestion Service.
2. REST API Polling: The Ingestion Service fetches the REST API key from Secret Manager, calls the external API for new articles since the last
checkpoint, and formats the payloads.
3. Buffering: Ingestion Service publishes each article JSON to projects/PROJECT_ID/topics/article-ingest-topic.
4. Push Processing: Pub/Sub pushes batches of messages via HTTP POST to the /process endpoint on the Cloud Run Worker Service.
5. AI Extraction: The Worker Service sends the article text to Vertex AI Gemini 2.0 Flash-Lite. Gemini responds in <500ms with a validated JSON
object containing sentiment scores and key topic tags.
6. Dual Data Persistence:
• The Worker writes the full raw JSON to gs://PROJECT_ID-raw-articles/YYYY/MM/DD/[article_id].json.
• The Worker streams the enriched row (article ID, timestamp, source, sentiment score, topics array) into content_analytics.
article_sentiment_topics in BigQuery.
7. Automated Lifecycle Purging:
• GCS purges raw payload files exactly 7 days after creation.
• BigQuery automatically drops table partitions older than 180 days (6 months).
8. Dashboard Visualization: Authorized internal users log in via IAP to access the custom Cloud Run Web Application, which runs real-time
aggregation queries against BigQuery.
──────
Please review this detailed architecture description.
Once approved, we will move to Task 2.4: Design Recommendations and Best Practices.
I okayed the description and asked it to provide the Design Recommendations and Best Practices. It was interesting to see how it used Google Cloud WAF, to provide recommendations/best practices across the key pillars:
- Cost Optimization Pillar
- Security & Identity Pillar
- Reliability & Resiliency Pillar
- Operational Excellent & Sustaibability Pillar
Here we go:
Reviewing Design Recommendations
### Task 2.4: Design Recommendations & Best Practices (Google Cloud WAF)
The following design recommendations are structured around the Google Cloud Well-Architected Framework (WAF) pillars to guarantee security, high
reliability, optimal performance, and strict cost control within your $500/month budget.
──────
### 1. Cost Optimization Pillar
• Vertex AI Prompt & Token Engineering:
• Use gemini-2.0-flash-lite with Structured JSON Outputs (response_mime_type="application/json").
• Input Optimization: Pre-process articles before sending to Gemini by passing the headline + lead paragraph + main body excerpts (~600–800
words max). Strip HTML tags, navigation bars, and boilerplate text. This cuts input token counts by ~65%, reducing monthly LLM inference costs
from $700 to **$215/month**.
• Cloud Run Scale-to-Zero Configuration:
• Set min-instances = 0 for all Cloud Run services. Compute scales to zero when no articles are being processed or when the dashboard is idle.
• Set Container concurrency = 80 requests per instance to maximize vCPU/RAM utilization per container instance.
• BigQuery Storage & Query Scanning Controls:
• Partitioning: Partition the article_sentiment_topics table by DAY(ingested_at). Queries from the Web UI filter on ingested_at >=
DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY), scanning only 7 days of data (~70 MB) per query instead of scanning the full 6-month table (~1.8 GB).
• Partition Expiration: Set partition_expiration_days = 180. BigQuery automatically purges expired partitions for free, maintaining a zero-
effort 6-month rolling window.
• Proactive Budget Guardrails:
• Configure a GCP Pub/Sub Billing Alert on project PROJECT_ID with notification triggers at $300 (60%), $400 (80%), and $450 (90%).
──────
### 2. Security & Identity Pillar
• Least-Privilege Service Accounts:
• sa-ingestion@PROJECT_ID.iam.gserviceaccount.com:
• Granted roles/secretmanager.secretAccessor (access REST API key secret only).
• Granted roles/pubsub.publisher (publish to article-ingest-topic only).
• sa-worker@PROJECT_ID.iam.gserviceaccount.com:
• Granted roles/aiplatform.user (invoke Vertex AI Gemini endpoint).
• Granted roles/storage.objectCreator (write to gs://PROJECT_ID-raw-articles).
• Granted roles/bigquery.dataEditor (stream rows into BigQuery dataset).
• sa-webui@PROJECT_ID.iam.gserviceaccount.com:
• Granted roles/bigquery.dataViewer & roles/bigquery.jobUser (read BigQuery metrics).
• Identity-Aware Proxy (IAP) Protection:
• Enforce IAP on the Cloud Run Web UI ingress. Only users assigned the roles/iap.httpsResourceAccessor role in IAM can authenticate via Google
OAuth to access the dashboard.
• Secrets Management:
• REST API keys are stored in Secret Manager (projects/PROJECT_ID/secrets/rest-api-key). Secret strings are never logged or stored
in environment variables.
──────
### 3. Reliability & Resilience Pillar
• Dead-Letter Queue (DLQ) Handling:
• Configure article-ingest-topic subscription with max_delivery_attempts = 5 and Dead-Letter Topic article-dlq. Malformed API responses are
diverted to the DLQ for inspection without breaking stream execution.
• Idempotency & Deduplication:
• Write GCS objects deterministically using gs://PROJECT_ID-raw-articles/YYYY/MM/DD/[ARTICLE_HASH].json. Re-processed messages
overwrite the existing file safely.
• In BigQuery, include article_id and use BigQuery Storage Write API with insert_id = article_id to prevent duplicate metric rows during retry
scenarios.
• Exponential Backoff & Rate-Limit Retry:
• Ingestion worker implements exponential backoff retry for HTTP 429 (Rate Limit Exceeded) and HTTP 5xx errors from the external REST API source.
──────
### 4. Operational Excellence & Sustainability Pillar
• Infrastructure as Code (IaC):
• Declaratively define all GCP resources (Cloud Run, Pub/Sub, BigQuery, GCS, Secret Manager, IAM roles, Cloud Scheduler) using Terraform code
for repeatable deployment.
• Structured Observability:
• Emit Cloud Logging entries in structured JSON format with a uniform trace_id propagated from Cloud Scheduler -> Pub/Sub -> Cloud Run Worker ->
BigQuery.
• Sustainability & Regional Footprint:
• Deploy all components in a Google Cloud region with high Carbon-Free Energy percentage (e.g. us-central1 or europe-west1) to minimize
environmental footprint.
──────
Please review these design recommendations.
Once approved, we will proceed to
Task 2.5: Generating Deployment Guidance and Terraform Code.
I approve this to see the Deployment Guidance and some IaC Terraform files. It also provides me Core Python logic for the worker along with deployment instructions:
### Task 2.5: Deployment Guidance & Infrastructure-as-Code
Here is the complete deployment guidance, including Terraform Infrastructure-as-Code, BigQuery SQL schema definitions, Python microservice code
snippets, and step-by-step deployment instructions for project PROJECT_ID.
──────
### 1. BigQuery DDL Schema (schema.sql)
Execute the following SQL in BigQuery to create the dataset and day-partitioned table with 180-day partition expiration:
-- Create Analytics Dataset
CREATE SCHEMA IF NOT EXISTS `PROJECT_ID.content_analytics`
OPTIONS(
location = 'us-central1',
description = 'Real-time content analytics dataset for sentiment and topic trends'
);
-- Create Partitioned & Clustered Table with 180-Day Expiration
CREATE TABLE IF NOT EXISTS `PROJECT_ID.content_analytics.article_sentiment_topics`
(
article_id STRING REQUIRED,
source_api STRING REQUIRED,
published_at TIMESTAMP REQUIRED,
ingested_at TIMESTAMP REQUIRED,
title STRING,
sentiment_score FLOAT64 REQUIRED, -- Range: -1.0 to 1.0
sentiment_category STRING REQUIRED, -- POSITIVE, NEUTRAL, NEGATIVE
primary_topic STRING REQUIRED,
topics_array ARRAY<STRING>,
summary STRING
)
PARTITION BY DATE(ingested_at)
CLUSTER BY sentiment_category, primary_topic
OPTIONS(
description = 'Article sentiment and key topic analysis streaming target',
partition_expiration_days = 180 -- Auto-purges partitions after 6 months
);
──────
### 2. Terraform Infrastructure-as-Code (main.tf)
Below is the complete Terraform configuration to provision all GCP resources:
# main.tf
terraform {
required_version = ">= 1.5.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
provider "google" {
project = var.project_id
region = var.region
}
variable "project_id" {
type = string
default = "PROJECT_ID"
}
variable "region" {
type = string
default = "us-central1"
}
# 1. Enable Required GCP APIs
resource "google_project_service" "services" {
for_each = toset([
"run.googleapis.com",
"pubsub.googleapis.com",
"bigquery.googleapis.com",
"storage.googleapis.com",
"secretmanager.googleapis.com",
"cloudscheduler.googleapis.com",
"aiplatform.googleapis.com",
"iap.googleapis.com"
])
service = each.key
disable_on_destroy = false
}
# 2. Secret Manager for REST API Key
resource "google_secret_manager_secret" "api_key" {
secret_id = "rest-api-key"
replication {
user_managed {
replicas {
location = var.region
}
}
}
depends_on = [google_project_service.services]
}
# 3. Cloud Storage Bucket for Raw Payloads (7-Day TTL)
resource "google_storage_bucket" "raw_articles" {
name = "${var.project_id}-raw-articles"
location = var.region
uniform_bucket_level_access = true
force_destroy = true
lifecycle_rule {
condition {
age = 7 # Delete objects after 7 days
}
action {
type = "Delete"
}
}
depends_on = [google_project_service.services]
}
# 4. Pub/Sub Ingestion Topic & DLQ
resource "google_pubsub_topic" "dlq_topic" {
name = "article-dlq"
depends_on = [google_project_service.services]
}
resource "google_pubsub_topic" "ingest_topic" {
name = "article-ingest-topic"
depends_on = [google_project_service.services]
}
# 5. Service Accounts
resource "google_service_account" "sa_ingest" {
account_id = "sa-ingest"
display_name = "Ingestion Service Account"
}
resource "google_service_account" "sa_worker" {
account_id = "sa-worker"
display_name = "AI Processing Worker Service Account"
}
# 6. IAM Role Bindings
resource "google_pubsub_topic_iam_member" "ingest_publisher" {
topic = google_pubsub_topic.ingest_topic.name
role = "roles/pubsub.publisher"
member = "serviceAccount:${google_service_account.sa_ingest.email}"
}
resource "google_project_iam_member" "worker_vertex" {
project = var.project_id
role = "roles/aiplatform.user"
member = "serviceAccount:${google_service_account.sa_worker.email}"
}
resource "google_storage_bucket_iam_member" "worker_gcs" {
bucket = google_storage_bucket.raw_articles.name
role = "roles/storage.objectCreator"
member = "serviceAccount:${google_service_account.sa_worker.email}"
}
resource "google_project_iam_member" "worker_bq" {
project = var.project_id
role = "roles/bigquery.dataEditor"
member = "serviceAccount:${google_service_account.sa_worker.email}"
}
──────
### 3. Processing Microservice Snippet (worker_service.py)
Here is the core Python logic for the Cloud Run worker invoking Gemini 2.0 Flash-Lite with Structured JSON Output:
import os
import json
import datetime
from flask import Flask, request, jsonify
from google.cloud import storage, bigquery
import vertexai
from vertexai.generative_models import GenerativeModel, GenerationConfig
app = Flask(__name__)
# Initialize GCP Clients
PROJECT_ID = os.environ.get("GCP_PROJECT", "PROJECT_ID")
vertexai.init(project=PROJECT_ID, location="us-central1")
gcs_client = storage.Client()
bq_client = bigquery.Client()
BUCKET_NAME = f"{PROJECT_ID}-raw-articles"
DATASET_ID = "content_analytics"
TABLE_ID = "article_sentiment_topics"
# Initialize Gemini Model with Structured JSON Schema
gemini_model = GenerativeModel("gemini-2.0-flash-lite")
JSON_SCHEMA = {
"type": "OBJECT",
"properties": {
"sentiment_score": {"type": "NUMBER", "description": "Continuous score from -1.0 to 1.0"},
"sentiment_category": {"type": "STRING", "enum": ["POSITIVE", "NEUTRAL", "NEGATIVE"]},
"primary_topic": {"type": "STRING", "description": "Main category topic"},
"topics_array": {"type": "ARRAY", "items": {"type": "STRING"}},
"summary": {"type": "STRING", "description": "2-sentence summary"}
},
"required": ["sentiment_score", "sentiment_category", "primary_topic", "topics_array", "summary"]
}
@app.route("/process", methods=["POST"])
def process_pubsub_message():
envelope = request.get_json()
if not envelope or "message" not in envelope:
return ("Invalid Pub/Sub message", 400)
# 1. Parse Message
import base64
msg_data = base64.b64decode(envelope["message"]["data"]).decode("utf-8")
article = json.loads(msg_data)
article_id = article.get("id", str(datetime.datetime.utcnow().timestamp()))
text_content = article.get("content", "")[:3500] # Truncate to ~700 words for token optimization
# 2. Invoke Gemini for Sentiment & Topic Analysis
prompt = f"Analyze the following article text for sentiment and key topics:\n\n{text_content}"
response = gemini_model.generate_content(
prompt,
generation_config=GenerationConfig(
response_mime_type="application/json",
response_schema=JSON_SCHEMA,
temperature=0.1
)
)
analysis = json.loads(response.text)
now_iso = datetime.datetime.utcnow().isoformat()
# 3. Store Raw JSON in GCS (7-Day TTL)
date_prefix = datetime.datetime.utcnow().strftime("%Y/%m/%d")
blob = gcs_client.bucket(BUCKET_NAME).blob(f"{date_prefix}/{article_id}.json")
blob.upload_from_string(json.dumps(article), content_type="application/json")
# 4. Stream Structured Record into BigQuery
row_to_insert = [{
"article_id": article_id,
"source_api": article.get("source", "REST_API"),
"published_at": article.get("published_at", now_iso),
"ingested_at": now_iso,
"title": article.get("title", ""),
"sentiment_score": float(analysis["sentiment_score"]),
"sentiment_category": analysis["sentiment_category"],
"primary_topic": analysis["primary_topic"],
"topics_array": analysis["topics_array"],
"summary": analysis["summary"]
}]
table_ref = bq_client.dataset(DATASET_ID).table(TABLE_ID)
errors = bq_client.insert_rows_json(table_ref, row_to_insert)
if errors:
print(f"BigQuery streaming errors: {errors}")
return (f"BQ Insert Error: {errors}", 500)
return ("OK", 200)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
──────
### 4. Step-by-Step Deployment Instructions
1. Set Active Project:
gcloud config set project PROJECT_ID
2. Initialize Infrastructure with Terraform:
terraform init
terraform apply -auto-approve
3. Store REST API Key in Secret Manager:
echo -n "YOUR_REST_API_KEY_HERE" | gcloud secrets versions add rest-api-key --data-file=-
4. Create BigQuery Schema:
bq query --use_legacy_sql=false < schema.sql
5. Build & Deploy Container Microservices to Cloud Run:
# Build & Deploy Ingestion Worker Service
gcloud builds submit --tag gcr.io/PROJECT_ID/article-processor
gcloud run deploy article-processor \
--image gcr.io/PROJECT_ID/article-processor \
--service-account sa-worker@PROJECT_ID.iam.gserviceaccount.com \
--region us-central1 \
--no-allow-unauthenticated
6. Bind Pub/Sub Push Subscription to Worker Service:
gcloud pubsub subscriptions create article-worker-sub \
--topic article-ingest-topic \
--push-endpoint https://article-processor-xxxx-uc.a.run.app/process \
--push-auth-service-account sa-worker@PROJECT_ID.iam.gserviceaccount.com \
--dead-letter-topic article-dlq \
--max-delivery-attempts 5
──────
Please confirm if you approve these deployment instructions.
Once approved, we will proceed to Phase 3: Solution Validation.
The question here surprised me a bit. What is Solution Validation? So I asked it specifically what it meant by that.
────────────────────────────────────────────────────────────
> How are you going to validate the solution?
To ensure the proposed architecture functions correctly, meets all requirements, and stays under budget, we perform validation in two distinct
stages: Pre-deployment Static Validation (Dry-Run) and Runtime Integration Validation.
──────
### Stage 1: Pre-deployment Validation (Static & Dry-Run)
Before provisioning live GCP resources, we perform static syntax, schema, and policy checks:
1. Infrastructure Dry-Run (terraform plan):
• Runs terraform validate and terraform plan against PROJECT_IDsyntax, provider dependencies, resource arguments, and
IAM bindings without creating resources.
2. BigQuery Schema & SQL Validation:
• Uses bq query --dry_run on schema.sql to validate DDL syntax, partition configuration, clustering fields, and partition expiration policies.
3. IAM Least-Privilege & Policy Audit:
• Verifies that service accounts (sa-ingest, sa-worker, sa-webui) only hold the minimal necessary roles (roles/pubsub.publisher,
roles/aiplatform.user, roles/storage.objectCreator, roles/bigquery.dataEditor) with zero global owner or editor permissions.
4. Lifecycle & Retention Policy Verification:
• Confirms GCS lifecycle rule (Age: 7 days) and BigQuery partition expiration (180 days) are correctly declared in Terraform/DDL.
──────
### Stage 2: Runtime Validation (Live Functional & Integration Testing)
After resources are provisioned, we execute runtime verification commands to confirm end-to-end data flow:
1. Secret & API Connectivity Check:
• Verifies the Cloud Run ingestion service can successfully fetch and decrypt the REST API key from Secret Manager.
2. Mock Payload Ingestion & Pub/Sub Push:
• Publishes a test article JSON payload directly to article-ingest-topic using gcloud pubsub topics publish.
• Verifies the Cloud Run worker is triggered via push subscription and logs HTTP 200.
3. Gemini AI Structured Output Verification:
• Inspects Cloud Run worker logs to verify Gemini 2.0 Flash-Lite returns a valid JSON object matching the required schema (sentiment score,
category, primary topic, topics array).
4. Dual-Store Data Persistence Check:
• GCS Check: Runs gsutil ls gs://PROJECT_ID-raw-articles/... to confirm the raw JSON file was uploaded with correct 7-day lifecycle
metadata.
• BigQuery Check: Executes a SQL query against BigQuery (SELECT * FROM content_analytics.article_sentiment_topics ORDER BY ingested_at DESC
LIMIT 5) to confirm structured sentiment and topic fields were successfully inserted into the partitioned table.
5. Dead-Letter Queue (DLQ) Resilience Test:
• Publishes a intentionally malformed JSON message to article-ingest-topic to verify it retries 5 times and routes cleanly to article-dlq
without crashing the service.
6. IAP & Dashboard Endpoint Check:
• Sends an unauthenticated curl request to the Cloud Run Web UI endpoint to verify it returns HTTP 401 / 302 Redirect (confirming IAP security
enforcement).
──────
### Next Step & Approval Request
Would you like me to present the Task 3.1 Pre-deployment Static Validation Plan execution steps, or do you choose to proceed directly to
consolidating the final Solution Architecture Guide artifact (Phase 4)?
This is interesting. What this would have meant is that it would have provisioned the resources (ofcourse via the gcloud tools that you have on your machine) and validated stuff against it.
I choose to not let it touch my Google Cloud Project for the moment (though it would be interesting to let it do that in another project). So I simply told it to give me the instructions to do the same, so that I could run it when I want:
Provide me the steps only. Don't execute anything against the environment.
So finally, I got the following, where it wrote the details to a solution-architecture-guide.md, which I approved. This artifact I could possibly use as input to do other things moving forward too.
▸ Thought for 7s, 404 tokens
Consolidating Architecture Guide
▸ Thought for 4s, 141 tokens
Defining the Target Directory
● Create(/Users/romin/.gemini/antigravity-cli/brain/7d320146-a1c0-498c-af56-45378df22ee8/solution-architecture-guide.md) (ctrl+o to expand)
I have completed the end-to-end Google Cloud solution architecture design
for your Real-Time Content Analytics Platform on project PROJECT_ID.
The complete documentation has been consolidated into the artifact:
👉 solution-architecture-guide.md
──────
### Architecture Summary
[ External REST API ]
│ (HTTP GET)
▼
┌─────────────────────────────────────────────────────────────┐
│ 1. Ingestion Tier │
│ • Cloud Scheduler (Cron trigger every 1 min) │
│ • Cloud Run Ingestion Service (Polls API via Secret Mgr) │
└──────────────────────────┬──────────────────────────────────┘
│ (Publish)
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Buffering Tier │
│ • Pub/Sub Topic: article-ingest-topic │
│ • Dead-Letter Queue: article-dlq │
└──────────────────────────┬──────────────────────────────────┘
│ (Push Event)
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. AI Analysis Tier │
│ • Cloud Run Worker Service │
│ • Vertex AI Gemini 2.0 Flash-Lite (Structured JSON) │
└──────────────────────────┬──────────────────────────────────┘
│
┌─────────────┴─────────────┐
▼ ▼
┌───────────────────────────┐ ┌───────────────────────────┐
│ 4a. Short-Term Raw Store │ │ 4b. Data Warehouse │
│ Cloud Storage Bucket │ │ BigQuery Warehouse │
│ (7-Day Lifecycle TTL) │ │ (180-Day Partition Exp)│
└───────────────────────────┘ └─────────────┬─────────────┘
│ (SQL Scans)
▼
┌───────────────────────────┐
│ 5. Serving Tier │
│ Cloud Run Web UI │
│ + Identity-Aware Proxy │
└───────────────────────────┘
──────
### Key Architectural Highlights
1. Ingestion & Buffering: Cloud Scheduler triggers a Cloud Run Ingestion Service every 60 seconds to pull articles from external REST APIs using
credentials in Secret Manager. Payload events are published to Pub/Sub (article-ingest-topic) with a Dead-Letter Queue (article-dlq) for
unprocessable messages.
2. AI Enrichment: Cloud Run Worker instances receive Pub/Sub push events, format article text (truncated to top ~700 words), and call Vertex AI
Gemini 2.0 Flash-Lite with Structured JSON Schema enforcement (response_mime_type="application/json").
3. Dual-Tier Storage:
• Short-term Raw Payloads: Full raw JSON stored in Cloud Storage (gs://PROJECT_ID-raw-articles) with an automated 7-day Lifecycle
Purge Rule.
• Analytical Data Warehouse: Metrics streamed into BigQuery (content_analytics.article_sentiment_topics) partitioned by day (ingested_at) and
clustered on sentiment_category, primary_topic with 180-day (6-month) partition expiration.
4. Internal Visualization: Internal custom web application hosted on Cloud Run, secured with Identity-Aware Proxy (IAP) and Google Cloud Identity
authentication.
5. Cost Optimization (< $500/mo Budget Target):
• Projected Monthly Cost: ~$304.80 / month (Gemini 2.0 Flash-Lite ~$215/mo, Cloud Run scale-to-zero ~$35/mo, BigQuery/GCS/PubSub ~$3/mo, reserve
buffer ~$50/mo).
──────
### Static & Runtime Validation Plan Steps
#### Pre-Deployment Validation (Dry-Run Only)
1. Terraform Dry-Run: Run terraform validate and terraform plan against main.tf to verify resource configurations, provider dependencies, and IAM
least-privilege roles without provisioning resources.
2. BigQuery Schema Dry-Run: Execute bq query --dry_run on the BigQuery DDL script to validate partition columns, clustering fields, and the 180-day
partition expiration policy.
#### Runtime Verification Steps (Execute Post-Deployment)
1. Mock Message Ingestion: gcloud pubsub topics publish article-ingest-topic --message '{"id":"test-001","content":"Google Cloud introduces new
Gemini features..."}'
2. Gemini Extraction Verification: bq query --use_legacy_sql=false 'SELECT article_id, sentiment_score, primary_topic FROM content_analytics.
article_sentiment_topics WHERE article_id="test-001"'
3. GCS Lifecycle Check: gsutil ls gs://PROJECT_ID-raw-articles/**/test-001.json
4. IAP Security Endpoint Test: curl -I https://webui-xxxx-uc.a.run.app (Verifies HTTP 401 / 302 unauthenticated redirect).
> /artifact
⎿ Review submitted
────────────────────────────────────────────────────────────
> [Approved] solution-architecture-guide.md
It thanked me for approving it. Actually, I should be thanking it for providing me details at this level. 🙂 . It asked if it can write the deployment code files to the workspace directory, which I asked it to.
Thank you for approving the solution architecture guide!
Would you like me to write the deployment code files into your workspace directory (/Users/romin/agy2-projects/google-skills-tutorial/)?
Specifically, I can create:
1. terraform/main.tf: Complete Terraform Infrastructure-as-Code.
2. sql/schema.sql: BigQuery schema DDL with partitioning & 180-day retention options.
3. src/worker_service.py: Cloud Run worker logic calling Vertex AI Gemini 2.0 Flash-Lite with structured JSON outputs.
4. src/ingest_service.py: API polling ingestion service.
5. Dockerfile & requirements.txt: Containerization files for Cloud Run deployment.
Please let me know if you'd like me to proceed with creating these code files!
────────────────────────────────────────────────────────────
> yes - please create those files.
▸ Thought for 2s, 128 tokens
Initiating File Creation
● Create(/Users/romin/agy2-projects/google-skills-tutorial/terraform/main.tf)
● Create(/Users/romin/agy2-projects/google-skills-tutorial/sql/schema.sql)
● Create(/Users/romin/agy2-projects/google-skills-tutorial/src/worker_service.py)
● Create(/Users/romin/agy2-projects/google-skills-tutorial/src/ingest_service.py)
● Create(/Users/romin/agy2-projects/google-skills-tutorial/requirements.txt)
● Create(/Users/romin/agy2-projects/google-skills-tutorial/Dockerfile) (ctrl+o to expand)
All deployment code files have been created in your workspace:
📁 Created Workspace Files:
• main.tf - Infrastructure-as-Code provisioning APIs, GCS (7-day TTL), Pub/Sub, Secret Manager & IAM service accounts.
• schema.sql - BigQuery schema definition with ingested_at day-partitioning, topic/sentiment clustering, and 180-day partition expiration.
• worker_service.py - Python Flask/Gunicorn worker service invoking Vertex AI Gemini 2.0 Flash-Lite with structured JSON outputs.
• ingest_service.py - REST API ingestion container fetching API keys from Secret Manager and publishing to Pub/Sub.
• requirements.txt & Dockerfile - Containerization configuration for Cloud Run deployment.
### Next Steps to Deploy
When you're ready to deploy to GCP project PROJECT_ID:
# 1. Initialize & Apply Terraform Infrastructure
cd terraform && terraform init && terraform apply
# 2. Populate REST API Key Secret
gcloud secrets versions add rest-api-key --data-file=-
# 3. Create BigQuery Schema
bq query --use_legacy_sql=false < sql/schema.sql
# 4. Deploy Container to Cloud Run
gcloud builds submit --tag gcr.io/PROJECT_ID/article-processor ..
gcloud run deploy article-processor --image gcr.io/PROJECT_ID/article-processor --region us-central1
The final steps provided for deploy can be used to provision and test out the solution.
Conclusion
The google-cloud-solution-architecture skill transforms how developers and cloud architects approach system design on Google Cloud. Instead of manually mapping out components, calculating complex pricing tiers, or writing Terraform boilerplate from scratch, you can collaborate interactively with an AI agent.
Through its structured four-phase workflow, from initial requirements discovery and Well-Architected product recommendations to cost optimization, dry-run validation, and automated code generation, it delivers a production-grade blueprint tailored to your budget and operational needs in minutes.
Give this skill a spin on your next project to streamline your architecture design workflow and focus on what matters most: building great software.
I also believe this skill is a good way to learn more about best practices for Google Cloud and actually prepare for a few Google Cloud Certifications.
We will continue to explore some more official Google Cloud Agent Skills in the next parts in the series.
Google Cloud Skills Tutorial — Part 4 : Google Cloud Solution Architecture Skill was originally published in Google Cloud – Community on Medium, where people are continuing the conversation by highlighting and responding to this story.
Source Credit: https://medium.com/google-cloud/google-cloud-skills-tutorial-part-4-google-cloud-solution-architecture-skill-bc1db1594d03?source=rss—-e52cf94d98af—4
