Edge Microgateway に Docker を使用する

このトピックでは、Docker コンテナで Edge Microgateway を実行する方法について説明します。このトピックの手順は、Docker、Docker コマンド、Edge Microgateway の設定と構成について、読者に基本的な知識があることを前提としています。詳しくは、DockerEdge 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_orgyour_env は、edgemicro config コマンドを実行したときに使用した組織と環境です。このファイルは、Docker コンテナで Edge Microgateway を起動するときに必要になります。

  • edgemicro config コマンドを実行したときに返された鍵とシークレットの認証情報があることを確認します。次に例を示します。

    The following credentials are required to start edge micro
      key: d9c34e1aff68ed969273c016699eabf48780e4f652242e72fc88a43e21252cb0
      secret: 3bc95a71c86a3c8ce04537fbcb788158731t51dfc6cdec13b7c05aa0bd969430
    
  • Docker コンテナで Edge Microgateway を起動する前に、認証付きの API プロキシ呼び出しを行うために必要な、Apigee Edge エンティティを作成する(または作成済みである)必要があります。このエンティティには、Edge Microgateway 対応プロキシ、API プロダクト、デベロッパー、デベロッパー アプリが含まれます。手順の詳細については、Apigee Edge でエンティティを作成するをご覧ください。

Docker コンテナとして Edge Micro を実行する

  1. Edge Microgateway 用の Docker イメージをダウンロードします。

    docker pull gcr.io/apigee-microgateway/edgemicro:latest
  2. 次の手順に進む前に、前提条件セクションのすべての手順を実施済みであることを確認してください。

  3. 次のコマンドを実行して、$HOME/.edgemicro にある Edge Microgateway 構成ファイルを base64 エンコードします。

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

    ここで、your_orgyour_env は、edgemicro config コマンドを実行したときに使用した組織と環境です。

    コマンドの前後に、忘れずにバッククォート(`)を付けてください。次に例を示します。

    export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`
  4. Edge Microgateway をコンテナとして実行します。このコマンドで、コンテナ ランタイムが Edge Microgateway を起動するために使用するいくつかの環境変数を設定します。

    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 SERVICE_NAME=edgemicro \
    --security-opt=no-new-privileges \
    --cap-drop=ALL \
    gcr.io/apigee-microgateway/edgemicro:latest

    パラメータ

    パラメータ 説明
    -P 開いているすべてのポートをホストに公開します。docker run リファレンスもご覧ください。
    -p 1 つのポートまたは一定範囲のポートを明示的にマッピングします。docker run リファレンスもご覧ください。
    -d デタッチモードで実行します。docker run リファレンスもご覧ください。
    -v, --volume ボリューム マウントを指定します。Docker コンテナで TLS を使用するように Edge Microgateway を構成している場合、ログファイル ディレクトリをマウントするにはポート 8443 を公開する必要があります。VOLUME [共有ファイルシステム] もご覧ください。Docker コンテナでの TLS の使用もご覧ください。
    EDGEMICRO_ORG Edge Microgateway の構成に使用した Apigee 組織の名前。
    EDGEMICRO_ENV Edge Microgateway の構成に使用した Apigee 環境の名前。
    EDGEMICRO_PROCESSES 開始するプロセスの数。
    EDGEMICRO_KEY Edge Microgateway を構成したときに返された鍵。
    EDGEMICRO_SECRET Edge Microgateway を構成したときに返されたシークレット。
    EDGEMICRO_CONFIG base64 エンコードされた Edge Microgateway 構成ファイルを含む変数。
    SERVICE_NAME Kubernetes を使用している場合、このパラメータは自動的に設定されます。それ以外の場合は、任意の値に設定できます。何も指定しない場合、サービス名は default に設定されます。
    DEBUG デバッグを有効にするには * に設定します。
    HTTP_PROXY HTTPS_PROXY ファイアウォールの内側で Edge Microgateway を実行していて、ゲートウェイが Apigee Edge と通信できない場合に使用します。詳細については、会社のファイアウォールの内側で Edge Microgateway を設定するをご覧ください。

    例: HTTP_PROXY=http://10.203.0.1:5187/

    NO_PROXY Edge Microgateway がプロキシしないドメインのカンマ区切りリスト。詳細については、会社のファイアウォールの内側で Edge Microgateway を設定するをご覧ください。

    例: localhost,127.0.0.1,localaddress,.localdomain.com

    NODE_EXTRA_CA_CERTS (省略可)Node.js によってデフォルトで信頼されていない CA を使用している場合は、このパラメータを使用します。このパラメータの値には、1 つまたは複数の信頼できる PEM 形式の証明書を含むファイルへのパスを設定します。詳細については、TLS 証明書をご覧ください。
    --security-opt (省略可)Docker の必要なセキュリティ オプションを設定します。Docker のドキュメントでセキュリティの構成をご覧ください。
    --cap-drop (省略可)コンテナで許容される Linux の機能に対する制限を設定します。詳細については、Docker のドキュメントでランタイム権限と Linux の機能をご覧ください。

    次に例を示します。

    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
  5. コンテナが実行中であることを確認するには、次のコマンドを実行します。

    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
    

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 UI で、以前に作成したデベロッパー アプリに移動します。[Developer App] ページで、コンシューマ キーを表示してコピーします。この値が API キーです。このキーを使用して、認証された API 呼び出しを行います。

次のように x-api-key ヘッダーを使用して API を呼び出します。デベロッパー アプリからコピーしたコンシューマ キー値が 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 キーと OAuth トークンを使用し、Edge Microgateway を介して認証付きの API 呼び出しを行う方法の詳細については、パート 4: Edge Microgateway を保護するをご覧ください。

Edge Microgateway の停止

Edge Microgateway を停止するには、次の Docker コマンドを使用します。

docker stop edgemicro

Edge Microgateway の再起動

Edge Microgateway を停止した後に再起動するには、次の Docker コマンドを使用します。

docker start edgemicro

Docker コンテナでの TLS の使用

このセクションでは、Docker コンテナで実行する Edge Microgateway に対して TLS を構成する方法について説明します。受信リクエスト(上り方向)に対して TLS を使用するように Edge Microgateway サーバーを構成でき、ターゲット エンドポイントに送信するリクエスト(下り方向)に対して TLS クライアントとして機能するように Edge Microgateway を構成できます。

証明書ファイルの配置場所

Edge Microgateway を実行している Docker コンテナには、/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 によってデフォルトで信頼されていない認証局(CA)を使用する場合(自己署名証明書を使用する場合など)、コンテナを実行するときに NODE_EXTRA_CA_CERTS パラメータを使用することを検討します。

このパラメータを、1 つまたは複数の信頼できる PEM 形式の証明書を含むファイルへのパスに設定します。このパラメータの使用方法については、上り方向 TLS の構成方法下り方向 TLS の構成方法の例をご覧ください。

次に例を示します。

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

Docker コンテナとして Edge Micro を実行するもご覧ください。

TLS 検証をオフにする

おすすめはできませんが、場合によってはコンテナで実行している Edge Microgateway で TLS 検証を無効にできます。Edge Microgateway の Docker コンテナには、TLS を無効にする機能がデフォルトでは組み込まれていません。これを可能にするには、Edge Microgateway 向けにカスタマイズされた Docker イメージを作成する必要があります。カスタム イメージを作成して 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 を指定します。次に例を示します。

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 の構成方法

このセクションでは、Edge Microgateway サーバーに上り方向(受信)の TLS 接続を設定する方法について説明します。上り方向 TLS を使用すると、クライアントが Edge Microgateway に対して API 呼び出しを行うときに HTTPS を使用できます。次の例では、自己署名証明書を使用しています。

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 を使用します。

  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. 次のコマンドを実行して、$HOME/.edgemicro にある Edge Microgateway 構成ファイルを base64 エンコードします。

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

    ここで、your_orgyour_env は、edgemicro config コマンドを実行したときに使用した組織と環境です。

    コマンドの前後に、忘れずにバッククォート(`)を付けてください。次に例を示します。

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

Docker コンテナとして Edge Micro を実行するもご覧ください。

4. コンテナを実行する

  1. 次のコマンドを実行して、Edge Microgateway を含む Docker コンテナを実行します。

    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. このコマンドで使用している以下の各パラメータは、Docker コンテナとして Edge Micro を実行するで説明されている基本的なコマンドのパラメータとは異なります。

    • port8443 に設定されています。
    • 鍵と証明書のファイルをマウントするためにボリューム マウントを使用しています。
    • NODE_EXTRA_CA_CERTS 変数を使用してカスタム CA を追加しています(自己署名証明書を使用する場合、必要に応じて使用します)。

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 handshake の各ステップが示されます。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 の構成方法

このセクションでは、Edge Microgateway サーバーとバックエンドのターゲット アプリケーションとの間で下り方向(送信)の TLS 接続を設定する方法について説明します。次の例では、自己署名証明書を使用しています。

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 を使用します。

  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. server.js と同じディレクトリに package.json ファイルを作成します。次に例を示します。

    {
      "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. server.js と同じディレクトリに新しい Dockerfile を作成します。ここで、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 対応プロキシを作成します。詳細については、Edge 上に Edge Microgateway 対応 API プロキシを作成するをご覧ください。

    • プロキシ名: 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. 次のコマンドを実行して、$HOME/.edgemicro にある Edge Microgateway 構成ファイルを base64 エンコードします。

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

    ここで、your_orgyour_env は、edgemicro config コマンドを実行したときに使用した組織と環境です。

    コマンドの前後に、忘れずにバッククォート(`)を付けてください。次に例を示します。

    export EDGEMICRO_CONFIG=`base64 $HOME/.edgemicro/docs-test-config.yaml`
  4. 次のコマンドを実行して、Docker コンテナで Edge Microgateway を起動します。

    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 コマンドを実行して構成をテストします。ベースパスには Microgateway 対応プロキシに使用したものを指定し、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 変数を追加します。

    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
    

カスタム プラグインの追加

カスタム プラグインを作成することで、Microgateway に新しい機能を追加できます。カスタム プラグインを使用すると、Microgateway を通過するリクエストやレスポンスをプログラムで操作できます。

Docker コンテナで実行している Edge Microgateway のインスタンスにプラグインをデプロイする方法は 2 通りあります。

このセクションの残りの部分は、標準の Edge Microgateway 設定用プラグインの作成と構成について読者が精通していることを前提としています。そうでない場合は、カスタム プラグインを開発するをご覧ください。

オプション A: ボリューム上のプラグイン ディレクトリをマウントする

(v.2.5.27 で追加)ボリューム マウントによってプラグインを追加する手順は、Edge Microgateway にカスタム プラグインを追加するために必要な手順に似ています。Docker コンテナを実行するとき、コンテナのマウント ポイント(/opt/apigee/plugins)にローカル システム(ボリューム)上のプラグイン ディレクトリをマウントできます。次に、Edge Microgateway 構成ファイルでローカル ボリュームのディレクトリを指定します。

次の手順は、Docker のマウント ポイントを使用してカスタム プラグインを追加する方法を示しています。

  1. Edge Microgateway を停止します。

    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 オプションを使用して Docker ボリュームにプラグイン ディレクトリをマウントします。次のコマンド例では、カスタム プラグインを配置したプラグイン ディレクトリ $HOME/edgemicro/custom/plugins がコンテナのマウント ポイント /opt/apigee/plugins にマッピングされます。

    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-uppercaserequest-headers は、カスタム プラグイン コードを含むフォルダの名前です(この名前は単なる例で、実際のフォルダ名に異なる名前を付けても構いません)。

    plugin
      |
      |-- plugins
        |
        |- response-uppercase
        |     |- index.js
        |     |- package.json
        |- request-headers
        |     | - index.js
              | - package.json
    
  3. cd を実行して、plugin ディレクトリに移動します。

  4. plugin フォルダで、plugins フォルダ全体を zip 圧縮します。

    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. プラグインを含む新しい Edge Microgateway Docker イメージを作成します。

    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. Microgateway を起動する

最後に、コンテナで Microgateway を起動する必要があります。

  1. 次のコマンドを実行して、$HOME/.edgemicro にある Edge Microgateway 構成ファイルを base64 エンコードします。

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

    ここで、your_orgyour_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!