Informacje o tym ćwiczeniu (w Codelabs)
1. Wprowadzenie
Omówienie
Aby zabezpieczyć ruch sieciowy dla swoich usług i aplikacji, wiele organizacji korzysta z sieci prywatnego środowiska wirtualnego w chmurze (VCP) w Google Cloud z kontrolą granicy w celu zapobiegania wydobyciu danych. Sieć VPC to wirtualna wersja fizycznej sieci, która jest zaimplementowana w sieci produkcyjnej Google. Sieć VPC zapewnia połączenie dla instancji maszyn wirtualnych Compute Engine, oferuje natywne wewnętrzne przekazujące sieciowe systemy równoważenia obciążenia i systemy proxy na potrzeby wewnętrznych systemów równoważenia obciążenia aplikacji, łączy się z sieciami lokalnymi za pomocą tuneli Cloud VPN i przyłączy VLAN na potrzeby Cloud Interconnect, a także rozdziela ruch z zewnętrznych systemów równoważenia obciążenia Google Cloud do backendów.
W przeciwieństwie do maszyn wirtualnych usługi Cloud Run nie są domyślnie powiązane z żadną konkretną siecią VPC. To ćwiczenie w Codelabs pokazuje, jak zmienić ustawienia ruchu przychodzącego (połączeń przychodzących), tak aby tylko ruch pochodzący z VPC miał dostęp do usługi Cloud Run (np. usługi backendu). Dodatkowo dzięki temu ćwiczeniu w Codelabs dowiesz się, jak zapewnić drugiej usłudze (np. usługę frontendu) dostęp do usługi Cloud Run backendu przez sieć VPC, a także jak zachować publiczny dostęp do internetu.
W tym przykładzie backend Cloud Run zwraca interfejs hello world. Usługa frontendu Cloud Run udostępnia w interfejsie użytkownika pole do wprowadzania adresu URL. Następnie usługa frontendu wysyła żądanie GET do tego adresu URL (np. do usługi backendu) i dlatego jest „usługą”, która wysyła żądanie usługi (a nie z przeglądarki do żądania usługi). Gdy usługa frontendu będzie w stanie nawiązać połączenie z backendem, w przeglądarce wyświetli się komunikat „hello world”. Następnie dowiesz się, jak wykonać wywołanie https://curlmyip.org w celu pobrania adresu IP usługi frontendu.
Czego się nauczysz
- Jak zezwolić tylko na ruch z VPC do usługi Cloud Run
- Jak skonfigurować ruch wychodzący w usłudze Cloud Run (np. frontend) w celu komunikowania się z usługą Cloud Run (np. backendem) tylko do wewnętrznego środowiska wewnętrznego przy jednoczesnym zachowaniu publicznego dostępu do internetu dla usługi frontendu.
2. Konfiguracja i wymagania
Wymagania wstępne
- Jesteś zalogowany w konsoli Google Cloud.
- Masz już wdrożoną funkcję 2 generacji. Aby rozpocząć, możesz na przykład skorzystać z krótkiego wprowadzenia do funkcji w Cloud Functions 2 generacji.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell
.
Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
Ta maszyna wirtualna ma 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 ramach tego ćwiczenia z programowania można wykonać w przeglądarce.
Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.
- Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Dane wyjściowe polecenia
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project
Dane wyjściowe polecenia
[core] project = <PROJECT_ID>
Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Dane wyjściowe polecenia
Updated property [core/project].
3. Tworzenie usług Cloud Run
Skonfiguruj zmienne środowiskowe
Możesz ustawić zmienne środowiskowe, które będą używane podczas tego ćwiczenia z programowania.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend-with-internet BACKEND=backend SUBNET_NAME=default
Tworzenie usługi backendu Cloud Run
Najpierw utwórz katalog na kod źródłowy i cd w tym katalogu.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Następnie utwórz plik `package.json` z taką zawartością:
{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }
Następnie utwórz plik źródłowy index.js
z poniższą zawartością. Ten plik zawiera punkt wejścia usługi i główną logikę aplikacji.
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true })); app.get('/', function (req, res) { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });
Na koniec wdróż usługę Cloud Run, która uruchamia poniższe polecenie.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Tworzenie usługi Cloud Run frontendu
Przejdź do katalogu frontendu
cd ../frontend-w-internet
Następnie utwórz plik package.json
z tą zawartością:
{ "name": "frontend", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.6.6", "express": "^4.18.2", "htmx.org": "^1.9.10" } }
Następnie utwórz plik źródłowy index.js
z poniższą zawartością. Ten plik zawiera punkt wejścia usługi i główną logikę aplikacji.
const express = require("express"); const app = express(); const port = 8080; const path = require('path'); const axios = require('axios'); // serve static content (index.html) using // built-in middleware function in Express app.use(express.static('public')); app.use(express.urlencoded({ extended: true })); // this endpoint receives a URL in the post body // and then makes a get request to that URL // results are sent back to the caller app.post('/callService', async (req, res) => { const url = req.body.url; let message = ""; try { console.log("url: ", url); const response = await axios.get(url); message = response.data; } catch (error) { message = error.message; console.error(error.message); } res.send(` ${message} <p> </p> `); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
Utwórz katalog publiczny dla pliku index.html
mkdir public touch public/index.html
Zaktualizuj pole index.html
, dodając do niego te informacje:
<html> <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous" ></script> <body> <div style="margin-top: 100px; margin-left: 100px"> <h1>I'm the Request Tester service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#zen"> <label for="url"> URL:</label> <input style="width: 308px" type="text" id="url" name="url" placeholder="The backend service URL" required /> <button hx-indicator="#loading" type="submit">Submit</button> <p></p> <span class="htmx-indicator" id="loading"> Loading... </span> <div id="zen" style="white-space: pre-wrap"></div> <p></p> </form> </div> </body> </html>
Na koniec wdróż usługę Cloud Run, która uruchamia poniższe polecenie.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Wywoływanie usługi backendu
W tej sekcji sprawdzisz, czy udało Ci się wdrożyć 2 usługi Cloud Run.
Otwórz w przeglądarce adres URL usługi frontendu, na przykład https://frontend-your-hash-uc.a.run.app/
W polu tekstowym wpisz adres URL usługi backendu. Zwróć uwagę, że to żądanie jest kierowane z instancji Cloud Run frontendu do backendu Cloud Run, a nie z przeglądarki.
Zobaczysz „Witaj świecie”.
4. Ustaw usługę backendu tylko dla wewnętrznego ruchu przychodzącego
Aby włączyć usługę Cloud Run do sieci prywatnej, możesz uruchomić to polecenie gcloud.
gcloud run services update $BACKEND --ingress internal --region $REGION
Jeśli spróbujesz wywołać usługę backendu z usługi frontendu, wystąpi błąd 404. Połączenie wychodzące (lub ruch wychodzący) usługi frontendu Cloud Run najpierw trafia do internetu, więc Google Cloud nie zna pochodzenia żądania.
5. Konfigurowanie usługi frontendu w celu uzyskania dostępu do VPC
W tej sekcji skonfigurujesz usługę frontendu Cloud Run do komunikowania się z usługą backendu przez VPC.
Aby to zrobić, musisz dodać bezpośredni ruch wychodzący VPC do usługi Cloud Run frontendu, aby upewnić się, że może ona docierać do wewnętrznych adresów IP w sieci VPC. Następnie skonfigurujesz ruch wychodzący w taki sposób, aby do VPC były kierowane tylko żądania wysyłane do prywatnych adresów IP. Ta konfiguracja pozwoli frontendowi nadal łączyć się z publicznym internetem. Więcej informacji znajdziesz w dokumentacji dotyczącej otrzymywania żądań z innych usług Cloud Run.
Skonfiguruj bezpośredni ruch wychodzący VPC
Najpierw uruchom to polecenie, aby użyć bezpośredniego ruchu wychodzącego VPC w usłudze frontendu:
gcloud beta run services update $FRONTEND \ --network=$SUBNET_NAME \ --subnet=$SUBNET_NAME \ --vpc-egress=private-ranges-only \ --region=$REGION
Możesz teraz potwierdzić, że usługa frontendu ma dostęp do VPC:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Zostaną wyświetlone dane wyjściowe podobne do tych:
VPC access: Network: default Subnet: default Egress: private-ranges-only
Włącz prywatny dostęp do Google
Następnie włącz prywatny dostęp do Google w podsieci, uruchamiając to polecenie:
gcloud compute networks subnets update $SUBNET_NAME \ --region=$REGION \ --enable-private-ip-google-access
Możesz sprawdzić, czy prywatny dostęp do Google jest włączony, uruchamiając to polecenie:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
Utwórz strefę Cloud DNS dla adresów URL run.app
Na koniec utwórz strefę Cloud DNS dla adresów URL typu run.app, aby umożliwić Google Cloud traktowanie ich jako wewnętrznych adresów IP.
W poprzednim kroku konfigurowano bezpośredni ruch wychodzący VPC na tylko zakresy prywatne. Oznacza to, że połączenia wychodzące z usługi frontendu będą trafiać do sieci VPC tylko wtedy, gdy miejscem docelowym jest wewnętrzny adres IP. Usługa backendu używa jednak adresu URL run.app, który prowadzi do publicznego adresu IP.
W tym kroku utworzysz strefę Cloud DNS dla adresów URL run.app, które będą kierowane do zakresów adresów IP private.googleapis.com, które są rozpoznawane jako wewnętrzne adresy IP. Teraz wszystkie żądania do tych zakresów będą kierowane przez Twoją sieć VPC.
Aby to zrobić: https://cloud.google.com/run/docs/securing/private-networking#from-other-services
# do not include the https:// in your DNS Name # for example: backend-<hash>-uc.a.run.app DNS_NAME=<your backend service URL without the https://> gcloud dns --project=$PROJECT_ID managed-zones create codelab-backend-service \ --description="" \ --dns-name="a.run.app." \ --visibility="private" \ --networks=$SUBNET_NAME gcloud dns --project=$PROJECT_ID record-sets create $DNS_NAME. \ --zone="codelab-backend-service" \ --type="A" \ --ttl="60" \ --rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11"
Teraz przy próbie połączenia się z usługą backendu dla witryny zobaczysz komunikat „hello world” .
Kiedy spróbujesz połączyć się z internetem, wpisując https://curlmyip.org/, zobaczysz swój adres IP.
6. Rozwiązywanie problemów
Oto kilka komunikatów o błędach, które mogą pojawić się, jeśli ustawienia nie były prawidłowo skonfigurowane.
- Jeśli pojawi się błąd,
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app
upewnij się, że przedrostek „https://” nie został dodany do rekordu A DNS - Jeśli podczas próby uzyskania dostępu do backendu po skonfigurowaniu strefy wystąpi błąd 404, możesz poczekać na wygaśnięcie pamięci podręcznej globalnego rekordu run.app (np. 6 godzin) lub utworzyć nową wersję (i czyścić pamięć podręczną) przez uruchomienie tego polecenia:
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
7. Gratulacje!
Gratulujemy ukończenia ćwiczeń z programowania.
Zalecamy zapoznanie się z dokumentacją na temat sieci prywatnych w Cloud Run.
Omówione zagadnienia
- Jak zezwolić tylko na ruch z VPC do usługi Cloud Run
- Jak skonfigurować ruch wychodzący w usłudze Cloud Run (np. frontend) w celu komunikowania się z usługą Cloud Run (np. backendem) tylko do wewnętrznego środowiska wewnętrznego przy jednoczesnym zachowaniu publicznego dostępu do internetu dla usługi frontendu.
8. Czyszczenie danych
Aby uniknąć niezamierzonych opłat (na przykład jeśli ta usługa Cloud Run została przypadkowo wywołana więcej razy niż miesięczna alokacja wywołań Cloud Run na poziomie bezpłatnym), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.
Aby usunąć usługi Cloud Run, otwórz konsolę Cloud Run (https://console.cloud.google.com/functions/) i usuń usługi $FRONTEND oraz $BACKEND utworzone w ramach tego ćwiczenia z programowania.
Jeśli zdecydujesz się usunąć cały projekt, możesz otworzyć stronę https://console.cloud.google.com/cloud-resource-manager, wybrać projekt utworzony w kroku 2 i kliknąć Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w pakiecie SDK Cloud. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom polecenie gcloud projects list
.