Jak skonfigurować usługę Cloud Run, aby uzyskać dostęp do wewnętrznej usługi Cloud Run przy użyciu bezpośredniego ruchu wychodzącego VPC

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

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

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.

d95252b003979716.png

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

7833d5e1c5d18f54.png

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.

  1. 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`
  1. 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.