Guida rapida: crea ed esegui il deployment di un'app web C++ su Cloud Run

Scopri come utilizzare un singolo comando per creare ed eseguire il deployment di un'applicazione web "Hello World" da un esempio di codice a Google Cloud utilizzando Cloud Run.

Se segui i passaggi descritti in questa guida rapida, Cloud Run crea automaticamente un Dockerfile quando esegui il deployment dal codice sorgente.

Prima di iniziare

  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. Install the Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Se utilizzi un progetto esistente per questa guida, verifica di disporre delle autorizzazioni necessarie per completare la guida. Se hai creato un nuovo progetto, disponi già delle autorizzazioni necessarie.

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

  8. Install the Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Se utilizzi un progetto esistente per questa guida, verifica di disporre delle autorizzazioni necessarie per completare la guida. Se hai creato un nuovo progetto, disponi già delle autorizzazioni necessarie.

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

  14. Per impostare il progetto predefinito per il tuo servizio Cloud Run:
     gcloud config set project PROJECT_ID
    Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud .
  15. Se il tuo progetto è soggetto a un criterio dell'organizzazione con restrizioni di dominio che limitano le chiamate non autenticate, devi accedere al servizio di cui è stato eseguito il deployment come descritto in Test dei servizi privati.

  16. Consulta i prezzi di Cloud Run o stima i costi con il Calcolatore prezzi.
  17. Ruoli obbligatori

    Per ottenere le autorizzazioni necessarie per completare questa guida rapida, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

    Concedi al account di servizio Cloud Build l'accesso al tuo progetto

    Cloud Build utilizza automaticamente l'account di servizio predefinito di Compute Engine come account di servizio Cloud Build predefinito per creare il codice sorgente e la risorsa Cloud Run, a meno che tu non esegua l'override di questo comportamento.

    Affinché Cloud Build possa creare le tue origini, concedi all'account di servizio Cloud Build il ruolo Cloud Run Builder (roles/run.builder) nel tuo progetto:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
        --role=roles/run.builder

    Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloude SERVICE_ACCOUNT_EMAIL_ADDRESS con l'indirizzo email del account di servizio Cloud Build. Se utilizzi il account di servizio predefinito di Compute Engine come account di servizio Cloud Build, utilizza il seguente formato per l'indirizzo email del account di servizio:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Sostituisci PROJECT_NUMBER con il numero del tuo progetto Google Cloud.

    Per istruzioni dettagliate su come trovare l'ID progetto e il numero di progetto, vedi Creazione e gestione dei progetti.

    La concessione del ruolo di builder Cloud Run richiede un paio di minuti per la propagazione.

    scrivi l'applicazione di esempio

    Per scrivere un'applicazione in C++:

    1. Crea una nuova directory denominata helloworld-cpp e accedi alla directory:

      mkdir helloworld-cpp
      cd helloworld-cpp
      
    2. Crea un nuovo file denominato CMakeLists.txt e incolla il seguente codice:

      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. Crea un nuovo file denominato vcpkg.json e incolla il seguente codice:

      {
        "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. Crea un nuovo file denominato cloud_run_hello.cc e incolla il seguente codice:

      #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());
      }
      

      Questo codice crea un server web di base in ascolto sulla porta definita dalla variabile di ambiente PORT.

    5. Crea un nuovo file denominato Dockerfile nella stessa directory dei file di origine. Il Dockerfile C++ avvia l'applicazione in ascolto sulla porta definita dalla variabile di ambiente PORT:

      # 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" ]

    La tua app è terminata e pronta per il deployment.

    Esegui il deployment in Cloud Run dall'origine

    Utilizza Cloud Build per creare un'immagine dal codice sorgente e poi eseguirne il deployment.

    1. Nella directory di origine, utilizza Cloud Build per creare un'immagine Docker per il tuo servizio.

      gcloud builds submit --machine-type=e2_highcpu_32 --tag gcr.io/PROJECT_ID/cloud-run-hello-world
    2. Esegui il deployment dell'immagine utilizzando il seguente comando:

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

      Se ti viene chiesto di abilitare l'API, rispondi y per abilitarla.

      1. Quando ti viene richiesto il nome del servizio, premi Invio per accettare il nome predefinito, ad esempio helloworld.

      2. Se ti viene chiesto di abilitare API aggiuntive nel progetto, ad esempio l'API Artifact Registry, rispondi premendo y.

      3. Quando ti viene chiesto di selezionare la regione, scegli la regione che preferisci, ad esempio europe-west1.

      4. Se ti viene chiesto di creare un repository nella regione specificata, rispondi premendo y.

      5. Se ti viene chiesto di consentire l'accesso pubblico: rispondi y. Potresti non visualizzare questo prompt se è presente un criterio dell'organizzazione con limitazioni del dominio che lo impedisce. Per maggiori dettagli, consulta la sezione Prima di iniziare.

      Quindi, attendi qualche istante fino al completamento del deployment. Se l'operazione riesce, la riga di comando visualizza l'URL del servizio.

    3. Visita il servizio di cui hai eseguito il deployment aprendo l'URL del servizio in un browser web.

    Località Cloud Run

    Cloud Run è regionale, il che significa che l'infrastruttura che esegue i tuoi servizi Cloud Run si trova in una regione specifica ed è gestita da Google per essere disponibile in modo ridondante in tutte le zone all'interno di quella regione.

    Il rispetto dei requisiti di latenza, disponibilità o durabilità sono fattori primari per la selezione della regione in cui vengono eseguiti i servizi Cloud Run. In genere puoi selezionare la regione più vicina ai tuoi utenti, ma devi considerare la posizione degli altri Google Cloud prodotti utilizzati dal tuo servizio Cloud Run. L'utilizzo combinato dei prodotti Google Cloud in più località può influire sulla latenza e sui costi del servizio.

    Cloud Run è disponibile nelle seguenti regioni:

    Soggetto ai prezzi di Livello 1

    Soggetto ai prezzi di Livello 2

    • africa-south1 (Johannesburg)
    • asia-east2 (Hong Kong)
    • asia-northeast3 (Seul, Corea del Sud)
    • asia-southeast1 (Singapore)
    • asia-southeast2 (Giacarta)
    • asia-south2 (Delhi, India)
    • australia-southeast1 (Sydney)
    • australia-southeast2 (Melbourne)
    • europe-central2 (Varsavia, Polonia)
    • europe-west10 (Berlino)
    • europe-west12 (Torino)
    • europe-west2 (Londra, Regno Unito) icona foglia Bassi livelli di CO2
    • europe-west3 (Francoforte, Germania)
    • europe-west6 (Zurigo, Svizzera) icona foglia A basse emissioni di CO2
    • me-central1 (Doha)
    • me-central2 (Dammam)
    • northamerica-northeast1 (Montreal) icona foglia Bassi livelli di CO2
    • northamerica-northeast2 (Toronto) icona foglia Bassi livelli di CO2
    • southamerica-east1 (San Paolo, Brasile) icona foglia Bassi livelli di CO2
    • southamerica-west1 (Santiago, Cile) icona foglia Bassi livelli di CO2
    • us-west2 (Los Angeles)
    • us-west3 (Salt Lake City)
    • us-west4 (Las Vegas)

    Se hai già creato un servizio Cloud Run, puoi visualizzare la regione nella dashboard di Cloud Run nella consoleGoogle Cloud .

    Esegui la pulizia

    Per evitare costi aggiuntivi al tuo account Google Cloud , elimina tutte le risorse che hai eseguito il deployment con questa guida rapida.

    Eliminare il repository

    Cloud Run non ti addebita costi quando il servizio di cui hai eseguito il deployment non è in uso. Tuttavia, potresti comunque pagare l'archiviazione dell'immagine container in Artifact Registry. Per eliminare i repository Artifact Registry, segui i passaggi descritti in Eliminare i repository nella documentazione di Artifact Registry.

    Eliminare il servizio

    I servizi Cloud Run non comportano costi finché non ricevono richieste. Per eliminare il servizio Cloud Run, segui uno di questi passaggi:

    Console

    Per eliminare un servizio:

    1. Nella console Google Cloud , vai alla pagina Servizi di Cloud Run:

      Vai a Cloud Run

    2. Individua il servizio che vuoi eliminare nell'elenco dei servizi e fai clic sulla relativa casella di controllo per selezionarlo.

    3. Fai clic su Elimina. Vengono eliminate tutte le revisioni del servizio.

    gcloud

    Per eliminare un servizio, esegui questo comando:

    gcloud run services delete SERVICE --region REGION

    Sostituisci quanto segue:

    • SERVICE: il nome del tuo servizio.
    • REGION: Google Cloud regione del servizio.

    Eliminare il progetto di test

    L'eliminazione del progetto Google Cloud interrompe la fatturazione per tutte le risorse al suo interno. Per rilasciare tutte le Google Cloud risorse nel tuo progetto:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Passaggi successivi

    Per saperne di più sulla creazione di un container dal codice sorgente e sul push in un repository, consulta: