Использование Docker для Edge Microgateway

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

В этой теме объясняется, как запустить Edge Microgateway в контейнере Docker. Описанные здесь шаги предполагают базовое понимание Docker, команд Docker, а также настройки и конфигурации Edge Microgateway. Для получения дополнительной информации обратитесь к документации по Docker и Edge Microgateway .

Предварительные требования

Перед запуском Edge Microgateway в контейнере Docker необходимо выполнить следующие действия:

  • Настройте Edge Microgateway для вашей организации/среды Apigee:

    edgemicro configure -o your_org -e your_env -u your_username

    Более подробную информацию о настройке см. в Части 1: Настройка Edge Microgateway .

  • После выполнения шагов настройки найдите файл конфигурации. По умолчанию он находится здесь:

    $HOME/.edgemicro/your_org-your_env-config.yaml

    где your_org и your_env — это организация и среда, которые вы использовали при выполнении команды edgemicro config . Этот файл понадобится вам при запуске Edge Microgateway в контейнере Docker.

  • Убедитесь, что у вас есть ключ и секретные данные, полученные при выполнении команды edgemicro config . Например:

    The following credentials are required to start edge micro
      key: d9c34e1aff68ed969273c016699eabf48780e4f652242e72fc88a43e21252cb0
      secret: 3bc95a71c86a3c8ce04537fbcb788158731t51dfc6cdec13b7c05aa0bd969430
    
  • Прежде чем запускать Edge Microgateway в контейнере Docker, необходимо создать (или уже создать) сущности Apigee Edge, необходимые для выполнения аутентифицированных вызовов API-прокси. К этим сущностям относятся прокси-сервер, поддерживающий Edge Microgateway, API-продукт, разработчик и приложение разработчика. Полные инструкции см. в разделе «Создание сущностей в Apigee Edge» .

Запустите Edge Micro в виде контейнера Docker.

  1. Загрузите образ Docker для Edge Microgateway:

    docker pull gcr.io/apigee-microgateway/edgemicro:latest
  2. Прежде чем переходить к следующим шагам, убедитесь, что вы выполнили все действия, описанные в разделе «Предварительные условия» .

  3. Выполните следующую команду, чтобы закодировать в формате base64 файл конфигурации Edge Microgateway, расположенный в каталоге $HOME/.edgemicro :

    export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/your_org-your_env-config.yaml`

    где your_org и your_env — это организация и среда, которые вы использовали при выполнении команды edgemicro config .

    Не забудьте заключить команду в обратные кавычки (`). Например:

    export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`
  4. Запустите Edge Microgateway в контейнере. Эта команда устанавливает несколько переменных среды, которые используются средой выполнения контейнера для запуска Edge Microgateway:

    chown -R 100:101 ~/.edgemicro/ \
    docker run -P -p 8000:8000 -d --name edgemicro \
    -v /var/tmp:/opt/apigee/logs \
    -e EDGEMICRO_PROCESSES=1 \
    -e EDGEMICRO_ORG=your_org \
    -e EDGEMICRO_ENV=your_env \
    -e EDGEMICRO_KEY=your_key \
    -e EDGEMICRO_SECRET=your_secret \
    -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
    -e "LOG_CONSOLE_OUTPUT_TO_FILE=false" \
    -e SERVICE_NAME=edgemicro \
    --security-opt=no-new-privileges \
    --cap-drop=ALL \
    gcr.io/apigee-microgateway/edgemicro:latest

    Параметры

      <tr>
        <td><code>SERVICE_NAME</code></td>
        <td>If you are on Kubernetes, this parameter is auto-populated. Otherwise,
          you can set it to anything you wish. If you specify nothing, the service
          name is set to <code>default</code>.</td>
      </tr>
      <tr>
        <tr>
        <td><code>DEBUG</code></td>
        <td>Set to <code>*</code> to enable debugging. </td>
      </tr>
      <tr>
        <td><code>HTTP_PROXY</code>
            <code>HTTPS_PROXY</code></td>
        <td>Use when Edge Microgateway is
          running behind a firewall and the gateway cannot communicate with Apigee
          Edge. For more
          information, see <a href="operation-and-configuration-reference-edge-microgateway#settingupedgemicrogatewaybehindacompanyfirewall">Setting up Edge Microgateway behind a company firewall</a>. 
          <p>For example: <code>HTTP_PROXY=http://10.203.0.1:5187/</code></p></td>
      </tr>
      <tr>
        <td><code>NO_PROXY</code></td>
        <td>A comma delimited list of domains that Edge Microgateway should not proxy to. 
          For more information, see <a href="operation-and-configuration-reference-edge-microgateway#settingupedgemicrogatewaybehindacompanyfirewall">Setting up Edge Microgateway behind a company firewall</a>.
          <p>For example: <code>localhost,127.0.0.1,localaddress,.localdomain.com</code></p></td>
      </tr>
      <tr>
      <tr>
        <tr>
        <td><code>NODE_EXTRA_CA_CERTS</code></td>
        <td>(Optional) Use this parameter if you are using a CA that's not trusted
          by default by Node.js. Set the value of this parameter to the path to a
          file containing one or more trusted certificates in PEM format. For
          details, see <a href="#tls_certificates">TLS certificates</a>.</td>
      </tr>
      <tr>
        <td><code>--security-opt</code></td>
        <td>(Optional) Sets desired Docker security options. See <a href="https://docs.docker.com/engine/reference/run/#security-configuration">Security configuration</a> in the Docker documentation.</td>
      </tr>
      <tr>
        <td><code>--cap-drop</code></td>
        <td>(Optional) Sets limits on Linux capabilities permitted in the container. See <a href="https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities">Runtime privilege and Linux capabilities</a> in the Docker documentation.</td>
      </tr>
    </tbody>
    

    Параметр Описание
    -P Опубликуйте все открытые порты на хосте. См. также справочник по Docker run .
    -p Явно сопоставьте один порт или диапазон портов. См. также справочник по Docker run .
    -d Запуск в отсоединенном режиме. См. также справочник по Docker run .
    -v, -- volume Указывает на монтирование тома. Обратите внимание, что если вы настроите Edge Microgateway для использования TLS в контейнере Docker, вам необходимо открыть порт 8443 при монтировании каталога файлов журналов. См. также VOLUME [общие файловые системы] . См. также Использование TLS в контейнере Docker .
    -w, -- workdir (Необязательно) Указывает путь к каталогу, где должны быть созданы файлы edgemicro.sock и edgemicro.pid . Изменить имя файла root edgemicro нельзя. По умолчанию используется путь к текущему рабочему каталогу.

    Пример:

    docker run -P -p 8000:8000 -d -w /tmp --name edgemicro 
    ...
    EDGEMICRO_ORG Название организации Apigee, которую вы использовали для настройки Edge Microgateway.
    EDGEMICRO_ENV Название среды Apigee, которую вы использовали для настройки Edge Microgateway.
    EDGEMICRO_PROCESSES Количество процессов для запуска.
    EDGEMICRO_KEY Ключ, полученный при настройке Edge Microgateway.
    EDGEMICRO_SECRET Секретный ключ был восстановлен после настройки Edge Microgateway.
    EDGEMICRO_CONFIG Переменная, содержащая закодированный в base64 файл конфигурации Edge Microgateway.
    LOG_CONSOLE_OUTPUT_TO_FILE (Логическое значение) Позволяет указать, куда будут отправляться выходные данные журнала. См. раздел «Указание параметров файла журнала» .

    Например:

    chown -R 100:101 ~/.edgemicro/ 
    docker run -P -p 8000:8000 -d --name edgemicro
    -v /var/tmp:/opt/apigee/logs
    -e EDGEMICRO_PROCESS=1
    -e EDGEMICRO_ORG=docs
    -e EDGEMICRO_ENV=test
    -e EDGEMICRO_KEY=d9c34e1aff68ed969273b016699eabf48780e4f652242e72fc88a23e21252cb0
    -e EDGEMICRO_SECRET=3bc95a71c86a3c8ce04137fbcb788158731t51dfc6cdec13b7c05aa0bd969430
    -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG"
    -e SERVICE_NAME=edgemicro
    --security-opt=no-new-privileges
    --cap-drop=ALL
    gcr.io/apigee-microgateway/edgemicro

    1. Чтобы проверить, запущен ли контейнер:

      docker ps

      В результате вы должны увидеть примерно следующий вывод:

      CONTAINER ID    IMAGE         COMMAND                CREATED          STATUS          PORTS                                             NAMES
      8b92e082ea9c    edgemicro    "/tmp/entrypoint.sh"   12 minutes ago   Up 12 minutes    0.0.0.0:8000->8000/tcp, 0.0.0.0:32775->8443/tcp    edgemicro
      

    Указание параметров вывода в файл журнала

    Параметр конфигурации Edge Microgateway to_console позволяет выбрать отправку информации журнала в стандартный вывод вместо файла журнала. Если вы выполните действия по запуску Edge Microgateway в контейнере Docker, контейнер по умолчанию перенаправит стандартный вывод и вывод ошибок в файл, расположенный внутри контейнера по адресу: ${APIGEE_ROOT}/logs/edgemicro.log .

    Чтобы предотвратить отправку информации из логов в edgemicro.log , используйте переменную LOG_CONSOLE_OUTPUT_TO_FILE при запуске контейнера.

    В следующей таблице описано поведение вывода логов при использовании LOG_CONSOLE_OUTPUT_TO_FILE с to_console :

    to_console: true

    LOG_CONSOLE_OUTPUT_TO_FILE=false

    • В файл журнала Edge Microgateway никакие записи отправляться не будут, как описано в разделе «Управление файлами журналов» .
    • Журналы событий не будут записываться в файл edgemicro.log .
    to_console: true

    LOG_CONSOLE_OUTPUT_TO_FILE=true

    • В файл журнала Edge Microgateway никакие записи отправляться не будут, как описано в разделе «Управление файлами журналов» .
    • Журналы будут отправлены в файл edgemicro.log .
    to_console: false

    LOG_CONSOLE_OUTPUT_TO_FILE=true

    Тестирование вызова API

    После запуска Edge Microgateway в контейнере вы можете выполнять к нему API-запросы. Например, если базовый путь вашего API — /hello :

    http://localhost:8000/hello

    Пример выходных данных:

    {"error":"missing_authorization","error_description":"Missing Authorization header"}
    

    Если вы видите такой ответ, это означает, что Edge Microgateway успешно обработал вызов API. Однако по умолчанию Edge Microgateway требует ключ API для аутентификации. В следующем разделе вы протестируете API с действительным ключом API.

    Протестируйте API с действительным ключом API.

    В пользовательском интерфейсе Edge перейдите к созданному ранее приложению разработчика. На странице приложения разработчика отобразите ключ потребителя и скопируйте его. Это значение является ключом API. Вы будете использовать этот ключ для выполнения аутентифицированных вызовов API.

    Вызовите API с заголовком x-api-key следующим образом. Значение ключа потребителя, скопированное из приложения разработчика, является ключом API. По умолчанию Edge Microgateway ожидает, что вы передадите ключ в заголовке с именем x-api-key , например, так:

    curl -i http://localhost:8000/hello -H "x-api-key:apikey"

    Например:

    curl -i http://localhost:8000/hello -H "x-api-key:PydUKRDGIXRqF2xh4usn1FLHbhGKVIz"

    Если вы хотите узнать больше о выполнении аутентифицированных вызовов API через Edge Microgateway с использованием ключей API и токенов OAuth, см. Часть 4: Безопасный Edge Microgateway .

    Микрошлюз Stopping Edge

    Для остановки Edge Microgateway используйте следующую команду Docker:

    docker stop edgemicro
    

    Перезапуск Edge Microgateway

    После остановки Edge Microgateway вы можете перезапустить его с помощью следующей команды Docker:

    docker start edgemicro
    

    Использование TLS в контейнере Docker

    В этом разделе объясняется, как настроить TLS для Edge Microgateway, работающего в контейнере Docker. Вы можете настроить сервер Edge Microgateway для использования TLS для входящих запросов (направление «север»), а также настроить Edge Microgateway в качестве TLS-клиента для исходящих запросов к целевым конечным точкам (направление «юг»).

    Куда поместить файлы сертификатов

    В контейнере Docker, работающем с Edge Microgateway, точка монтирования находится по адресу /opt/apigee/.edgemicro . При настройке Edge Microgateway на использование TLS-сертификатов вы можете сделать файлы сертификатов доступными в этой точке монтирования и указать на них ссылку в конфигурационном файле Edge Microgateway. Этот конфигурационный файл обычно находится в каталоге $HOME/.edgemicro и называется your_org - your_env -config.yaml . Например:

    ...
    edgemicro:
      ssl:
       key: /opt/apigee/.edgemicro/southbound/tls.key
       cert: /opt/apigee/.edgemicro/southbound/tls.crt
    ...
    

    Использование центра сертификации, которому Node.js не доверяет.

    Если вы используете центр сертификации (CA), которому Node.js по умолчанию не доверяет (например, самоподписанный сертификат), рассмотрите возможность использования параметра NODE_EXTRA_CA_CERTS при запуске контейнера.

    Укажите в этом параметре путь к файлу, содержащему один или несколько доверенных сертификатов в формате PEM. Примеры использования этого параметра см. в статьях «Как настроить TLS для северного направления» и «Как настроить TLS для южного направления» .

    Например:

    chown -R 100:101 ~/.edgemicro/ \
    docker run -P -p 8443:8443 -d --name edgemicro \
    -v $HOME/.edgemicro:/opt/apigee/.edgemicro \
    -v $HOME/.edgemicro:/opt/apigee/logs \
    -e NODE_EXTRA_CA_CERTS=/opt/apigee/.edgemicro/rootca.pem \
    -e EDGEMICRO_PORT=8443 \
    -e EDGEMICRO_ORG=docs \
    -e EDGEMICRO_ENV=test \
    -e EDGEMICRO_KEY=ac36574905fb54fdae65fc5433e831bec2680efb98220a355f2e917e52973c \
    -e EDGEMICRO_SECRET=aac81dff6c326eaa222d53c15c8841fa78ea863bf4472568c9ce2d80a3bc56 \
    -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
    --link helloworld:helloworld gcr.io/apigee-microgateway/edgemicro
    

    См. также Запуск Edge Micro в виде контейнера Docker .

    Отключение проверки TLS

    Хотя это и не рекомендуется, в некоторых случаях может потребоваться отключить проверку TLS для Edge Microgateway, работающего в контейнере. Возможность отключения TLS по умолчанию не встроена в контейнер Docker для Edge Microgateway. Для этого необходимо создать собственный образ Docker для Edge Microgateway. Ниже приведены общие инструкции по созданию пользовательского образа и отключению проверки TLS.

    1. Клонируйте или загрузите репозиторий исходного кода Edge Microgateway с https://github.com/apigee-internal/microgateway .

    2. cd в каталог microgateway/kubernetes/docker/edgemicro в директории с исходным кодом.

      Например:

      cd $HOME/git/microgateway/kubernetes/docker/edgemicro
      
    3. Откройте файл entrypoint.sh и измените код, чтобы он принимал переменную окружения NODE_TLS_REJECT_UNAUTHORIZED . Позже, при запуске контейнера, вы укажете значение для этой переменной.

    4. Создайте контейнер Docker:

      docker build -t edgemicro .
      
    5. При запуске контейнера укажите параметр -e NODE_TLS_REJECT_UNAUTHORIZED = 1 Например:

    chown -R 100:101 ~/.edgemicro/ \
    docker run -P -p 8443:8443 -d --name edgemicro \
    -v $HOME/.edgemicro:/opt/apigee/.edgemicro \
    -v $HOME/.edgemicro:/opt/apigee/logs \
    -e NODE_TLS_REJECT_UNAUTHORIZED = 1 \
    -e EDGEMICRO_PORT=8443 \
    -e EDGEMICRO_ORG=docs \
    -e EDGEMICRO_ENV=test \
    -e EDGEMICRO_KEY=ac36574905fb54fdae65fc5433e831bec2680efb98220a355f2e917e52973c \
    -e EDGEMICRO_SECRET=aac81dff6c326eaa222d53c15c8841fa78ea863bf4472568c9ce2d80a3bc56 \
    -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
    --link helloworld:helloworld gcr.io/apigee-microgateway/edgemicro
    

    Пример: Как настроить TLS-соединение с северным направлением.

    В этом разделе объясняется, как настроить входящее (северное) TLS-соединение на сервере Edge Microgateway. Северное TLS-соединение позволяет клиентам использовать HTTPS при выполнении вызовов API к Edge Microgateway. В приведенном ниже примере используются самоподписанные сертификаты.

    1. Этапы первоначальной настройки

    1. Найдите файл openssl.cnf в вашей системе. Например, /etc/ssl/openssl.cnf .
    2. Откройте файл opensssl.cnf для редактирования.
    3. Убедитесь, что параметр req_extensions присутствует в вашем конфигурационном файле. Например, в вашем файле должна быть информация, подобная следующей:

      [ req ]
      ...
      req_extensions          = v3_req
      ...
      
      [ v3_req ]
      extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      
    4. Добавьте следующий фрагмент кода в файл openssl.cnf , чтобы сгенерировать правильные атрибуты SNI:

      [ alt_names ]
      DNS.1 = www.example.com
      DNS.2 = example.com
      DNS.3 = localhost
      DNS.4 = localhost.localdomain
      DNS.5 = 127.0.0.1
      DNS.6 = ::1
      DNS.7 = fe80::1
      

      Пример файла opensssl.cnf :

      [ req ]
      distinguished_name      = req_distinguished_name
      attributes              = req_attributes
      req_extensions          = v3_req
      
      [ v3_req ]
      extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      
      [ req_distinguished_name ]
      countryName                     = Country Name (2 letter code)
      countryName_min                 = 2
      countryName_max                 = 2
      stateOrProvinceName             = State or Province Name (full name)
      localityName                    = Locality Name (eg, city)
      0.organizationName              = Organization Name (eg, company)
      organizationalUnitName          = Organizational Unit Name (eg, section)
      commonName                      = Common Name (eg, fully qualified host name)
      commonName_max                  = 64
      emailAddress                    = Email Address
      emailAddress_max                = 64
      
      [ req_attributes ]
      challengePassword               = A challenge password
      challengePassword_min           = 4
      challengePassword_max           = 20
      
      [ alt_names ]
      DNS.1 = www.example.com
      DNS.2 = example.com
      DNS.3 = localhost
      DNS.4 = localhost.localdomain
      DNS.5 = 127.0.0.1
      DNS.6 = ::1
      DNS.7 = fe80::1
      
    5. Выполните действия, описанные в разделе «Предварительные условия» , чтобы инициализировать и настроить Edge Microgateway, если вы еще этого не сделали. После завершения у вас должны быть созданы прокси-сервер, поддерживающий Edge Microgateway, API-продукт, разработчик и приложение разработчика. Кроме того, вы должны были выполнить команду edgemicro configure и получить ключ и секрет.

    2. Сгенерировать самоподписанные сертификаты

    Далее сгенерируйте сертификаты и ключи, необходимые для установления TLS-соединения:

    1. cd в каталог $HOME/.edgemicro .
    2. Создайте следующий bash-скрипт. Вы можете назвать его как угодно. Например: keygen.sh .

      #!/bin/bash
      # generate ca
      openssl genrsa -out rootca.key 2048
      openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1024 -out rootca.pem
      # generate key
      openssl genrsa -out tls.key 2048
      openssl req -new -key tls.key -out tls.csr
      # sign cert
      openssl x509 -req -in tls.csr -CA rootca.pem -CAkey rootca.key -CAcreateserial -out tls.crt -days 1024 -sha256 -extensions 'v3_req' -extfile path/openssl.cnf
      
    3. В bash-файле убедитесь, что указан правильный путь к файлу openssl.cnf .

    4. Запустите bash-файл. Вам будет предложено ввести информацию о сертификате. Обязательно используйте localhost в качестве общего имени (Common Name).

    5. Убедитесь, что были созданы следующие файлы:

      • rootca.key
      • rootca.pem
      • tls.key
      • tls.csr
      • rootca.srl
      • tls.crt

    3. Отредактируйте конфигурационный файл Edge Microgateway.

    1. Откройте конфигурационный файл Edge Micro в текстовом редакторе. Например:

      vi $HOME/.edgemicro/myorg-test-config.yaml
      
    2. Отредактируйте раздел edgemicro следующим образом. Обратите внимание, что вы вносите изменения в атрибуты port и ssl :

      edge_config:
      ...
      edgemicro:
        port: 8443
        max_connections: 1000
        config_change_poll_interval: 600
        ssl:
          key: /opt/apigee/.edgemicro/tls.key
          cert: /opt/apigee/.edgemicro/tls.crt
          passphrase: admin123
          rejectUnauthorized: true
          requestCert: false
        logging:
      ...
      
    3. Выполните следующую команду для кодирования файла конфигурации Edge Microgateway, расположенного в каталоге $HOME/.edgemicro в формате base64:

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/your_org-your_env-config.yaml`

      где your_org и your_env — это организация и среда, которые вы использовали при выполнении команды edgemicro config .

      Не забудьте заключить команду в обратные кавычки (`). Например:

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`

    См. также: Запуск Edge Micro в виде контейнера Docker .

    4. Запустите контейнер.

    1. Для запуска контейнера Docker с Edge Microgateway выполните следующую команду:

      chown -R 100:101 ~/.edgemicro/ \
      docker run -P -p 8443:8443 -d --name edgemicro \
      -v path_to_your_edgemicro_dir:/opt/apigee/.edgemicro \
      -v path_to_your_logs_dir:/opt/apigee/logs \
      -e NODE_EXTRA_CA_CERTS=/opt/apigee/.edgemicro/rootca.pem \
      -e EDGEMICRO_PORT=8443 \
      -e EDGEMICRO_ORG=$EDGEMICRO_ORG \
      -e EDGEMICRO_ENV=$EDGEMICRO_ENV \
      -e EDGEMICRO_KEY=$EDGEMICRO_KEY \
      -e EDGEMICRO_SECRET=$EDGEMICRO_SECRET \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      gcr.io/apigee-microgateway/edgemicro:latest
      
    2. Обратите внимание на следующие параметры, используемые в команде; они отличаются от базовой команды, описанной в разделе «Запуск Edge Micro в качестве контейнера Docker» .

      • port установлен на 8443 .
      • Для монтирования файлов ключа и сертификата используется точка монтирования тома.
      • Переменная NODE_EXTRA_CA_CERTS используется для добавления пользовательского центра сертификации (при необходимости в случае самоподписанных сертификатов).

    5. Проверьте конфигурацию TLS.

    1. Выполните следующую команду cURL, чтобы проверить настройку. Подставьте в команду свой базовый путь и ключ API. В следующем примере предполагается, что вы находитесь в каталоге, где расположен файл rootca.pem , и что созданный вами прокси-сервер имеет базовый путь /hello :

      curl -v https://localhost:8443/hello --cacert rootca.pem \
      -H "x-api-key: Az82fdnfONVCOOE4NKhajxAboDgA3FAo"
      
    2. Подробный вывод cURL отображает каждый шаг процесса установления TLS-соединения. Если вы видите ответ HTTP 200, значит, настройка прошла успешно:

      *   Trying ::1...ey:Az82fdnfONVCOOE4NKhajxAboDgA3FAo"
      * TCP_NODELAY set
      * Connected to localhost (::1) port 8443 (#0)
      * ALPN, offering h2
      * ALPN, offering http/1.1
      * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
      * successfully set certificate verify locations:
      *   CAfile: rootca.pem
        CApath: none
      * TLSv1.2 (OUT), TLS handshake, Client hello (1):
      * TLSv1.2 (IN), TLS handshake, Server hello (2):
      * TLSv1.2 (IN), TLS handshake, Certificate (11):
      * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
      * TLSv1.2 (IN), TLS handshake, Server finished (14):
      * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
      * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
      * TLSv1.2 (OUT), TLS handshake, Finished (20):
      * TLSv1.2 (IN), TLS change cipher, Client hello (1):
      * TLSv1.2 (IN), TLS handshake, Finished (20):
      * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
      * ALPN, server accepted to use http/1.1
      * Server certificate:
      *  subject: C=US; ST=CO; L=Boulder; O=Docs; OU=Docs; CN=localhost; emailAddress=docs@apigee.com
      *  start date: Dec 14 22:35:28 2018 GMT
      *  expire date: Oct  3 22:35:28 2021 GMT
      *  common name: localhost (matched)
      *  issuer: C=US; ST=CO; L=Boulder; O=Docs; OU=Docs; CN=localhost; emailAddress=docs@apigee.com
      *  SSL certificate verify ok.
      > GET /hello HTTP/1.1
      > Host: localhost:8443
      > User-Agent: curl/7.54.0
      > Accept: */*
      > x-api-key:Az82fdnfaONVCOE4NKhajxAboDA3FAo
      >
      < HTTP/1.1 200 OK
      < x-powered-by: Apigee
      < access-control-allow-origin: *
      < x-frame-options: ALLOW-FROM RESOURCE-URL
      < x-xss-protection: 1
      < x-content-type-options: nosniff
      < content-type: text/plain; charset=utf-8
      < etag: W/"d-GHB1ZrJKk/wdVTdB/jgBsw"
      < date: Fri, 14 Dec 2018 22:43:13 GMT
      < via: 1.1 google
      < alt-svc: clear
      < x-response-time: 1325
      < Connection: keep-alive
      < Transfer-Encoding: chunked
      <
      * Connection #0 to host localhost left intact
      Hello, Guest!
      

    Пример: Как настроить TLS-соединение в южном направлении

    В этом разделе объясняется, как настроить исходящее TLS-соединение между сервером Edge Microgateway и целевым бэкэнд-приложением. В приведенном ниже примере используются самоподписанные сертификаты.

    1. Этапы первоначальной настройки

    1. Найдите файл openssl.cnf в вашей системе. Например, /etc/ssl/openssl.cnf .
    2. Откройте файл opensssl.cnf для редактирования.
    3. Убедитесь, что параметр req_extensions присутствует в вашем конфигурационном файле. Например, в вашем файле должна быть информация, подобная следующей:

      [ req ]
      ...
      req_extensions          = v3_req
      ...
      
      [ v3_req ]
      extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      
    4. Добавьте следующий фрагмент кода в файл openssl.cnf , чтобы сгенерировать правильные атрибуты SNI:

      [ alt_names ]
      DNS.1 = helloworld
      DNS.2 = localhost
      DNS.3 = localhost.localdomain
      DNS.4 = 127.0.0.1
      DNS.5 = ::1
      DNS.6 = fe80::1
      

      Пример файла opensssl.cnf :

      [ req ]
      distinguished_name      = req_distinguished_name
      attributes              = req_attributes
      req_extensions          = v3_req
      
      [ v3_req ]
      extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      
      [ req_distinguished_name ]
      countryName                     = Country Name (2 letter code)
      countryName_min                 = 2
      countryName_max                 = 2
      stateOrProvinceName             = State or Province Name (full name)
      localityName                    = Locality Name (eg, city)
      0.organizationName              = Organization Name (eg, company)
      organizationalUnitName          = Organizational Unit Name (eg, section)
      commonName                      = Common Name (eg, fully qualified host name)
      commonName_max                  = 64
      emailAddress                    = Email Address
      emailAddress_max                = 64
      
      [ req_attributes ]
      challengePassword               = A challenge password
      challengePassword_min           = 4
      challengePassword_max           = 20
      
      [ alt_names ]
      DNS.1 = helloworld
      DNS.2 = localhost
      DNS.3 = localhost.localdomain
      DNS.4 = 127.0.0.1
      DNS.5 = ::1
      DNS.6 = fe80::1
      
    5. Выполните команду edgemicro configure :

      edgemicro configure -o your_org -e your_env -u your_username

      Более подробную информацию о настройке см. в Части 1: Настройка Edge Microgateway .

    6. Скопируйте ключ и секретные данные, полученные в результате выполнения edgemicro configure . Эти значения понадобятся вам для запуска контейнера. Например:

      The following credentials are required to start edge micro
        key: d9c34e1aff68ed969273c016699eabf48780e4f652242e72fc88a43e21252cb0
        secret: 3bc95a71c86a3c8ce04537fbcb788158731t51dfc6cdec13b7c05aa0bd969430
      

    2. Создайте целевое приложение Node.js.

    1. cd в каталог .edgemicro .

    2. Создайте следующий bash-скрипт. Вы можете назвать его как угодно. Например: keygen.sh .

      #!/bin/bash
      # generate ca
      openssl genrsa -out rootca.key 2048
      openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1024 -out rootca.pem
      # generate key
      openssl genrsa -out tls.key 2048
      openssl req -new -key tls.key -out tls.csr
      # sign cert
      openssl x509 -req -in tls.csr -CA rootca.pem -CAkey rootca.key -CAcreateserial -out tls.crt -days 1024 -sha256 -extensions 'v3_req' -extfile path/openssl.cnf
      
    3. В bash-файле убедитесь, что указан правильный путь к файлу openssl.cnf .

    4. Запустите bash-файл. Вам будет предложено ввести информацию о сертификате. Обязательно используйте hellworld в качестве общего имени (Common Name).

    5. Убедитесь, что были созданы следующие файлы:

      • rootca.key
      • rootca.pem
      • tls.key
      • tls.csr
      • rootca.srl
      • tls.crt
    6. Создайте новый файл с именем server.js .

      'use strict';
      
      const express = require('express');
      const https = require('https');
      const fs = require('fs');
      
      const options = {
        key: fs.readFileSync("tls.key"),
        cert: fs.readFileSync("tls.crt")
      };
      
      // Constants
      const PORT = 9443;
      const HOST = '0.0.0.0';
      
      // App
      const app = express();
      app.get('/', (req, res) => {
        res.send('Hello world\n');
      });
      
      https.createServer(options, app).listen(PORT);
      
    7. Создайте файл package.json в той же директории, что и server.js . Например:

      {
        "name": "helloworld",
        "version": "1.0.0",
        "description": "",
        "main": "server.js",
        "scripts": {
          "test": "echo \"Error: no test specified\" && exit 1",
          "start": "node server.js"
        },
        "author": "",
        "license": "ISC",
        "dependencies": {
          "express": "^4.16.4",
          "fs": "0.0.1-security",
          "https": "^1.0.0"
        }
      }
      
    8. Выполните npm install , чтобы получить необходимые зависимости.

    9. Создайте новый Dockerfile в той же директории, что и server.js , где WORKDIR — это путь к корневому каталогу вашего Node.js-приложения:

      FROM node:8-alpine
      WORKDIR path-to-your-node-app
      COPY package*.json ./
      
      RUN npm install
      COPY . .
      EXPOSE 9443
      CMD [ "npm", "start" ]
      
    10. Создайте образ Docker:

      docker build -t helloworld . 
      
    11. Запустите демонстрационное приложение:

      docker run -P -p 9443:9443 --name helloworld helloworld
      

    3. Создайте сущности в Apigee Edge.

    1. Создайте прокси-сервер, поддерживающий Edge Microgateway, с указанными настройками. Дополнительную информацию см. в разделе «Создание прокси-сервера API, поддерживающего Edge Microgateway, на Edge» .

      • Имя прокси: edgemicro_local
      • Редакция: 1
      • Базовый путь: /local
      • Цель: https://helloworld:9443
    2. Создайте API-продукт. Подробности см. в разделе «Создание продукта» .

    3. Создайте разработчика. Подробности см. в разделе «Создание разработчика» .

    4. Создайте приложение для разработчиков. Подробности см. в разделе «Создание приложения для разработчиков».

    4. Запустите контейнер.

    1. Откройте конфигурационный файл Edge Micro в текстовом редакторе. Например:

      vi $HOME/.edgemicro/myorg-test-config.yaml
      
    2. Отредактируйте раздел edgemicro следующим образом. Обратите внимание, что вы вносите изменения в атрибуты port и ssl :

      edge_config:
      ...
      edgemicro:
        port: 8443
        max_connections: 1000
        config_change_poll_interval: 600
        ssl:
          key: /opt/apigee/.edgemicro/tls.key
          cert: /opt/apigee/.edgemicro/tls.crt
          passphrase: admin123
          rejectUnauthorized: true
          requestCert: false
        logging:
      ...
      
    3. Выполните следующую команду для кодирования файла конфигурации Edge Microgateway, расположенного в каталоге $HOME/.edgemicro в формате base64:

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/your_org-your_env-config.yaml`

      где your_org и your_env — это организация и среда, которые вы использовали при выполнении команды edgemicro config .

      Не забудьте заключить команду в обратные кавычки (`). Например:

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`
    4. Выполните следующую команду, чтобы запустить Edge Microgateway в контейнере Docker.

      chown -R 100:101 ~/.edgemicro/ \
      docker run -P -p 8443:8443 -d --name edgemicro \
      -v path_to_your_edgemicro_dir:/opt/apigee/.edgemicro \
      -v path_to_your_logs_dir:/opt/apigee/logs \
      -e EDGEMICRO_PORT=8443 \
      -e EDGEMICRO_ORG=$EDGEMICRO_ORG \
      -e EDGEMICRO_ENV=$EDGEMICRO_ENV \
      -e EDGEMICRO_KEY=$EDGEMICRO_KEY \
      -e EDGEMICRO_SECRET=$EDGEMICRO_SECRET \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      --link helloworld:helloworld gcr.io/apigee-microgateway/edgemicro
      

    5. Проверьте конфигурацию TLS.

    1. Выполните следующую команду cURL, чтобы проверить настройку. Замените базовый путь, который вы использовали в прокси-сервере с поддержкой микрошлюза, на ключ API, полученный из приложения разработчика, созданного вами в Apigee Edge. Например:

      curl https://localhost:8443/local -k -H "x-api-key: xxxx" -v
      

      Вы должны увидеть следующую ошибку:

      ...
      *  subject: C=CA; ST=Ontario; L=Toronto; O=Google Canada; OU=Google Cloud Platform; CN=edgemicro; emailAddress=srinandans@google.com
      *  start date: Dec 10 02:12:22 2018 GMT
      *  expire date: Sep 29 02:12:22 2021 GMT
      *  issuer: C=CA; ST=Ontario; L=Toronto; O=Google Canada; OU=Google Cloud Platform; CN=edgemicro; emailAddress=srinandans@google.com
      *  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
      > GET /local HTTP/1.1
      > Host: localhost:8443
      > User-Agent: curl/7.54.0
      > Accept: */*
      > x-api-key: 9fVC65pFj8LrmlPmVyxFjx4KgAHTxqSd
      >
      < HTTP/1.1 502 Bad Gateway
      < Date: Wed, 12 Dec 2018 05:25:01 GMT
      < Connection: keep-alive
      < Content-Length: 93
      <
      * Connection #0 to host localhost left intact
      {"message":"unable to verify the first certificate","code":"UNABLE_TO_VERIFY_LEAF_SIGNATURE"}
      
    2. Запустите Edge Microgateway повторно, но на этот раз добавьте переменную NODE_EXTRA_CA_CERTS .

      chown -R 100:101 ~/.edgemicro/ \
      docker run -P -p 8443:8443 -d --name edgemicro \
      -v path_to_your_edgemicro_dir:/opt/apigee/.edgemicro \
      -v path_to_your_logs_dir:/opt/apigee/logs \
      -e NODE_EXTRA_CA_CERTS=/opt/apigee/.edgemicro/rootca.pem \
      -e EDGEMICRO_PORT=8443 \
      -e EDGEMICRO_ORG=$EDGEMICRO_ORG \
      -e EDGEMICRO_ENV=$EDGEMICRO_ENV \
      -e EDGEMICRO_KEY=$EDGEMICRO_KEY \
      -e EDGEMICRO_SECRET=$EDGEMICRO_SECRET \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      --link helloworld:helloworld gcr.io/apigee-microgateway/edgemicro
      
    3. Выполните следующую команду cURL. Замените ваш базовый путь и ключ API, как и раньше. Например:

      curl https://localhost:8443/local -k -H "x-api-key: xxxx" -v
      
    4. Проверьте вывод. В случае успеха вы получите ответ со статусом HTTP 200:

      ...
      > GET /local HTTP/1.1
      > Host: localhost:8443
      > User-Agent: curl/7.54.0
      > Accept: */*
      > x-api-key: 9fVC65pFj8LrmlPmVyxFjx4KgAHTxqSd
      >
      < HTTP/1.1 200 OK
      < x-powered-by: Express
      < content-type: text/html; charset=utf-8
      < etag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
      < date: Wed, 12 Dec 2018 05:49:28 GMT
      < x-response-time: 421
      < Connection: keep-alive
      < Transfer-Encoding: chunked
      <
      Hello world
      

    Добавление пользовательского плагина

    Вы можете добавлять новые функции и возможности в микрошлюз, создавая собственные плагины . Пользовательские плагины позволяют программно взаимодействовать с запросами и ответами, проходящими через микрошлюз.

    Для развертывания плагинов на экземпляре Edge Microgateway, работающем в контейнере Docker, у вас есть два варианта:

    В оставшейся части этого раздела предполагается, что вы знакомы с написанием и настройкой плагинов для стандартной конфигурации Edge Microgateway. Если нет, см. раздел «Разработка пользовательских плагинов» .

    Вариант А: Смонтировать каталог плагинов на томе.

    (Добавлено в версии 2.5.27) Шаги по добавлению плагинов через монтирование тома аналогичны шагам, необходимым для добавления любого пользовательского плагина в Edge Microgateway. При запуске контейнера Docker вы можете смонтировать каталог плагинов на вашей локальной системе (том) в точке монтирования контейнера, которая находится по /opt/apigee/plugins . Затем вы указываете локальный каталог тома в конфигурационном файле Edge Microgateway.

    Следующие шаги демонстрируют, как использовать точку монтирования Docker для включения пользовательских плагинов.

    1. Остановить микрошлюз Edge:

      edgemicro stop
      
    2. Создайте директорию для ваших пользовательских плагинов. Например, создайте

      $HOME/edgemicro/custom/plugins
      
    3. Добавьте каталог пользовательских плагинов в конфигурационный файл Edge Microgateway. Например:

        plugins:
          dir: $HOME/edgemicro/custom/plugins
          sequence:
            - oauth
            - response-uppercase
        ````
      
    4. Напишите и протестируйте свой плагин, следуя инструкциям в разделе «Написание простого плагина» . Убедитесь, что код вашего плагина размещен в правильной структуре каталогов. Например:

      custom
        |
        |-- plugins
          |
          |- response-uppercase
          |     |- index.js
          |     |- package.json
          |- request-headers
          |     | - index.js
                | - package.json
      
    5. Запустите контейнер Docker с помощью команды, аналогичной следующей, используя опцию -v для монтирования каталога plugins на том Docker. В приведенном ниже примере команда сопоставляет каталог plugins $HOME/edgemicro/custom/plugins (где находится пользовательский плагин) с точкой монтирования контейнера /opt/apigee/plugins :

      chown -R 100:101 ~/.edgemicro/ \
      docker run -P -p 8000:8000 -d --name edgemicro \
      -v /var/tmp:/opt/apigee/logs \
      -v $HOME/edgemicro/custom/plugins:/opt/apigee/plugins \
      -e EDGEMICRO_PROCESSES=1 \
      -e EDGEMICRO_ORG=jdoe \
      -e EDGEMICRO_ENV=test \
      -e EDGEMICRO_KEY=39c4b561100cd7f258768d1072f3e1d7c17b5f36a18fe89972bb5c9ce7e58fb \
      -e EDGEMICRO_SECRET=f5f9e239a38b4e6cc99c2aa067716a84aebdcff9580a7925fc500e402b1a5fa \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      -e SERVICE_NAME=edgemicro \
      --security-opt=no-new-privileges \
      --cap-drop=ALL gcr.io/apigee-microgateway/edgemicro:latest
      
    6. Для тестирования плагина вызовите свой API.

    Для получения дополнительной информации см. VOLUME [разделяемые файловые системы] .

    Вариант B: Встроить плагины в контейнер.

    В этом варианте плагины встраиваются непосредственно в контейнер.

    1. Упакуйте ваши плагины.

    1. Напишите и протестируйте свой плагин, следуя инструкциям в разделе «Написание простого плагина» .

    2. Разместите код вашего плагина в соответствующей структуре каталогов. Каталоги плагинов должны соответствовать установленной структуре. В следующем примере показана структура, которой вы должны придерживаться, где response-uppercase и request-headers — это названия папок, содержащих пользовательский код плагина (эти названия являются лишь примерами, названия ваших папок могут отличаться):

      plugin
        |
        |-- plugins
          |
          |- response-uppercase
          |     |- index.js
          |     |- package.json
          |- request-headers
          |     | - index.js
                | - package.json
      
    3. cd в папку plugin .

    4. В папке plugin заархивируйте всю папку plugins :

      zip -r plugins.zip plugins/

    2. Создайте образ Docker.

    Далее создайте Dockerfile, чтобы добавить код вашего плагина в образ Edge Microgateway.

    1. В той же директории, где находится zip-файл, создайте новый файл с именем Dockerfile .
    2. Добавьте следующий код в Dockerfile и сохраните файл:

      USER root
      RUN apk update && \
          apk upgrade && \
          apk add zipapk add zip && \
          mkdir /opt/apigee/customplugins && \
          chown apigee:apigee /opt/apigee/customplugins
      COPY plugins.zip /opt/apigee/customplugins
      RUN su - apigee -c "unzip /opt/apigee/customplugins/plugins.zip -d /opt/apigee/customplugins"
      EXPOSE 8000
      EXPOSE 8443
      USER apigee
      ENTRYPOINT ["entrypoint"]
      
    3. Создайте новый образ Docker для Edge Microgateway с вашими плагинами:

      docker build -t image-name .

      Например:

      docker build -t edgemicroplugins .

    3. Обновите конфигурацию Edge Microgateway.

    Теперь, когда плагины упакованы, вам необходимо добавить их в конфигурационный файл Edge Microgateway.

    1. Откройте файл конфигурации Edge Microgateway в текстовом редакторе:

      $HOME/.edgemicro/org-env-config.yaml
      

      Например:

      vi $HOME/.edgemicro/myorg-test-config.yaml
    2. Добавьте каталог плагина в конфигурационный файл. В следующем примере атрибут dir указывает местоположение кода плагина (которое вы указали в Dockerfile). Вам также необходимо указать имя каталога плагина, которое в приведенном ниже примере — response-uppercase .

      edgemicro:
        ...
        plugins:
          dir: /opt/apigee/plugins
          sequence:
            - oauth
            - response-uppercase
      

    4. Запустите микрошлюз.

    Наконец, необходимо запустить микрошлюз в контейнере.

    1. Выполните следующую команду, чтобы закодировать в формате base64 файл конфигурации Edge Microgateway, расположенный в каталоге $HOME/.edgemicro :

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/your_org-your_env-config.yaml`

      где your_org и your_env — это организация и среда, которые вы использовали при выполнении команды edgemicro config .

      Не забудьте заключить команду в обратные кавычки (`). Например:

      export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`
    2. Запустите Edge Microgateway в контейнере. Эта команда устанавливает несколько переменных среды, которые используются средой выполнения контейнера для запуска Edge Microgateway:

      docker run -P -p 8000:8000 -d --name edgemicroplugins \
      -e EDGEMICRO_PLUGIN_DIR=/opt/apigee/customplugins/plugins \
      -e EDGEMICRO_ORG=your_org \
      -e EDGEMICRO_ENV=your_env \
      -e EDGEMICRO_KEY=your_key \
      -e EDGEMICRO_SECRET=your_secret \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      -e SERVICE_NAME=edgemicroplugins image_name

      Например:

      docker run -P -p 8000:8000 -d --name edgemicroplugins \
      -e EDGEMICRO_PLUGIN_DIR=/opt/apigee/customplugins/plugins \
      -e EDGEMICRO_ORG=docs \
      -e EDGEMICRO_ENV=test \
      -e EDGEMICRO_KEY=d9c34e1aff68ed969273b016699eabf48780e4f652242e72fc88a23e21252cb0 \
      -e EDGEMICRO_SECRET=3bc95a71c86a3c8ce04137fbcb788158731t51dfc6cdec13b7c05aa0bd969430 \
      -e "EDGEMICRO_CONFIG=$EDGEMICRO_CONFIG" \
      -e SERVICE_NAME=edgemicroplugins edgemicroplugins
    3. Для тестирования плагина вызовите свой API:

      Проверьте корректность выполнения кода плагина, вызвав свой API и убедившись, что результат соответствует ожиданиям:

      curl -i http://localhost:8000/hello -H "x-api-key:apikey"

      Например, плагин response-uppercase может вернуть ответ следующего вида:

      curl -i http://localhost:8000/hello -H "x-api-key:PydUKRDGIXRqF2xh4usn1FLHbhGKVIz"
        HELLO, WORLD!