{"id":496,"date":"2026-09-25T13:40:00","date_gmt":"2026-09-25T11:40:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=496"},"modified":"2026-10-26T12:44:32","modified_gmt":"2026-10-26T11:44:32","slug":"serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/","title":{"rendered":"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions"},"content":{"rendered":"<p>Google Cloud Run betreibt Container-Webdienste ohne eigenen Server- oder Kubernetes-Betrieb. Bei passender Konfiguration kann ein Dienst ohne Anfragen auf null Instanzen schrumpfen. Bei Last w\u00e4chst die Zahl der Instanzen innerhalb der verf\u00fcgbaren Kontingente und Skalierungsgrenzen. Eine Instanz ist eine laufende Kopie der Anwendung. Das Starten einer neuen Kopie braucht Zeit; diese Verz\u00f6gerung hei\u00dft Kaltstart. Anwendungspflege und laufende Kosten anderer Dienste bleiben ebenfalls relevant.<\/p>\n<p>Ein Image enth\u00e4lt die Anwendung und die f\u00fcr den Betrieb ben\u00f6tigten Dateien. Eine Revision ist eine bereitgestellte Version mit einem bestimmten Image und bestimmten Einstellungen. GitHub Actions kann Images bauen und \u00fcber Workload Identity Federation (WIF) in Google Cloud bereitstellen. WIF ersetzt einen dauerhaft hinterlegten Google-Service-Account-Schl\u00fcssel durch kurzlebige Anmeldedaten. Kompromittierte Workflows, zu breite Rechte und versehentlich mitgepackte Zugangsdaten bleiben Risiken. Das folgende Beispiel trennt deshalb den Build von der Cloud-Anmeldung und stellt eine neue Revision zun\u00e4chst ohne regul\u00e4ren Verkehr bereit.<\/p>\n<h2>1. Voraussetzungen und getrennte Identit\u00e4ten<\/h2>\n<p>Vor dem Workflow m\u00fcssen Projekt, Abrechnung, erforderliche APIs, Artifact-Registry-Repository <code>services<\/code>, Deployer-Konto und separates Laufzeitkonto existieren. Das Beispiel aktualisiert einen bereits angelegten Dienst <code>api-service<\/code> in <code>us-central1<\/code>. Dessen IAM-Aufrufpr\u00fcfung ist aktiviert; \u00f6ffentliche Aufrufrechte sind nicht vergeben. Die initiale Einrichtung und sp\u00e4tere \u00c4nderungen des \u00f6ffentlichen Zugriffs erfolgen mit passenden administrativen Rechten au\u00dferhalb der Pipeline.<\/p>\n<ul><li><strong>Deployer:<\/strong> <code>ci-cd-deployer<\/code> ben\u00f6tigt Artifact Registry Writer auf dem Image-Repository, Cloud Run Developer auf dem bestehenden Dienst und Service Account User auf dem Laufzeitkonto. Writer umfasst auch die f\u00fcr das Deployment ben\u00f6tigten Leserechte auf Images.<\/li><li><strong>Laufzeitkonto:<\/strong> <code>api-runtime<\/code> erh\u00e4lt nur die Rechte der Anwendung, beispielsweise Zugriff auf einen bestimmten Datenspeicher. Deployment-Rechte geh\u00f6ren nicht zu dieser Aufgabe.<\/li><li><strong>Anwendung:<\/strong> Der Container muss auf <code>0.0.0.0:$PORT<\/code> lauschen und Sitzungen oder dauerhafte Daten au\u00dferhalb des fl\u00fcchtigen Containers speichern. Ein Dockerfile und ein projektspezifisches, ausf\u00fchrbares Testskript <code>ci\/test.sh<\/code> werden vorausgesetzt.<\/li><\/ul>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-496-review-20261024.png\" width=\"1120\" height=\"580\" alt=\"Vor der Cloud-Anmeldung bauen, einen Image-Digest bereitstellen, anschlie\u00dfend testen und freigeben\"><figcaption>Der Build l\u00e4uft vor dem Erzeugen der Cloud-Anmeldedatei. WIF begrenzt den Cloud-Zugriff; Anwendungstests und gezielte Verkehrsumschaltung vervollst\u00e4ndigen die Freigabe.<\/figcaption><\/figure>\n<h2>2. WIF auf Organisation, Repository und Main-Branch begrenzen<\/h2>\n<p>Die folgenden Befehle richten eine neue Vertrauensbeziehung ein. Alle Beispielkennungen m\u00fcssen vorher ersetzt werden. <code>PROJECT_NUMBER<\/code> ist die numerische Google-Projektnummer, keine Projekt-ID. <code>OWNER_ID<\/code> und <code>REPOSITORY_ID<\/code> sind die numerischen GitHub-Kennungen. Damit erh\u00e4lt ein anderes Konto keinen Zugriff allein dadurch, dass ein gel\u00f6schter Organisations- oder Repository-Name erneut vergeben wird.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\">#!\/usr\/bin\/env bash<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Replace all example identifiers before administrative setup.<\/span>\n<\/span><span class=\"cbb-line\">PROJECT_ID=<span class=\"cbb-string\">\"enterprise-ai-project\"<\/span>\n<\/span><span class=\"cbb-line\">PROJECT_NUMBER=<span class=\"cbb-string\">\"1234567890\"<\/span>\n<\/span><span class=\"cbb-line\">OWNER_ID=<span class=\"cbb-string\">\"11111111\"<\/span>\n<\/span><span class=\"cbb-line\">REPOSITORY_ID=<span class=\"cbb-string\">\"22222222\"<\/span>\n<\/span><span class=\"cbb-line\">DEPLOYER=<span class=\"cbb-string\">\"ci-cd-deployer@<\/span><span class=\"cbb-variable\">${PROJECT_ID}<\/span><span class=\"cbb-string\">.iam.gserviceaccount.com\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam workload-identity-pools create github-actions-pool \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--location<\/span>=global \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--display-name<\/span>=<span class=\"cbb-string\">\"GitHub Actions Pool\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam workload-identity-pools providers create-oidc github-provider \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--location<\/span>=global \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--workload-identity-pool<\/span>=github-actions-pool \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--issuer-uri<\/span>=<span class=\"cbb-string\">\"https:\/\/token.actions.githubusercontent.com\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--attribute-mapping<\/span>=<span class=\"cbb-string\">\"google.subject=assertion.sub,attribute.repository_id=assertion.repository_id,attribute.repository_owner_id=assertion.repository_owner_id,attribute.ref=assertion.ref,attribute.event_name=assertion.event_name\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--attribute-condition<\/span>=<span class=\"cbb-string\">\"assertion.repository_owner_id == '<\/span><span class=\"cbb-variable\">${OWNER_ID}<\/span><span class=\"cbb-string\">' &amp;&amp; assertion.repository_id == '<\/span><span class=\"cbb-variable\">${REPOSITORY_ID}<\/span><span class=\"cbb-string\">' &amp;&amp; assertion.ref == 'refs\/heads\/main' &amp;&amp; assertion.event_name == 'push'\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam service-accounts add-iam-policy-binding <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$DEPLOYER<\/span><span class=\"cbb-string\">\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--role<\/span>=roles\/iam.workloadIdentityUser \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--member<\/span>=<span class=\"cbb-string\">\"principalSet:\/\/iam.googleapis.com\/projects\/<\/span><span class=\"cbb-variable\">${PROJECT_NUMBER}<\/span><span class=\"cbb-string\">\/locations\/global\/workloadIdentityPools\/github-actions-pool\/attribute.repository_id\/<\/span><span class=\"cbb-variable\">${REPOSITORY_ID}<\/span><span class=\"cbb-string\">\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>Die Provider-Bedingung erlaubt nur Push-Ereignisse im festgelegten Repository auf <code>main<\/code>. Der Workflow-Trigger allein w\u00e4re keine Google-seitige Zugriffsbeschr\u00e4nkung. \u00c4nderungen an WIF und IAM k\u00f6nnen verz\u00f6gert wirksam werden. Die Bindung mit <code>roles\/iam.workloadIdentityUser<\/code> erlaubt die \u00dcbernahme des Deployer-Kontos; die eigentlichen Ressourcenrechte bleiben zus\u00e4tzlich erforderlich.<\/p>\n<p>Branchschutz und \u00fcberpr\u00fcfte \u00c4nderungen an Workflow-Dateien bleiben wichtig: Auch ein anderer entsprechend berechtigter Workflow auf <code>main<\/code> kann dieselben Bedingungen erf\u00fcllen. Die GitHub-Umgebung <code>production<\/code> muss mit passenden Schutzregeln eingerichtet werden. Der blo\u00dfe Umgebungsname im YAML erzeugt noch keine Freigaberegel.<\/p>\n<h2>3. Image bauen, anmelden und eine Revision vorbereiten<\/h2>\n<p>Vor dem ersten Lauf geh\u00f6ren <code>gha-creds-*.json<\/code> in <code>.gitignore<\/code> und die folgenden Ausschl\u00fcsse in <code>.dockerignore<\/code>. Weitere Geheimnisdateien und Dockerfile-spezifische Ignore-Dateien m\u00fcssen zum Projekt passen; keine sp\u00e4teren Ausnahmeregeln d\u00fcrfen die Zugangsdaten wieder einschlie\u00dfen.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">gha-creds-*.json\n<\/span><span class=\"cbb-line\">.git\n<\/span><span class=\"cbb-line\">.env\n<\/span><span class=\"cbb-line\">.env.*<\/span><\/code><\/pre><\/figure>\n<p>Die Auth-Action schreibt standardm\u00e4\u00dfig eine kurzlebige Anmeldedatei in den Arbeitsbereich. Ein nachfolgendes <code>docker build<\/code> mit breitem <code>COPY<\/code> k\u00f6nnte diese Datei ins Image \u00fcbernehmen. Deshalb laufen Tests und Build hier vor der Cloud-Anmeldung. Die Actions verweisen auf gepr\u00fcfte, genau festgelegte Versionsst\u00e4nde (Commits); Updates ben\u00f6tigen weiterhin eine bewusste Pr\u00fcfung.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">name<\/span>: Build and stage a Cloud Run revision\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">on<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">push<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">branches<\/span>: &#91;main&#93;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">permissions<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">contents<\/span>: read\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">id-token<\/span>: write\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">concurrency<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">group<\/span>: cloud-run-api-service\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">cancel-in-progress<\/span>: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">env<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">PROJECT_ID<\/span>: enterprise-ai-project\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">REGION<\/span>: us-central1\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">IMAGE<\/span>: us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">PROVIDER<\/span>: projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/providers\/github-provider\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">DEPLOYER<\/span>: ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">RUNTIME<\/span>: api-runtime@enterprise-ai-project.iam.gserviceaccount.com\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">jobs<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">stage<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">runs-on<\/span>: ubuntu-latest\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">timeout-minutes<\/span>: <span class=\"cbb-number\">30<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">environment<\/span>: production\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">defaults<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">run<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">shell<\/span>: bash\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">steps<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Checkout\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: actions\/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 <span class=\"cbb-comment\"># v7<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">persist-credentials<\/span>: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Application tests and build before cloud authentication\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          .\/ci\/test.sh\n<\/span><span class=\"cbb-line\">          docker build --tag <span class=\"cbb-string\">\"$IMAGE:$GITHUB_SHA\"<\/span> .\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Authenticate for image push\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">workload_identity_provider<\/span>: <span class=\"cbb-variable\">${{ env.PROVIDER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">service_account<\/span>: <span class=\"cbb-variable\">${{ env.DEPLOYER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">project_id<\/span>: <span class=\"cbb-variable\">${{ env.PROJECT_ID }}<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Set up gcloud\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Push image\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          gcloud auth configure-docker <span class=\"cbb-string\">\"$REGION-docker.pkg.dev\"<\/span> --quiet\n<\/span><span class=\"cbb-line\">          docker push <span class=\"cbb-string\">\"$IMAGE:$GITHUB_SHA\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Refresh authentication before deployment\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">workload_identity_provider<\/span>: <span class=\"cbb-variable\">${{ env.PROVIDER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">service_account<\/span>: <span class=\"cbb-variable\">${{ env.DEPLOYER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">project_id<\/span>: <span class=\"cbb-variable\">${{ env.PROJECT_ID }}<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Configure refreshed gcloud credentials\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Stage revision without changing traffic\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          gcloud run services describe api-service \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --region=<span class=\"cbb-string\">\"$REGION\"<\/span> &gt;\/dev\/null\n<\/span><span class=\"cbb-line\">          DIGEST=<span class=\"cbb-string\">\"$(gcloud artifacts docker images describe \"<\/span>$IMAGE:$GITHUB_SHA\" \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --format=<span class=\"cbb-string\">'value(image_summary.digest)'<\/span>)\"\n<\/span><span class=\"cbb-line\">          &#91;&#91; <span class=\"cbb-string\">\"$DIGEST\"<\/span> =~ ^sha256:&#91;0-9a-f&#93;{<span class=\"cbb-number\">64<\/span>}$ &#93;&#93;\n<\/span><span class=\"cbb-line\">          gcloud run deploy api-service \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --region=<span class=\"cbb-string\">\"$REGION\"<\/span> \\\n<\/span><span class=\"cbb-line\">            --image=<span class=\"cbb-string\">\"$IMAGE@$DIGEST\"<\/span> --service-account=<span class=\"cbb-string\">\"$RUNTIME\"<\/span> \\\n<\/span><span class=\"cbb-line\">            --no-traffic --tag=candidate \\\n<\/span><span class=\"cbb-line\">            --min-instances=0 --max-instances=50 \\\n<\/span><span class=\"cbb-line\">            --concurrency=80 --memory=512Mi --cpu=1 --cpu-throttling \\\n<\/span><span class=\"cbb-line\">            --quiet<\/span><\/code><\/pre><\/figure>\n<p>Die Pipeline pusht ein Image mit Commit-Tag und stellt anschlie\u00dfend den aufgel\u00f6sten Digest bereit. Der Digest bezeichnet den konkreten Image-Inhalt; ein Tag allein kann ge\u00e4ndert werden. Die Anmeldung wird vor dem Deployment erneuert, damit die Build- und Push-Zeit nicht unn\u00f6tig das kurze Anmeldefenster verbraucht. Sehr lange Uploads oder Deployments k\u00f6nnen dennoch eine erneute Anmeldung und einen kontrollierten Wiederholungsablauf ben\u00f6tigen.<\/p>\n<p><code>--no-traffic<\/code> bel\u00e4sst den regul\u00e4ren Verkehr bei den bisherigen Revisionen. Der Tag <code>candidate<\/code> erzeugt eine gesonderte Testadresse, die beim n\u00e4chsten Lauf auf die neue Revision zeigt. Diese Adresse verwendet weiterhin die Zugriffsregeln des Dienstes. Smoke-Tests pr\u00fcfen grundlegende Funktionen, beispielsweise eine typische API-Anfrage. Daf\u00fcr ist ein zum Aufruf berechtigtes Konto erforderlich, typischerweise mit Cloud Run Invoker und einem passenden ID-Token. Ein erfolgreicher Starttest allein beweist keine funktionierende Anwendung.<\/p>\n<p>Nach Tests und Pr\u00fcfung der exakten Revisionskennung kann der Verkehr gezielt umgeschaltet werden. Der Platzhalter im folgenden Befehl ist durch die tats\u00e4chlich gepr\u00fcfte Revision zu ersetzen. Ein R\u00fccksprung verwendet entsprechend eine zuvor gepr\u00fcfte alte Revision. \u00c4nderungen an Datenbanktabellen und bereits ausgef\u00fchrte Aktionen in anderen Systemen bleiben bestehen. Beispielsweise wird eine bereits verschickte Nachricht durch den R\u00fccksprung nicht zur\u00fcckgeholt.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># After authenticated smoke tests and approval of this exact revision:<\/span>\n<\/span><span class=\"cbb-line\">gcloud run services update-traffic api-service \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=enterprise-ai-project <span class=\"cbb-attr\">--region<\/span>=us-central1 \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--to-revisions<\/span>=REVIEWED_REVISION_NAME=<span class=\"cbb-number\">100<\/span><\/span><\/code><\/pre><\/figure>\n<h2>4. Skalierung und Kosten anhand der Anwendung einstellen<\/h2>\n<ul><li><strong>Concurrency 80:<\/strong> Das ist die Obergrenze gleichzeitiger Anfragen pro Instanz im Beispiel, kein Schwellwert, der erst vollst\u00e4ndig erreicht werden muss. Der Autoscaler ber\u00fccksichtigt unter anderem CPU- und Concurrency-Auslastung. CPU-intensive oder speicherhungrige Anfragen ben\u00f6tigen h\u00e4ufig niedrigere Werte; mehr Parallelit\u00e4t senkt den Speicherbedarf nicht automatisch.<\/li><li><strong>Null Mindestinstanzen:<\/strong> <code>--min-instances=0<\/code> gilt f\u00fcr die neue Revision. Dienstweite Mindestinstanzen m\u00fcssen ebenfalls gepr\u00fcft werden. Bei anfragebasierter Abrechnung entstehen f\u00fcr gew\u00f6hnliche unt\u00e4tige Instanzen ohne Mindestvorhaltung keine Idle-Rechenkosten; Start, Herunterfahren und Anfragen k\u00f6nnen trotzdem Kosten verursachen. Registry-Speicher, Netzwerk, Logs und GitHub Actions kommen hinzu.<\/li><li><strong>Maximal 50:<\/strong> <code>--max-instances=50<\/code> ist hier eine Revisionsgrenze. Mehrere Revisionen und kurzfristige \u00dcberschreitungen k\u00f6nnen die Gesamtzahl erh\u00f6hen. Eine zus\u00e4tzlich passende Dienstgrenze sch\u00fctzt abh\u00e4ngige Systeme besser; keine dieser Einstellungen ist eine harte Rechnungssperre.<\/li><li><strong>Hintergrundarbeit:<\/strong> <code>--cpu-throttling<\/code> aktiviert anfragebasierte CPU-Zuteilung. Instanzbasierte Abrechnung mit dauerhaft zugeteilter CPU und Mindestinstanzen erm\u00f6glicht Hintergrundarbeit, garantiert aber keinen ununterbrochenen Prozess. Instanzen k\u00f6nnen beendet werden. Wiederholbare Arbeit geh\u00f6rt beispielsweise in eine dauerhaft gespeicherte Aufgabenwarteschlange mit Cloud Tasks oder in passende Cloud Run Jobs.<\/li><\/ul>\n<p>Die Werte 80, 50 und 512 MiB sind Ausgangswerte f\u00fcr dieses Beispiel. Lasttests m\u00fcssen Latenz, Fehlerquote, Speicherverbrauch und Datenbankverbindungen messen. Cloud Run kann neue Revisionen ohne geplante Unterbrechung \u00fcbernehmen; fehlerhafter Code, inkompatible Migrationen oder ersch\u00f6pfte Kontingente k\u00f6nnen trotzdem Ausf\u00e4lle verursachen.<\/p>\n\n\n<!-- lw-flux-illu 495-a4 -->\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-495-a4.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"Drei Klapptische tragen je dieselbe H\u00f6chstzahl Teller, ein vierter lehnt zusammengeklappt an der Wand. Genauso legt Concurrency fest, wie viele Anfragen eine Instanz zugleich bearbeitet; ungenutzte kosten nichts.\"><figcaption>Drei Klapptische tragen je dieselbe H\u00f6chstzahl Teller, ein vierter lehnt zusammengeklappt an der Wand. Genauso legt Concurrency fest, wie viele Anfragen eine Instanz zugleich bearbeitet; ungenutzte kosten nichts.<\/figcaption><\/figure>\n\n\n<div class=\"lw-faq\"><h2>Fragen und Antworten<\/h2><h3>Ist schl\u00fcsselloses Deployment wartungsfrei?<\/h3><p>Nein. WIF entfernt den dauerhaft gespeicherten Google-Schl\u00fcssel aus diesem Ablauf. Kurzlebige Tokens, GitHub-Zug\u00e4nge und Laufzeitrechte m\u00fcssen trotzdem gesch\u00fctzt werden. Abh\u00e4ngigkeiten, Container-Basisimages, Action-Commits und IAM-Regeln ben\u00f6tigen Pflege.<\/p><h3>Warum fehlt &#8211;allow-unauthenticated?<\/h3><p>Der Schalter w\u00fcrde \u00f6ffentliche Aufrufrechte vergeben und ben\u00f6tigt zus\u00e4tzliche IAM-Berechtigungen. Dieses Beispiel setzt einen bereits privat konfigurierten Dienst voraus und \u00e4ndert dessen IAM-Aufrufregeln nicht. Das Weglassen des Schalters macht einen bereits \u00f6ffentlichen Dienst nicht nachtr\u00e4glich privat.<\/p><h3>Was bleibt nach dem Abschalten aller Instanzen kostenpflichtig?<\/h3><p>Unter anderem gespeicherte Images und weitere verwendete Cloud-Dienste. Eine Registry-Bereinigungsregel sollte ben\u00f6tigte Release- und Rollback-Images gezielt erhalten. Scale-to-zero bedeutet weder kostenlose Deployments noch kostenlose Gesamtinfrastruktur.<\/p><\/div>\n<div class=\"lw-quellen\">\n<h2>Quellen<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Cloud-Run-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/iam\/docs\/workload-identity-federation-with-deployment-pipelines\" target=\"_blank\" rel=\"noopener noreferrer\">WIF f\u00fcr Bereitstellungsabl\u00e4ufe<\/a><\/li><li><a href=\"https:\/\/github.com\/google-github-actions\/auth\/blob\/main\/docs\/TROUBLESHOOTING.md\" target=\"_blank\" rel=\"noopener noreferrer\">Auth-Action: Zugangsdaten in Build-Ergebnissen<\/a><\/li><li><a href=\"https:\/\/github.com\/google-github-actions\/auth\" target=\"_blank\" rel=\"noopener noreferrer\">Google-Cloud-Anmeldung f\u00fcr GitHub Actions<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/about-concurrency\" target=\"_blank\" rel=\"noopener noreferrer\">Gleichzeitige Anfragen in Cloud Run<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/configuring\/billing-settings\" target=\"_blank\" rel=\"noopener noreferrer\">Abrechnungseinstellungen von Cloud Run<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/configuring\/max-instances-limits\" target=\"_blank\" rel=\"noopener noreferrer\">Obergrenzen f\u00fcr Instanzen<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/rollouts-rollbacks-traffic-migration\" target=\"_blank\" rel=\"noopener noreferrer\">Revisionen testen, Verkehr umschalten und Versionen zur\u00fccksetzen<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/reference\/iam\/roles\" target=\"_blank\" rel=\"noopener noreferrer\">Berechtigungen f\u00fcr Cloud-Run-Bereitstellungen<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/container-contract\" target=\"_blank\" rel=\"noopener noreferrer\">Laufzeitanforderungen an Cloud-Run-Container<\/a><\/li><li><a href=\"https:\/\/github.blog\/changelog\/2025-08-15-github-actions-policy-now-supports-blocking-and-sha-pinning-actions\/\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Actions auf feste Commits begrenzen<\/a><\/li><\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Eine technische Schritt-f\u00fcr-Schritt-Anleitung zur Bereitstellung und Skalierung serverloser Microservices auf Google Cloud Run mit GitHub Actions und WIF.<\/p>\n","protected":false},"author":1,"featured_media":23098,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92638],"tags":[92055,92214,92217,92094,92235],"class_list":["post-496","post","type-post","status-publish","format-standard","hentry","category-tutorials-de-cloud-ai-de","tag-automation-de","tag-devops-de","tag-docker-de","tag-google-cloud-de","tag-tutorial-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.\" \/>\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\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-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: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-25T11:40:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:44:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.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\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions\",\"datePublished\":\"2026-09-25T11:40:00+00:00\",\"dateModified\":\"2026-10-26T11:44:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/\"},\"wordCount\":1172,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-496-review-20261024-dark.png\",\"keywords\":[\"Automation\",\"DevOps\",\"Docker\",\"Google Cloud\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/\",\"name\":\"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-496-review-20261024-dark.png\",\"datePublished\":\"2026-09-25T11:40:00+00:00\",\"dateModified\":\"2026-10-26T11:44:32+00:00\",\"description\":\"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-496-review-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-496-review-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/cloud-ai-de\\\/tutorials-de-cloud-ai-de\\\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Serverless Microservices: Skalierung in Google Cloud Run mit 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: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik","description":"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.","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\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/","og_locale":"en_US","og_type":"article","og_title":"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik","og_description":"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-25T11:40:00+00:00","article_modified_time":"2026-10-26T11:44:32+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.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\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions","datePublished":"2026-09-25T11:40:00+00:00","dateModified":"2026-10-26T11:44:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/"},"wordCount":1172,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.png","keywords":["Automation","DevOps","Docker","Google Cloud","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/","name":"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.png","datePublished":"2026-09-25T11:40:00+00:00","dateModified":"2026-10-26T11:44:32+00:00","description":"Cloud Run \u00fcber GitHub Actions bereitstellen: Workload Identity Federation, Deploy-Rechte, Skalierung, Concurrency und Kosten pr\u00fcfen.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-496-review-20261024-dark.png","width":1200,"height":630,"caption":"Serverless Microservices: Skalierung in Google Cloud Run mit GitHub Actions"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/cloud-ai-de\/tutorials-de-cloud-ai-de\/serverless-microservices-skalierung-in-google-cloud-run-mit-github-actions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Serverless Microservices: Skalierung in Google Cloud Run mit 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\/496","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=496"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/496\/revisions"}],"predecessor-version":[{"id":27015,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/496\/revisions\/27015"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23098"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}