1. Wprowadzenie
Przegląd
Wiele organizacji zabezpiecza ruch w sieci swoich usług i aplikacji za pomocą prywatnego środowiska wirtualnego w chmurze (VPC) w Google Cloud z kontrolami obwodowymi, aby zapobiegać wydobywaniu danych. Sieć VPC to wirtualna wersja fizycznej sieci zaimplementowana w sieci produkcyjnej Google. Sieć VPC zapewnia łączność instancjom maszyn wirtualnych Compute Engine, oferuje natywne wewnętrzne przekazujące sieciowe systemy równoważenia obciążenia i systemy proxy dla wewnętrznych systemów równoważenia obciążenia aplikacji, łączy się z sieciami lokalnymi za pomocą tuneli Cloud VPN i przyłączy VLAN dla Cloud Interconnect oraz 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. W tym ćwiczeniu pokazujemy, jak zmienić ustawienia ruchu przychodzącego (połączeń przychodzących), aby tylko ruch pochodzący z VPC mógł uzyskiwać dostęp do usługi Cloud Run (np. usługi backendu). W tym ćwiczeniu pokazujemy też, jak skonfigurować drugą usługę (np. usługę frontendu), aby miała dostęp zarówno do usługi backendu Cloud Run przez sieć VPC, jak i do publicznego internetu.
W tym przykładzie backend usługi Cloud Run zwraca „hello world”. Usługa frontendu Cloud Run udostępnia w interfejsie pole do wprowadzania danych do zbierania adresów URL. Następnie usługa frontendu wysyła żądanie GET na ten adres URL (np. do usługi backendu), co sprawia, że jest to żądanie typu usługa-usługa (zamiast żądania typu przeglądarka-usługa). Gdy usługa frontendu będzie mogła połączyć się z backendem, w przeglądarce pojawi się komunikat „hello world”. Następnie zobaczysz, jak wywołać adres https://curlmyip.org, aby pobrać adres IP usługi frontendu.
Czego się nauczysz
- Jak zezwolić na dostęp do usługi Cloud Run tylko z sieci VPC
- Jak skonfigurować ruch wychodzący w usłudze Cloud Run (np. frontend), aby komunikowała się z usługą Cloud Run, która akceptuje tylko ruch przychodzący (np. backend), przy jednoczesnym zachowaniu dostępu do publicznego internetu dla usługi frontend.
2. Konfiguracja i wymagania
Wymagania wstępne
- Jesteś zalogowany(-a) w konsoli Google Cloud.
- Funkcja 2 generacji została już wdrożona. Na początek możesz na przykład skorzystać z krótkiego wprowadzenia do wdrażania funkcji 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 tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

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

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 ćwiczeniu, 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.
- 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`
- 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. Tworzenie usług Cloud Run
Konfigurowanie zmiennych środowiskowych
Możesz ustawić zmienne środowiskowe, których będziesz używać podczas naszych ćwiczeń 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 kodu źródłowego i przejdź do niego.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Następnie utwórz plik `package.json`` o tej treś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ą treś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, uruchamiając to polecenie.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Tworzenie usługi frontendu Cloud Run
Przejdź do katalogu frontend.
cd ../frontend-w-internet
Następnie utwórz plik package.json o tej treś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ą treś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 publiczny katalog dla pliku index.html
mkdir public touch public/index.html
Zaktualizuj element index.html, aby zawierał 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, uruchamiając to polecenie.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Wywołanie usługi backendu
W tej sekcji sprawdzisz, czy udało Ci się wdrożyć 2 usługi Cloud Run.
Otwórz adres URL usługi frontendu w przeglądarce, np. https://frontend-your-hash-uc.a.run.app/
W polu tekstowym wpisz adres URL usługi backendu. Pamiętaj, że to żądanie jest kierowane z instancji Cloud Run interfejsu użytkownika do usługi Cloud Run backendu, a nie z przeglądarki.
Wyświetli się „hello world”.
4. Ustawienie usługi 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, pojawi się błąd 404. Połączenie wychodzące (lub ruch wychodzący) usługi Cloud Run frontendu najpierw trafia do internetu, więc Google Cloud nie zna źródła żądania.
5. Konfigurowanie usługi frontendu w celu uzyskania dostępu do sieci VPC
W tej sekcji skonfigurujesz usługę frontendu Cloud Run tak, aby komunikowała się z usługą backendu za pomocą sieci VPC.
Aby to zrobić, musisz dodać bezpośredni ruch wychodzący VPC do usługi Cloud Run frontendu, aby mieć pewność, że może ona docierać do wewnętrznych adresów IP w sieci VPC. Następnie skonfigurujesz ruch wychodzący tak, aby do VPC były kierowane tylko żądania do prywatnych adresów IP. Ta konfiguracja umożliwi Twojemu interfejsowi dostęp do publicznego internetu. Więcej informacji znajdziesz w dokumentacji na temat odbierania żądań z innych usług Cloud Run.
Konfigurowanie bezpośredniego ruchu wychodzącego 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 sprawdzić, czy usługa frontendu ma dostęp do sieci VPC:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Dane wyjściowe powinny być podobne do tych:
VPC access:
Network: default
Subnet: default
Egress: private-ranges-only
Włączanie prywatnego dostępu 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
Aby sprawdzić, czy prywatny dostęp do Google został włączony, uruchom to polecenie:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
Tworzenie strefy DNS Cloud DNS dla adresów URL run.app
Na koniec utwórz strefę Cloud DNS dla adresów URL run.app, aby Google Cloud mógł traktować je jako wewnętrzne adresy IP.
W poprzednim kroku, gdy skonfigurowano bezpośredni ruch wychodzący VPC tylko do zakresów prywatnych. Oznacza to, że połączenia wychodzące z usługi frontendu będą kierowane 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 jest rozpoznawany jako publiczny adres IP.
W tym kroku utworzysz strefę Cloud DNS dla adresów URL run.app, aby rozpoznawać zakresy 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.
Możesz to zrobić w ten sposób: 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"
Gdy spróbujesz teraz uzyskać dostęp do usługi backendu swojej witryny, zobaczysz zwrócony tekst „hello world”.
Gdy spróbujesz uzyskać dostęp do internetu za pomocą adresu https://curlmyip.org/, zobaczysz swój adres IP.
6. Rozwiązywanie problemów
Oto niektóre komunikaty o błędach, które mogą się pojawić, jeśli ustawienia nie zostały skonfigurowane prawidłowo.
- Jeśli pojawi się błąd
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app, sprawdź, czy do rekordu DNS A nie dodano „https://”. - Jeśli po skonfigurowaniu strefy podczas próby uzyskania dostępu do backendu pojawi się błąd 404, możesz poczekać, aż wygaśnie pamięć podręczna w globalnym rekordzie run.app (np. 6 godzin), lub utworzyć nową wersję (a tym samym wyczyścić pamięć podręczną), uruchamiając to polecenie:
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
7. Gratulacje!
Gratulujemy ukończenia ćwiczenia!
Zalecamy zapoznanie się z dokumentacją na temat sieci prywatnych w Cloud Run.
Omówione zagadnienia
- Jak zezwolić na dostęp do usługi Cloud Run tylko z sieci VPC
- Jak skonfigurować ruch wychodzący w usłudze Cloud Run (np. frontend), aby komunikowała się z usługą Cloud Run, która akceptuje tylko ruch przychodzący (np. backend), przy jednoczesnym zachowaniu dostępu do publicznego internetu dla usługi frontend.
8. Czyszczenie danych
Aby uniknąć przypadkowych opłat (np. jeśli ta usługa Cloud Run zostanie przypadkowo wywołana więcej razy niż miesięczny limit wywołań Cloud Run w warstwie bezpłatnej), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.
Aby usunąć usługi Cloud Run, otwórz konsolę Cloud Run w Google Cloud pod adresem https://console.cloud.google.com/functions/ i usuń usługi $FRONTEND i $BACKEND utworzone w tym ćwiczeniu.
Jeśli zdecydujesz się usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.