Kurzanleitung: C++-Webanwendung in Cloud Run erstellen und bereitstellen

Hier erfahren Sie, wie Sie mit einem einzigen Befehl eine „Hello World“-Webanwendung aus einem Codebeispiel in Google Cloudmit Cloud Run erstellen und bereitstellen.

Wenn Sie die Schritte in dieser Kurzanleitung ausführen, erstellt Cloud Run automatisch ein Dockerfile für Sie, wenn Sie aus dem Quellcode bereitstellen.

Hinweise

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.

  5. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. So legen Sie das Standardprojekt für Ihren Cloud Run-Dienst fest:
     gcloud config set project PROJECT_ID
    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud Projekt-ID.
  13. Wenn Sie einer Domaineinschränkung zur Organisation nicht eingeschränkter Aufrufe für Ihr Projekt unterliegen, müssen Sie auf Ihren bereitgestellten Dienst zugreifen, wie unter Private Dienste testen beschrieben.

  14. Aktivieren Sie die Cloud Run Admin API und die Cloud Build API:

    gcloud services enable run.googleapis.com \
        cloudbuild.googleapis.com

    Nachdem die Cloud Run Admin API aktiviert wurde, wird das Compute Engine-Standarddienstkonto automatisch erstellt.

  15. Weisen Sie dem Cloud Build-Dienstkonto die folgende IAM-Rolle zu.

    Klicken, um die erforderlichen Rollen für das Cloud Build-Dienstkonto aufzurufen

    Cloud Build verwendet automatisch das Compute Engine-Standarddienstkonto als Standard-Cloud Build-Dienstkonto zum Erstellen Ihres Quellcodes und Ihrer Cloud Run-Ressource, sofern Sie dieses Verhalten nicht überschreiben. Damit Cloud Build Ihre Quellen erstellen kann, bitten Sie Ihren Administrator, dem Compute Engine-Standarddienstkonto in Ihrem Projekt die Rolle Cloud Run Builder (roles/run.builder) zuzuweisen:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/run.builder
      

    Ersetzen Sie PROJECT_NUMBER durch die Google CloudProjektnummer und PROJECT_ID durch die Google CloudProjekt-ID. Eine detaillierte Anleitung zum Ermitteln der Projekt-ID und der Projektnummer finden Sie unter Projekte erstellen und verwalten.

    Es dauert einige Minuten, bis die Zuweisung der Rolle „Cloud Run-Builder“ für das Compute Engine-Standarddienstkonto übertragen wurde.

  16. Cloud Run-Preise ansehen oder Kosten mit dem Preisrechner schätzen
  17. Beispielanwendung schreiben

    So schreiben Sie eine Anwendung in C++:

    1. Erstellen Sie ein neues Verzeichnis mit dem Namen helloworld-cpp und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

      mkdir helloworld-cpp
      cd helloworld-cpp
      
    2. Erstellen Sie eine neue Datei mit dem Namen CMakeLists.txt und fügen Sie dort den folgenden Code ein:

      cmake_minimum_required(VERSION 3.20)
      
      # Define the project name and where to report bugs.
      set(PACKAGE_BUGREPORT
          "https://github.com/GoogleCloudPlatform/cpp-samples/issues")
      project(cpp-samples-cloud-run-hello-world CXX)
      
      find_package(functions_framework_cpp REQUIRED)
      find_package(Threads)
      
      add_executable(cloud_run_hello cloud_run_hello.cc)
      target_compile_features(cloud_run_hello PRIVATE cxx_std_17)
      target_link_libraries(cloud_run_hello functions-framework-cpp::framework)
      
      include(GNUInstallDirs)
      install(TARGETS cloud_run_hello RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    3. Erstellen Sie eine neue Datei mit dem Namen vcpkg.json und fügen Sie dort den folgenden Code ein:

      {
        "name": "cpp-samples-cloud-run-hello-world",
        "version-string": "unversioned",
        "homepage": "https://github.com/GoogleCloudPlatform/cpp-samples/",
        "description": [
          "Shows how to deploy a C++ application to Cloud Run."
        ],
        "dependencies": [
          "functions-framework-cpp"
        ]
      }
      
    4. Erstellen Sie eine neue Datei mit dem Namen cloud_run_hello.cc und fügen Sie dort den folgenden Code ein:

      #include <google/cloud/functions/framework.h>
      #include <cstdlib>
      
      namespace gcf = ::google::cloud::functions;
      
      auto hello_world_http() {
        return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) {
          std::string greeting = "Hello ";
          auto const* target = std::getenv("TARGET");
          greeting += target == nullptr ? "World" : target;
          greeting += "\n";
      
          return gcf::HttpResponse{}
              .set_header("Content-Type", "text/plain")
              .set_payload(greeting);
        });
      }
      
      int main(int argc, char* argv[]) {
        return gcf::Run(argc, argv, hello_world_http());
      }
      

      Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht.

    5. Erstellen Sie eine neue Datei mit dem Namen Dockerfile im selben Verzeichnis wie die Quelldateien. Das C++-Dockerfile beginnt mit der Überwachung der Anwendung an dem Port, der mit der Umgebungsvariable PORT definiert wurde:

      # We chose Alpine to build the image because it has good support for creating
      # statically-linked, small programs.
      FROM alpine:3.21 AS build
      
      # Install the typical development tools for C++, and
      # the base OS headers and libraries.
      RUN apk update && \
          apk add \
              build-base \
              cmake \
              curl \
              git \
              gcc \
              g++ \
              libc-dev \
              linux-headers \
              ninja \
              pkgconfig \
              tar \
              unzip \
              zip
      
      # Use `vcpkg`, a package manager for C++, to install
      WORKDIR /usr/local/vcpkg
      ENV VCPKG_FORCE_SYSTEM_BINARIES=1
      RUN curl -sSL "https://github.com/Microsoft/vcpkg/archive/2024.04.26.tar.gz" | \
          tar --strip-components=1 -zxf - \
          && ./bootstrap-vcpkg.sh -disableMetrics
      
      # Copy the source code to /v/source and compile it.
      COPY . /v/source
      WORKDIR /v/source
      
      # Run the CMake configuration step, setting the options to create
      # a statically linked C++ program
      RUN cmake -S/v/source -B/v/binary -GNinja \
          -DCMAKE_TOOLCHAIN_FILE=/usr/local/vcpkg/scripts/buildsystems/vcpkg.cmake \
          -DCMAKE_BUILD_TYPE=Release
      
      # Compile the binary and strip it to reduce its size.
      RUN cmake --build /v/binary
      RUN strip /v/binary/cloud_run_hello
      
      # Create the final deployment image, using `scratch` (the empty Docker image)
      # as the starting point. Effectively we create an image that only contains
      # our program.
      FROM scratch AS cloud-run-hello
      WORKDIR /r
      
      # Copy the program from the previously created stage and the shared libraries it
      # depends on.
      COPY --from=build /v/binary/cloud_run_hello /r
      COPY --from=build /lib/ld-musl-x86_64.so.1 /lib/ld-musl-x86_64.so.1
      COPY --from=build /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.6
      COPY --from=build /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so.1
      
      # Make the program the entry point.
      ENTRYPOINT [ "/r/cloud_run_hello" ]

    Die Anwendung ist fertig und kann bereitgestellt werden.

    Für Cloud Run aus Quelle bereitstellen

    Wichtig: In dieser Kurzanleitung wird davon ausgegangen, dass Sie Inhaber- oder Bearbeiterrollen in dem Projekt haben, das Sie für die Kurzanleitung verwenden. Andernfalls finden Sie die erforderlichen Berechtigungen für die Bereitstellung einer Cloud Run-Ressource aus der Quelle unter Rolle „Cloud Run-Quellenentwickler“.

    Verwenden Sie Cloud Build, um ein Image aus dem Quellcode zu erstellen und es dann bereitzustellen.

    1. Verwenden Sie im Quellverzeichnis Cloud Build, um ein Docker-Image für Ihren Dienst zu erstellen

      gcloud builds submit --machine-type=e2_highcpu_32 --tag gcr.io/PROJECT_ID/cloud-run-hello-world
    2. Stellen Sie das Image mit dem folgenden Befehl bereit:

      gcloud run deploy --image=gcr.io/PROJECT_ID/cloud-run-hello-world

      Wenn Sie aufgefordert werden, die API zu aktivieren, antworten Sie mit y, um dies zu tun.

      1. Wenn Sie zur Eingabe des Dienstnamens aufgefordert werden, drücken Sie die Eingabetaste, um den Standardnamen zu akzeptieren, z. B. helloworld.

      2. Wenn Sie aufgefordert werden, zusätzliche APIs für das Projekt zu aktivieren, z. B. die Artifact Registry API, antworten Sie durch Drücken von y.

      3. Wenn Sie zur Eingabe der Region aufgefordert werden, wählen Sie die Region Ihrer Wahl aus, zum Beispiel europe-west1.

      4. Wenn Sie aufgefordert werden, ein Repository in der angegebenen Region zu erstellen, antworten Sie durch Drücken von y.

      5. Wenn Sie aufgefordert werden, öffentlichen Zugriff zuzulassen, antworten Sie mit y. Diese Eingabeaufforderung wird möglicherweise nicht angezeigt, wenn eine Organisationsrichtlinie zur Domaineinschränkung dies verhindert. Weitere Informationen finden Sie im Abschnitt Vorbereitung.

      Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Bei Erfolg wird in der Befehlszeile die Dienst-URL angezeigt.

    3. Rufen Sie den bereitgestellten Service auf. Dazu öffnen Sie in einem Webbrowser die Dienst-URL.

    Cloud Run-Standorte

    Cloud Run ist regional. Die Infrastruktur, in der die Cloud Run-Dienste ausgeführt werden, befindet sich demnach in einer bestimmten Region. Aufgrund der Verwaltung durch Google sind die Anwendungen in allen Zonen innerhalb dieser Region redundant verfügbar.

    Bei der Auswahl der Region, in der Ihre Cloud Run-Dienste ausgeführt werden, ist vorrangig, dass die Anforderungen hinsichtlich Latenz, Verfügbarkeit oder Langlebigkeit erfüllt werden. Sie können im Allgemeinen die Region auswählen, die Ihren Nutzern am nächsten ist. Sie sollten dabei jedoch auch den Standort der anderen Google Cloud-Produkte berücksichtigen, die der Cloud Run-Dienst verwendet. Die gemeinsame Nutzung von Google Cloud Produkten an mehreren Standorten kann sich auf die Latenz und die Kosten des Dienstes auswirken.

    Cloud Run ist in diesen Regionen verfügbar:

    Unterliegt Preisstufe 1

    Unterliegt Preisstufe 2

    • africa-south1 (Johannesburg)
    • asia-east2 (Hongkong)
    • asia-northeast3 (Seoul, Südkorea)
    • asia-southeast1 (Singapur)
    • asia-southeast2 (Jakarta)
    • asia-south2 (Delhi, Indien)
    • australia-southeast1 (Sydney)
    • australia-southeast2 (Melbourne)
    • europe-central2 (Warschau, Polen)
    • europe-west10 (Berlin)Blattsymbol Niedriger CO2-Ausstoß
    • europe-west12 (Turin)
    • europe-west2 (London, Vereinigtes Königreich) Blattsymbol Niedriger CO2-Ausstoß
    • europe-west3 (Frankfurt, Deutschland)
    • europe-west6 (Zürich, Schweiz) Blattsymbol Niedriger CO2-Ausstoß
    • me-central1 (Doha)
    • me-central2 (Dammam)
    • northamerica-northeast1 (Montreal) Blattsymbol Niedriger CO2-Ausstoß
    • northamerica-northeast2 (Toronto) Blattsymbol Niedriger CO2-Ausstoß
    • southamerica-east1 (Sao Paulo, Brasilien) Blattsymbol Niedriger CO2-Ausstoß
    • southamerica-west1 (Santiago, Chile) Blattsymbol Niedriger CO2-Ausstoß
    • us-west2 (Los Angeles)
    • us-west3 (Salt Lake City)
    • us-west4 (Las Vegas)

    Wenn Sie bereits einen Cloud Run-Dienst erstellt haben, können Sie dessen Region im Cloud Run-Dashboard der Google Cloud Console aufrufen.

    Bereinigen

    Löschen Sie alle Ressourcen, die Sie mit dieser Kurzanleitung bereitgestellt haben, um zusätzliche Gebühren für Ihr Google Cloud -Konto zu vermeiden.

    Repository löschen

    Für Cloud Run fallen keine Kosten an, wenn Ihr bereitgestellter Dienst nicht verwendet wird. Möglicherweise fallen jedoch Kosten für das Speichern des Container-Images in Artifact Registry an. Wenn Sie Artifact Registry-Repositories löschen möchten, folgen Sie der Anleitung unter Repositories löschen in der Artifact Registry-Dokumentation.

    Service löschen

    Für Cloud Run-Dienste fallen erst Kosten an, wenn sie Anfragen empfangen. So löschen Sie Ihren Cloud Run-Dienst:

    Konsole

    So löschen Sie einen Dienst:

    1. Rufen Sie in der Google Cloud Console Cloud Run auf:

      Zu Cloud Run

    2. Klicken Sie in der Übersicht das Kästchen des zu löschenden Dienstes an.

    3. Klicken Sie auf Löschen. Dadurch werden alle Überarbeitungen des Dienstes gelöscht.

    gcloud

    Führen Sie den folgenden Befehl aus, um einen Dienst zu löschen:

    gcloud run services delete SERVICE --region REGION

    Ersetzen Sie Folgendes:

    • SERVICE: Name Ihres Dienstes.
    • REGION: Google Cloud Region des Dienstes.

    Testprojekt löschen

    Wenn Sie Ihr Google Cloud -Projekt löschen, wird die Abrechnung für alle Ressourcen in diesem Projekt beendet. So geben Sie alle Google Cloud Ressourcen in Ihrem Projekt frei:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Nächste Schritte

    Weitere Informationen dazu, wie Sie einen Container aus Quellcode erstellen und diesen mithilfe eines Push-Vorgangs in ein Repository übertragen, finden Sie unter: