Wprowadzenie do Cloud Run z użyciem Pythona

1. Wprowadzenie

96d07289bb51daa7.png

Cloud Run to zarządzana platforma obliczeniowa, która umożliwia uruchamianie bezstanowych kontenerów wywoływanych przez żądania HTTP. Jest ona oparta na projekcie open source Knative, co umożliwia przenoszenie obciążeń między platformami. Cloud Run jest rozwiązaniem bezserwerowym, które nie wymaga zarządzania infrastrukturą, dzięki czemu możesz skupić się na tym, co najważniejsze, czyli tworzeniu świetnych aplikacji.

Celem tego samouczka jest utworzenie prostej aplikacji internetowej i wdrożenie jej w Cloud Run.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym samouczku będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Włączanie interfejsów API

W Cloud Shell włącz interfejsy Artifact Registry API, Cloud Build API i Cloud Run API:

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

Wyświetli się komunikat o powodzeniu podobny do tego:

Operation "operations/..." finished successfully.

Możesz teraz zacząć pracę i napisać aplikację…

4. Tworzenie aplikacji

W tym kroku utworzysz prostą aplikację w Pythonie opartą na Flask, która będzie odpowiadać na żądania HTTP.

Katalog roboczy

Za pomocą Cloud Shell utwórz katalog roboczy o nazwie helloworld-python i przejdź do niego:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

Utwórz plik o nazwie main.py:

touch main.py

Edytuj plik za pomocą preferowanego edytora wiersza poleceń (nano, vim lub emacs) albo kliknij przycisk edytora Cloud Shell:

10af7b1a6240e9f4.gif

Aby bezpośrednio edytować plik za pomocą edytora Cloud Shell, użyj tego polecenia:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

Ten kod tworzy podstawową usługę internetową, która odpowiada na żądania HTTP GET przyjazną wiadomością.

requirements.txt

Dodaj plik o nazwie requirements.txt, aby zdefiniować zależności:

touch requirements.txt

Aby bezpośrednio edytować plik za pomocą edytora Cloud Shell, użyj tego polecenia:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

Na koniec dodaj plik o nazwie Procfile, aby określić sposób udostępniania aplikacji:

touch Procfile

Aby bezpośrednio edytować plik za pomocą edytora Cloud Shell, użyj tego polecenia:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Sprawdź, czy wszystkie pliki znajdują się w katalogu roboczym:

ls

Powinny się na niej znaleźć te pliki:

main.py  Procfile  requirements.txt

Aplikacja jest gotowa do wdrożenia, ale najpierw ją przetestujmy...

5. Testowanie aplikacji

Aby przetestować aplikację, utwórz środowisko wirtualne:

virtualenv venv

Aktywuj środowisko wirtualne:

source venv/bin/activate

Zainstaluj zależności:

pip install -r requirements.txt

Powinna pojawić się wiadomość z potwierdzeniem podobna do tej:

...
Successfully installed Flask ... gunicorn ...

Uruchom aplikację:

python main.py

Z logów wynika, że jesteś w trybie deweloperskim:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

W oknie Cloud Shell kliknij ikonę Web Preview i wybierz Preview on port 8080:

6c9ff9e5c692c58e.gif

Powinno się otworzyć okno przeglądarki z komunikatem Hello World!.

Możesz też otworzyć kolejną sesję Cloud Shell (nową kartę terminala), klikając ikonę + i wysyłając żądanie internetowe do aplikacji działającej lokalnie:

curl localhost:8080

Powinna pojawić się taka odpowiedź:

Hello World!

Gdy skończysz, wróć do głównej sesji Cloud Shell i zatrzymaj polecenie python main.py za pomocą klawisza CTRL+C.

Zamknij środowisko wirtualne:

deactivate

Na koniec usuń katalog środowiska wirtualnego:

rm -r venv/

Aplikacja działa zgodnie z oczekiwaniami: wdróżmy ją…

6. Wdrożenie w Cloud Run

Cloud Run działa regionalnie, co oznacza, że infrastruktura, która uruchamia usługi Cloud Run, znajduje się w określonym regionie i jest zarządzana przez Google w taki sposób, aby była redundantnie dostępna we wszystkich strefach w tym regionie. Określ region, w którym chcesz wdrożyć usługę, np.:

REGION="europe-west9"

Upewnij się, że nadal jesteś w katalogu roboczym:

ls

Powinny się na niej znaleźć te pliki:

main.py  Procfile  requirements.txt

Wdróż aplikację w Cloud Run:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • Domyślny region możesz zdefiniować za pomocą tego polecenia: gcloud config set run/region $REGION
  • Możesz też ustawić Cloud Run jako domyślną usługę zarządzaną za pomocą tego polecenia: gcloud config set run/platform managed
  • Opcja --allow-unauthenticated sprawia, że usługa jest dostępna publicznie. Aby uniknąć nieautoryzowanych żądań, użyj zasady --no-allow-unauthenticated.

Gdy zrobisz to po raz pierwszy, pojawi się prośba o utworzenie repozytorium Artifact Registry. Aby sprawdzić poprawność, kliknij Enter:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Spowoduje to przesłanie kodu źródłowego do repozytorium Artifact Registry i skompilowanie obrazu kontenera:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Następnie poczekaj chwilę na zakończenie wdrażania. Kiedy operacja zostanie wykonana, w wierszu poleceń wyświetli się URL usługi:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Adres URL usługi możesz uzyskać za pomocą tego polecenia:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

Powinien pojawić się ekran podobny do tego:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

Możesz teraz korzystać z aplikacji, otwierając URL usługi w przeglądarce:

c836b93e5601e2cf.gif

Możesz też wywołać aplikację z Cloud Shell:

curl $SERVICE_URL?who=me

Powinno pojawić się oczekiwane powitanie:

Hello me!

Gratulacje! Właśnie udało Ci się wdrożyć aplikację w Cloud Run. Cloud Run automatycznie skaluje obraz kontenera w poziomie, aby obsługiwać otrzymane żądania, a następnie skaluje go w dół, gdy zapotrzebowanie maleje. Płacisz tylko za procesor, pamięć i sieć wykorzystywane w trakcie obsługiwania żądań.

7. Czyszczenie danych

Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana należność za przechowywanie obrazu kontenera w Artifact Registry. Aby uniknąć obciążenia konta opłatami, możesz usunąć repozytorium lub projekt w chmurze. Usunięcie projektu w chmurze spowoduje zaprzestanie naliczania opłat za wszelkie zasoby wykorzystywane w ramach tego projektu.

Aby usunąć repozytorium obrazów kontenerów:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Aby usunąć usługę Cloud Run:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

Aby usunąć projekt Google Cloud:

  1. Pobierz bieżący identyfikator projektu:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Sprawdź, czy to jest projekt, który chcesz usunąć:
echo $PROJECT_ID
  1. Usuń projekt:
gcloud projects delete $PROJECT_ID

8. Gratulacje!

96d07289bb51daa7.png

Utworzono prostą aplikację internetową i wdrożono ją w Cloud Run.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.