{"id":495,"date":"2026-09-25T08:50:00","date_gmt":"2026-09-25T06:50:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=495"},"modified":"2026-09-25T10:49:12","modified_gmt":"2026-09-25T08:49:12","slug":"serverless-microservices-scaling-on-google-cloud-run-with-github-actions","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/","title":{"rendered":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">Running microservices on static virtual machines or permanent Kubernetes clusters incurs constant baseline infrastructure costs, even during prolonged periods of zero traffic. Deploying stateless containerized web APIs to Google Cloud Run enables a fully managed, serverless architecture that scales automatically from zero instances during idle hours up to thousands of concurrent containers during traffic spikes. Integrating this deployment model with GitHub Actions and Workload Identity Federation establishes a zero-maintenance, highly secure Continuous Integration and Continuous Deployment (CI\/CD) pipeline without storing long-lived service account JSON keys in external repositories.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">1. Architectural Framework: Scale-to-Zero &amp; Keyless CI\/CD<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">An enterprise-grade serverless deployment architecture on Google Cloud relies on three decoupled components:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Google Cloud Run Container Execution:<\/strong> Stateless containers are invoked on demand via incoming HTTP requests. Concurrency settings allow a single container instance to process up to 80 simultaneous requests (the default, configurable up to 1,000) before horizontal autoscaling triggers additional instances.<\/li>\r\n<li><strong>Workload Identity Federation (WIF):<\/strong> Replaces static, exportable service account JSON keys with OpenID Connect (OIDC) token exchange between GitHub and Google Cloud IAM, eliminating credential leakage vulnerabilities.<\/li>\r\n<li><strong>GitHub Actions Pipeline:<\/strong> An automated workflow builds the application Docker image, pushes it to Google Artifact Registry, and updates the Cloud Run revision with zero downtime.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/hand-cloudrun-en.png\" width=\"1120\" height=\"640\" alt=\"Two numbered phases: establishing trust via workload identity federation, then building and deploying to Cloud Run, with the stored JSON key crossed out\">\n<figcaption>The pipeline never holds a permanent secret: GitHub proves who it is, Google hands back a token valid for minutes, and only then does anything get built or deployed.<\/figcaption>\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">2. Step-by-Step Workload Identity Federation Setup<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">To enable keyless authentication for GitHub Actions, a Workload Identity Pool and Provider must be provisioned via the Google Cloud CLI:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code class=\"language-bash\"># 1. Create Workload Identity Pool\ngcloud iam workload-identity-pools create \"github-actions-pool\" \\\n  --project=\"enterprise-ai-project\" \\\n  --location=\"global\" \\\n  --display-name=\"GitHub Actions Pool\"\n\n# 2. Create OIDC Identity Provider for GitHub\ngcloud iam workload-identity-pools providers create-oidc \"github-provider\" \\\n  --project=\"enterprise-ai-project\" \\\n  --location=\"global\" \\\n  --workload-identity-pool=\"github-actions-pool\" \\\n  --display-name=\"GitHub Provider\" \\\n  --attribute-mapping=\"google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository\" \\\n  --attribute-condition=\"assertion.repository_owner == 'enterprise-org'\" \\\n  --issuer-uri=\"https:\/\/token.actions.githubusercontent.com\"\n\n# 3. Bind Service Account to the GitHub Repository\ngcloud iam service-accounts add-iam-policy-binding \"ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com\" \\\n  --project=\"enterprise-ai-project\" \\\n  --role=\"roles\/iam.workloadIdentityUser\" \\\n  --member=\"principalSet:\/\/iam.googleapis.com\/projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/attribute.repository\/enterprise-org\/microservice-repo\"<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">3. Step-by-Step GitHub Actions Workflow Configuration<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">The automated deployment pipeline requires a structured YAML configuration located in <code>.github\/workflows\/deploy.yml<\/code>. This workflow authenticates via OIDC, builds the container image, and deploys to Cloud Run with explicit autoscaling and concurrency parameters:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code class=\"language-yaml\">name: Deploy to Google Cloud Run\n\non:\n  push:\n    branches:\n      - main\n\npermissions:\n  contents: 'read'\n  id-token: 'write'\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions\/checkout@v4\n\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: 'projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/providers\/github-provider'\n          service_account: 'ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com'\n\n      - name: Set up Cloud SDK\n        uses: google-github-actions\/setup-gcloud@v2\n\n      - name: Configure Docker for Artifact Registry\n        run: gcloud auth configure-docker us-central1-docker.pkg.dev\n\n      - name: Build and Push Docker Image\n        run: |\n          docker build -t us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }} .\n          docker push us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }}\n\n      - name: Deploy to Cloud Run\n        run: |\n          gcloud run deploy api-service \\\n            --image us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }} \\\n            --region us-central1 \\\n            --platform managed \\\n            --allow-unauthenticated \\\n            --min-instances 0 \\\n            --max-instances 50 \\\n            --concurrency 80 \\\n            --memory 512Mi \\\n            --cpu 1<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">4. Step-by-Step Scaling &amp; Concurrency Engineering<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">To ensure optimal resource utilization and prevent cold-start latency from degrading API performance, Cloud Run runtime flags must be configured precisely:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li><strong>Scale-to-Zero Verification (<code>--min-instances=0<\/code>):<\/strong> Lets Cloud Run scale the service down to zero instances without traffic; idle instances may be kept for up to 15 minutes, but under the default request-based billing they are not charged, bringing compute billing to exactly $0.00 during idle periods.<\/li>\r\n<li><strong>Concurrency Tuning (<code>--concurrency=80<\/code>):<\/strong> Allows a single container CPU to handle up to 80 simultaneous requests before scaling out, reducing container churn and memory footprint compared to single-concurrency architectures.<\/li>\r\n<li><strong>CPU Throttling Allocation:<\/strong> By default, CPU is throttled outside of active request processing. If background tasks or asynchronous cleanup operations are required post-response, set `&#8211;no-cpu-throttling` in combination with `&#8211;min-instances=1`.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">5. Summary &amp; Architectural Value<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>What this tutorial achieves:<\/strong> The deployment of a fully automated, keyless CI\/CD deployment pipeline for containerized microservices on Google Cloud Run using GitHub Actions and Workload Identity Federation.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Resulting value:<\/strong> Hosting costs are minimized by dropping compute expenses to zero during inactive periods while retaining the ability to scale horizontally in seconds during sudden traffic bursts. Eliminating long-lived JSON service account keys removes credential leakage risks, and setting explicit concurrency limits maximizes container efficiency, creating a secure, maintenance-free serverless backend infrastructure.<\/p>\r\n\n\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n\n<h3>Does a service that scales to zero instances really cost nothing?<\/h3>\n<p>Compute time costs nothing; the rest of the chain does not come free. Every pipeline run pushes a new image tagged with the commit hash to Artifact Registry, and that storage is billed by volume whether the service is running or not. A cleanup policy in Artifact Registry that deletes old images while keeping a few recent ones, so that rolling back to an earlier revision remains possible, keeps that cost small.<\/p>\n\n<h3>Which roles does the ci-cd-deployer service account need beyond the Workload Identity binding?<\/h3>\n<p>The binding with <code>roles\/iam.workloadIdentityUser<\/code> only allows GitHub to act as this account. What the account may do afterwards is determined by further roles, and the workflow needs three of them:<\/p>\n<ol>\n<li>Write access to the Artifact Registry repository, usually <code>roles\/artifactregistry.writer<\/code>; without it, <code>docker push<\/code> fails.<\/li>\n<li>A Cloud Run role for deploying. <code>roles\/run.developer<\/code> is enough for <code>gcloud run deploy<\/code>, but not for <code>--allow-unauthenticated<\/code>: that flag changes the service&#8217;s IAM policy, which requires <code>roles\/run.admin<\/code>.<\/li>\n<li><code>roles\/iam.serviceAccountUser<\/code> on the service account the service runs as; without a separate setting, that is the project&#8217;s default Compute Engine service account. Without this role, the deployer cannot create a revision that runs under another identity.<\/li>\n<\/ol>\n<p>Granting these roles as narrowly as possible, on the one repository and the one service rather than the whole project, is the sensible choice. A leaked key is ruled out; a faulty workflow is not, and the roles decide how far its damage reaches.<\/p>\n\n<h3>Is the binding to the repository enough, or can any branch deploy?<\/h3>\n<p>The binding covers the entire repository. The workflow only starts on a push to main, but any other workflow file in the same repository, including one on another branch, can request a token with <code>id-token: write<\/code>, and Google accepts it because the <code>repository<\/code> attribute matches.<\/p>\n<p>The branch narrows it down, and GitHub&#8217;s OIDC token carries it in the <code>ref<\/code> claim. A condition on the provider such as <code>assertion.ref == 'refs\/heads\/main'<\/code> (added to <code>--attribute-condition<\/code> with <code>&amp;&amp;<\/code>), or an additionally mapped attribute that the service account is bound to, lets only runs from main through. The condition on <code>assertion.repository_owner<\/code> set in section 2 also ensures that the pool does not accept tokens from other organizations at all.<\/p>\n\n<h3>What does combining &#8211;no-cpu-throttling with &#8211;min-instances=1 cost?<\/h3>\n<p>The advantage the article starts with. A minimum instance with CPU always allocated runs around the clock and is billed even when no request arrives, so compute costs no longer drop to zero during idle periods. For work after the response, a separate queue or a Cloud Run job is therefore often the cheaper option, leaving the web service itself free to scale to zero.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Cloud Run documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker documentation<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>A technical step-by-step tutorial on deploying and scaling serverless microservices on Google Cloud Run using GitHub Actions and Workload Identity Federation.<\/p>\n","protected":false},"author":1,"featured_media":14055,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92636],"tags":[91106,91144,91145,91407,91219],"class_list":["post-495","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-cloud-ai","tag-automation","tag-devops","tag-docker","tag-google-cloud","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"A technical step-by-step tutorial on deploying and scaling serverless microservices on Google Cloud Run using GitHub Actions and Workload Identity Federation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-25T06:50:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-25T08:49:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions\",\"datePublished\":\"2026-09-25T06:50:00+00:00\",\"dateModified\":\"2026-09-25T08:49:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/\"},\"wordCount\":946,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-495-serverless-microservices-scaling-goo-g.png\",\"keywords\":[\"Automation\",\"DevOps\",\"Docker\",\"Google Cloud\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/\",\"name\":\"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-495-serverless-microservices-scaling-goo-g.png\",\"datePublished\":\"2026-09-25T06:50:00+00:00\",\"dateModified\":\"2026-09-25T08:49:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-495-serverless-microservices-scaling-goo-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-495-serverless-microservices-scaling-goo-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/tutorials-en-cloud-ai\\\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/","og_locale":"en_US","og_type":"article","og_title":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog","og_description":"A technical step-by-step tutorial on deploying and scaling serverless microservices on Google Cloud Run using GitHub Actions and Workload Identity Federation.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-25T06:50:00+00:00","article_modified_time":"2026-09-25T08:49:12+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions","datePublished":"2026-09-25T06:50:00+00:00","dateModified":"2026-09-25T08:49:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/"},"wordCount":946,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png","keywords":["Automation","DevOps","Docker","Google Cloud","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/","name":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png","datePublished":"2026-09-25T06:50:00+00:00","dateModified":"2026-09-25T08:49:12+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-495-serverless-microservices-scaling-goo-g.png","width":1200,"height":630,"caption":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/tutorials-en-cloud-ai\/serverless-microservices-scaling-on-google-cloud-run-with-github-actions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Serverless Microservices: Scaling on Google Cloud Run with GitHub Actions"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=495"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/495\/revisions"}],"predecessor-version":[{"id":17961,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/495\/revisions\/17961"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14055"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}