Wprowadzenie do Cloud Run z Pythonem (Streamlit)

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 aplikacji internetowej „Hello World” Streamlit i wdrożenie jej w Cloud Run.

Czego się nauczysz

  • Jak utworzyć aplikację „Hello World” w Streamlit.
  • Testowanie aplikacji przez uruchomienie aplikacji Streamlit przed wdrożeniem.
  • Pakiety kompilacji Cloud Buildpacks i to, jak obecność streamlitrequirements.txt pozwala uniknąć konieczności używania pliku Dockerfile.
  • Jak wdrożyć aplikację Streamlit 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 lub Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu to wyświetlana nazwa dla 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 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ć rozliczenia 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

Google Cloud można obsługiwać zdalnie z laptopa, 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.

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

Udostępnienie 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 stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w tym laboratorium możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że jesteś uwierzytelniony, a identyfikator projektu jest ustawiony na identyfikator Twojego projektu.

  1. Aby potwierdzić, że masz autoryzację, 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 ustawić go 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 aplikację Streamlit w języku Python „Hello World”, która odpowiada na żądania HTTP.

Katalog roboczy

Użyj Cloud Shell, aby utworzyć katalog roboczy o nazwie helloworld-streamlit i przełączyć się na niego:

mkdir ~/helloworld-streamlit && cd ~/helloworld-streamlit

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

import streamlit as st

st.title("Hello World! 👋🌎")
st.markdown(
    """
    This is a demo Streamlit app.

    Enter your name in the text box below and press a button to see some fun features in Streamlit.
    """
)

name = st.text_input("Enter your name:")

# Use columns to create buttons side by side
col1, col2 = st.columns(2)

with col1:
    if st.button("Send balloons! 🎈"):
        st.balloons()
        st.write(f"Time to celebrate {name}! 🥳")
        st.write("You deployed a Streamlit app! 👏")

with col2:
    if st.button("Send snow! ❄️"):
        st.snow()
        st.write(f"Let it snow {name}! 🌨️")
        st.write("You deployed a Streamlit app! 👏")

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

requirements.txt

Ponownie otwórz terminal i 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/streamlit
streamlit==1.47.0

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

5. Testowanie aplikacji

Aby przetestować aplikację, użyj uv (bardzo szybkiego menedżera pakietów i projektów Pythona), który jest wstępnie zainstalowany w Cloud Shell.

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

uv venv

Zainstaluj zależności:

uv pip install -r requirements.txt

Uruchom aplikację za pomocą streamlit run (wyłączając --server.enableCORS na potrzeby testowania, ponieważ zakłóca działanie Cloud Shell):

uv run streamlit run main.py --server.port=8080 --server.enableCORS=false

Logi będą wskazywać, że aplikacja Streamlit jest uruchomiona:

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8080
  Network URL: http://10.1.0.1:8080
  External URL: http://34.37.7.94:8080

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

6c9ff9e5c692c58e.gif

Powinno się otworzyć okno przeglądarki z tytułem Hello World! 👋🌎.

helloworld-streamlit-app.png

Spróbuj wpisać swoje imię i nazwisko oraz przetestować 2 przyciski na ekranie.

Gdy skończysz, wróć do głównej sesji Cloud Shell i zatrzymaj aplikację Streamlit, naciskając CTRL+C.

Aplikacja działa zgodnie z oczekiwaniami: czas ją wdrożyć…

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-west1

Sprawdź, czy nadal jesteś w katalogu roboczym:

ls

Powinny się na niej pojawić te pliki:

main.py  requirements.txt

Przed wdrożeniem utwórz plik .gcloudignore zawierający .venv/. Zapobiega to uwzględnianiu w procesie wdrażania Cloud Run środowiska wirtualnego utworzonego na podstawie uv podczas testowania lokalnego.

Utwórz .gcloudignore za pomocą tego polecenia:

echo ".venv/" > .gcloudignore

Wdróż aplikację w Cloud Run:

gcloud run deploy helloworld-streamlit \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • 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ę monit o utworzenie repozytorium Artifact Registry. Aby potwierdzić, 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-streamlit \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

Powinien pojawić się ekran podobny do tego:

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

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

helloworld-streamlit.gif

Gratulacje! Właśnie wdrożyliśmy w Cloud Run aplikację. Cloud Run automatycznie skaluje obraz kontenera w poziomie, aby obsługiwać otrzymane żądania, a następnie skaluje go w dół, gdy zapotrzebowanie maleje. W przypadku tej usługi Cloud Run 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 Cloud. Usunięcie projektu Cloud 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-streamlit \
  --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

Utworzyliśmy aplikację internetową Streamlit „Hello World” i wdrożyliśmy ją w Cloud Run.

Omówione zagadnienia

  • Jak utworzyć aplikację „Hello World” w Streamlit.
  • Testowanie aplikacji przez uruchomienie aplikacji Streamlit przed wdrożeniem.
  • Pakiety kompilacji Cloud Buildpacks i to, jak obecność streamlitrequirements.txt pozwala uniknąć konieczności używania pliku Dockerfile.
  • wdrożyć aplikację Streamlit w Cloud Run;

Więcej informacji