1. Wprowadzenie
Omówienie
Aby zabezpieczyć ruch sieciowy dla swoich usług i aplikacji, wiele organizacji korzysta z sieci prywatnego środowiska wirtualnego w chmurze (VPC) 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 uzyskać dostęp drugiej usługi (np. usługi frontendu) do usługi Cloud Run backendu przez sieć VPC.
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”.
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, aby komunikować się z usługą Cloud Run tylko dla wewnętrznego ruchu przychodzącego
2. Konfiguracja i wymagania
Wymagania wstępne
- Jesteś zalogowany w konsoli Google Cloud.
- Masz już wdrożoną usługę Cloud Run. Możesz na przykład zapoznać się z krótkim wprowadzeniem do wdrażania usługi sieciowej z kodu źródłowego.
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.
REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend BACKEND=backend
Tworzenie usługi backendu Cloud Run
Najpierw utwórz katalog na kod źródłowy i cd w tym katalogu.
mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend
Następnie utwórz plik package.json
z tą 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
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" } }
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 plik index.html tak, aby zawierał następujący ciąg:
<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 Frontend service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#message"> <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="message" 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
Sprawdź, czy udało Ci się wdrożyć 2 usługi Cloud Run.
Otwórz adres URL usługi frontendu w przeglądarce.
W polu tekstowym wpisz adres URL usługi backendu. Zwróć uwagę, że to żądanie nie jest kierowane z przeglądarki, ale z instancji Cloud Run do backendu do usługi Cloud Run.
Zobaczysz komunikat „hello world”.
4. Ustaw usługę backendu tylko dla wewnętrznego ruchu przychodzącego
Uruchom to polecenie gcloud, aby zezwolić na dostęp do usługi backendu tylko ruchowi z Twojej sieci VPC.
gcloud run services update $BACKEND --ingress internal --region $REGION
Aby sprawdzić, czy usługa backendu może odbierać ruch tylko z VPC, spróbuj ponownie wywołać usługę backendu z usługi frontendu.
Tym razem pojawi się komunikat „Żądanie nie powiodło się. Kod stanu: 404”.
Ten błąd wystąpił, ponieważ żądanie wychodzące usługi frontendu Cloud Run (tj. ruch wychodzący) najpierw trafia do internetu, więc Google Cloud nie zna źródła żądania.
W następnej sekcji skonfigurujesz usługę frontendu pod kątem dostępu do VPC, dzięki czemu Google Cloud będzie wiedzieć, że żądanie pochodzi z sieci VPC, która jest rozpoznawana jako źródło wewnętrzne.
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 instancji Cloud Run frontendu, by udostępnić usłudze wewnętrzny adres IP do używania w VPC. Następnie skonfigurujesz ruch wychodzący tak, aby wszystkie połączenia wychodzące z usługi frontendu były kierowane do VPC.
Najpierw uruchom to polecenie, aby włączyć bezpośredni ruch wychodzący VPC:
gcloud beta run services update $FRONTEND \ --network=default \ --subnet=default \ --vpc-egress=all-traffic \ --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: all-traffic
Teraz spróbuj jeszcze raz wywołać usługę backendu z usługi frontendu.
Tym razem zobaczysz „Witaj świecie”.
Uwaga: usługa frontendu nie będzie miała dostępu do internetu, ponieważ cały ruch wychodzący został skierowany do VPC. Na przykład usługa frontendu przekroczy limit czasu, jeśli spróbuje uzyskać dostęp do strony https://curlmyip.org/.
6. Gratulacje!
Gratulujemy ukończenia ćwiczeń z programowania.
Zalecamy zapoznanie się z dokumentacją Cloud Run i informacjami o tym, jak skonfigurować sieci prywatne na potrzeby usług 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, aby komunikować się z usługą Cloud Run tylko dla wewnętrznego ruchu przychodzącego
7. Czyszczenie danych
Aby uniknąć niezamierzonych opłat (na przykład jeśli usługi Cloud Run były wywoływane więcej razy niż przez miesięczny przydział wywołań Cloud Run na poziomie bezpłatnym), możesz usunąć Cloud Run albo projekt utworzony w kroku 2.
Aby usunąć usługę Cloud Run, otwórz konsolę Cloud Run na stronie https://console.cloud.google.com/run i usuń usługi $FRONTEND oraz $BACKEND.
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
.