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

Przegląd

Aby zabezpieczyć ruch w sieci w swoich usługach i aplikacjach, wiele organizacji korzysta z sieci VPC w Google Cloud z kontrolami granicznymi, które zapobiegają 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 druga usługa (np. usługa frontendu) może uzyskiwać dostęp do usługi backendu Cloud Run za pomocą sieci VPC.

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”.

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, aby komunikować się z usługą Cloud Run, która akceptuje tylko ruch przychodzący

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 tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

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

7833d5e1c5d18f54.png

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.

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

REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend
BACKEND=backend

Tworzenie usługi backendu Cloud Run

Najpierw utwórz katalog kodu źródłowego i przejdź do niego.

mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-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

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"
  }
}

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 plik 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 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, uruchamiając to polecenie.

gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION

Wywołanie 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. 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

Uruchom to polecenie gcloud, aby zezwolić na dostęp do usługi backendu tylko z sieci VPC.

gcloud run services update $BACKEND --ingress internal --region $REGION

Aby potwierdzić, że usługa backendu może odbierać ruch tylko z sieci VPC, spróbuj ponownie wywołać usługę backendu z usługi frontendowej.

Tym razem zobaczysz komunikat „Żądanie zakończyło się niepowodzeniem z kodem stanu 404”.

Ten błąd wystąpił, ponieważ żądanie wychodzące (czyli ruch wychodzący) z usługi Cloud Run frontendu jest najpierw wysyłane do internetu, więc Google Cloud nie zna źródła żądania.

W następnej sekcji skonfigurujesz usługę frontendu, aby uzyskiwała dostęp do sieci VPC. Dzięki temu 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 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 instancji frontendu Cloud Run, aby usługa miała wewnętrzny adres IP do użycia w sieci VPC. Następnie skonfigurujesz ruch wychodzący w taki sposób, aby wszystkie połączenia wychodzące z usługi frontendu były kierowane do sieci 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 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:          all-traffic

Teraz spróbuj ponownie wywołać usługę backendu z usługi frontendu.

Tym razem zobaczysz „hello world”.

Uwaga: usługa frontendu nie będzie mieć dostępu do internetu, ponieważ cały ruch wychodzący został przekierowany do sieci VPC. Na przykład usługa frontendu przekroczy limit czasu, jeśli spróbuje uzyskać dostęp do adresu https://curlmyip.org/.

6. Gratulacje!

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją Cloud Run i informacjami o tym, jak skonfigurować sieć prywatną dla usług 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, aby komunikować się z usługą Cloud Run, która akceptuje tylko ruch przychodzący

7. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli usługi Cloud Run zostaną przypadkowo wywołane więcej razy niż miesięczna liczba wywołań Cloud Run w bezpłatnej wersji), możesz usunąć Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć usługę Cloud Run, otwórz konsolę Cloud Run w Google Cloud pod adresem https://console.cloud.google.com/run i usuń usługi $FRONTEND i $BACKEND.

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.