Исходящие вызовы API через Google App Engine через Google Compute Engine с Squid - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь проксировать исходящие вызовы API, сделанные из приложения Google App Engine через экземпляр виртуальной машины сервера Google Compute Engine с прокси-сервером Squid.

Цель состоит в том, чтобы все вызовы API REST были сделаны с IP-адреса stati c, чтобы сторонний API мог идентифицировать и разрешать вызовы через свой брандмауэр.

Я прочитал и следовал инструкциям на этом посте:

подключите Google App Engine и Google Compute Engine

Мне удалось сделать следующее:

  1. Создана виртуальная виртуальная машина Google для облачных вычислений и успешно назначен ей внешний IP-адрес c.
  2. Успешно создан соединитель доступа без сервера VP C (все ресурсы расположены в одном и том же). Регион GAE).
  3. Добавлено имя vpc_access_connector в мой app.yaml в проекте Google App Engine (работает на Node.js).
  4. Развертывание приложения с использованием бета-версии gcloud с вызовами API нацеленный на внутренний IP-адрес прокси-сервера, использующий правильный порт Squid по умолчанию (3128).
  5. При отправке запроса из приложения GAE я могу видеть с сервера регистрирует попытки ввода правильного IP-адреса и порта, но выдает следующую ошибку: «Ошибка: не удалось установить туннельный сокет, причина = подключение ECONNREFUSED [my-internal-ip-address]: 3128»

Я также пытался запустить команду curl из интерфейса облачной оболочки, но запрос каждый раз прерывался.

Если кто-то может помочь решить эту проблему, я буду очень признателен.

1 Ответ

1 голос
/ 05 февраля 2020

Ниже приведен возможный пример прокси исходящих HTTP-запросов из стандартного приложения App Engine в NodeJS во время выполнения через виртуальную машину Compute Engine с Squid, основанную на небольшом изменении доступной документации по Google Cloud Platform 1. 2 и Quickstarts 3 .

1. Создайте бессерверный VP C коннектор доступа : в основном следуйте 2 , чтобы создать соединитель. После обновления компонентов gcloud и включения API доступа без сервера VP C в вашем проекте должно быть достаточно следующей команды:

gcloud compute networks vpc-access connectors create [CONNECTOR_NAME] \
--network [VPC_NETWORK] \
--region [REGION] \
--range [IP_RANGE]

2. Создайте виртуальную машину Compute Engine для использования в качестве прокси : в основном выполните 1 для настройки прокси-сервера Squid:

a. Зарезервируйте c внешний IP-адрес и назначьте его для Compute Engine VM .

b. Добавьте правило брандмауэра , чтобы разрешить traffi c для порта Squid по умолчанию: 3128. Эта команда должна работать, если вы используете VP по умолчанию C network : gcloud compute firewall-rules create [FIREWALL_RULE_NAME] --network default --allow tcp:3128

c. Установите Squid на ВМ с помощью следующей команды sudo apt-get install squid3.

d. Включите записи acl localnet src в файлах конфигурации Squid для коннектора доступа VP C:

sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
sudo sed -i 's:#\(acl localnet src [IP_RANGE]/28.*\):\1:' /etc/squid/squid.conf

Например: если вы использовали 10.8.0.0 в качестве значения для поля [IP_RANGE] для создания коннектора , это должно выглядеть примерно так: sudo sed -i 's:#\(acl localnet src 10.8.0.0/28.*\):\1:' /etc/squid/squid.conf

e. Запустите сервер с sudo service squid start

3. Изменения в приложении App Engine : на основе Quickstart для Node.js измените следующие файлы, чтобы создать приложение, которое сканирует веб-страницу с использованием библиотеки запроса-обещания и отображает HTML веб-страницы. Запрос отправляется на веб-страницу с использованием соединителя доступа VP C и виртуальной машины в качестве прокси-сервера с изменениями файлов app.yaml и app. js.

a , пакет. json

...
    "test": "mocha --exit test/*.test.js"
  },
  "dependencies": {
    "express": "^4.16.3",
    "request": "^2.88.0",
    "request-promise": "^4.2.5"
  },
  "devDependencies": {
    "mocha": "^7.0.0",
...

б. приложение. js

'use strict';
// [START gae_node_request_example]
const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res
    .status(200)
    .send('Hello, world!')
    .end();
});
//Add a handler to test the web crawler
app.get('/test', (req, res) => {
  var request = require('request-promise');
  request('http://www.input-your-awesome-website.com')
    .then(function (htmlString) {
      res.send(htmlString)
         .end();
    })
    .catch(function (err) {
      res.send("Crawling Failed...")
         .end();
    });
});
// Start the server
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});
// [END gae_node_request_example]

c. app.yaml

runtime: nodejs10
vpc_access_connector:
  name: "projects/[PROJECT]/locations/[REGION]/connectors/[CONNECTOR_NAME]"
env_variables:
  HTTP_PROXY: "http://[Compute-Engine-IP-Address]:3128"
  HTTPS_PROXY: "http://[Compute-Engine-IP-Address]:3128"

Каждый раз, когда вы go обращаетесь к обработчику /test, который запрашивает go через прокси с помощью команды sudo tail -f /var/log/squid/access.log от ВМ и проверяет изменения в журналах .

Примечания : для работы соединитель, приложение и виртуальная машина должны находиться в одном регионе, и это поддерживаемые области для соединителя .

...