第8章 Fuse on OpenShift 上での Spring Boot 2 用 SOAP to REST ブリッジクイックスタートの実行

このクイックスタートは、Camel の REST DSL を使用してバックエンド SOAP API を公開する方法を示しています。簡単な camel ルートは REST 呼び出しをレガシー SOAP サービスにブリッジできます。RH SSO がサポートする REST エンドポイントと SOAP エンドポイントの両方に対してセキュリティーが関与します。OAuth および OpenID Connect によって保護されるフロントエンド REST API ならびにクライアントは、リソースオーナーパスワードクレデンシャル OAuth2 モードを使用して RH SSO から JWT アクセストークンを取得し、このトークンを使用して REST エンドポイントにアクセスします。

前提条件

  • OCP 3.11 以降のバージョンをインストールし、設定している。
  • RH SSO 7.4 以降のバージョンをインストールしている。
  • 3Scale 2.8 以降のバージョンをインストールしている。
  • registry.redhat.io への認証が設定されている。詳細は、Configuring Red Hat Container Registry authentication を参照してください。

手順

以下のセクションでは、Fuse on OpenShift で SOAP to REST ブリッジクイックスタートを実行し、デプロイする方法を説明します。

  1. OpenShift サーバーを起動します。このクイックスタートの前提条件として RH SSO イメージ (2 Pod) および 3Scale イメージ (15 Pod) をインストールする必要があるため、--memory 8GB --cpus 4 オプションを使用して、強力なマシンで OpenShift サーバーを起動する必要があります。有効期限のあるセキュリティートークンを発行する必要もあるため、タイムゾーンオプションも追加する必要があります。Openshift クラスターがローカルマシンと同じタイムゾーンを使用するようにします (デフォルトでは UTC タイムゾーンを使用します)。
  2. cluster-admin ロールをユーザー developer に追加します。

    $ oc login -u system:admin
    $ oc adm policy add-cluster-role-to-user cluster-admin developer
    $ oc login -u developer
    $ oc project openshift

    このクイックスタートは RH SSO イメージと同様に openshift namespace にデプロイされ (これは関係するテンプレートのデフォルト設定の要件です)、cluster-admin ロールをユーザー developer に追加する必要があります。

  3. シークレットを作成し、これを serviceaccounts にリンクします。

    $ oc create secret docker-registry camel-bridge --docker-server=registry.redhat.io \
      --docker-username=USERNAME \
      --docker-password=PASSWORD \
      --docker-email=EMAIL_ADDRESS
    $ oc secrets link default camel-bridge --for=pull
    $ oc secrets link builder camel-bridge
  4. RH SSO イメージストリームを追加し、テンプレート sso74-x509-postgresql-persistent で RH SSO をインストールします。

    $ for resource in sso74-image-stream.json \
       sso74-https.json \
       sso74-postgresql.json \
       sso74-postgresql-persistent.json \
       sso74-x509-https.json \
       sso74-x509-postgresql-persistent.json
     do
       oc create -f \
       https://raw.githubusercontent.com/jboss-container-images/redhat-sso-7-openshift-image/sso74-dev/templates/${resource}
     done
    
    $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
    
    $ oc new-app --template=sso74-x509-postgresql-persistent

    RH SSO イメージが openshift namespace からアクセスできることを確認し、テンプレート sso74-x509-postgresql-persistent で RH SSO をインストールします。このテンプレートは、RH SSO 設定を永続的に保存できるため、Openshift サーバーの再起動後に設定が保持されます。

  5. RH SSO イメージがサーバーに正常にインストールされたら、コンソールに以下のような出力が表示されます。

    A new persistent RH-SSO service (using PostgreSQL) has been created in your project. The admin username/password for accessing the master realm via the RH-SSO console is tprYtXP1/nEjf7fojv11FmhJ5eaqadoh0SI2gvlls. The username/password for accessing the PostgreSQL database "root" is userqxe/XNYRjL74CrJEWW7HiSYEdH5FMKVSDytx. The HTTPS keystore used for serving secure content, the JGroups keystore used for securing JGroups communications, and server truststore used for securing RH-SSO requests were automatically created via OpenShift's service serving x509 certificate secrets.
    
         * With parameters:
            * Application Name=sso
            * Custom RH-SSO Server Hostname=
            * JGroups Cluster Password=1whGRnsAWu162u0e4P6jNpLn5ysJLWjg # generated
            * Database JNDI Name=java:jboss/datasources/KeycloakDS
            * Database Name=root
            * Datasource Minimum Pool Size=
            * Datasource Maximum Pool Size=
            * Datasource Transaction Isolation=
            * PostgreSQL Maximum number of connections=
            * PostgreSQL Shared Buffers=
            * Database Username=userqxe # generated
            * Database Password=XNYRjL74CrJEWW7HiSYEdH5FMKVSDytx # generated
            * Database Volume Capacity=1Gi
            * ImageStream Namespace=openshift
            * RH-SSO Administrator Username=tprYtXP1 # generated
            * RH-SSO Administrator Password=nEjf7fojv11FmhJ5eaqadoh0SI2gvlls # generated
            * RH-SSO Realm=
            * RH-SSO Service Username=
            * RH-SSO Service Password=
            * PostgreSQL Image Stream Tag=10
            * Container Memory Limit=1Gi
  6. RH SSO 管理コンソールへのアクセスに使用される Username/Password をメモします。以下に例を示します。

     * RH-SSO Administrator Username=tprYtXP1 # generated
     * RH-SSO Administrator Password=nEjf7fojv11FmhJ5eaqadoh0SI2gvlls # generated
  7. 3scale プロジェクトに 3scale テンプレートをインストールします。

    $ oc new-project 3scale
    $ oc create secret docker-registry threescale-registry-auth --docker-server=registry.redhat.io --docker-server=registry.redhat.io \
      --docker-username=USERNAME \
      --docker-password=PASSWORD \
      --docker-email=EMAIL_ADDRESS
    $ oc secrets link default threescale-registry-auth --for=pull
    $ oc secrets link builder threescale-registry-auth
    $ oc new-app --param WILDCARD_DOMAIN="OPENSHIFT_IP_ADDR.nip.io" -f https://raw.githubusercontent.com/3scale/3scale-amp-openshift-templates/2.8.0.GA/amp/amp-eval-tech-preview.yml

    Openshift への 3scale のインストールは 15 の Pod を起動するため、3scale 用に専用の新規プロジェクトを作成する必要があります。また、3scale の新たな threescale-registry-auth (3scale テンプレートで記述されているようにこの名前を使用してシークレットを作成します) シークレットも作成する必要があります。camel-bridge シークレットからの USERNAME/PASSWORD を再利用できます。ここでは意図的に amp-eval-tech-preview.yml テンプレートを使用します。これは、ハードウェアリソースを明示的に指定していないため、ローカルマシン/ラップトップで簡単に実行できるためです。

  8. 3scale テンプレートが Openshift に正常にインストールされたら、コンソールに以下のような出力が表示されます。

    3scale API Management
         ---------
         3scale API Management main system (Evaluation)
    
         Login on https://3scale-admin.192.168.64.33.nip.io as admin/b6t784nt
    
         * With parameters:
            * AMP_RELEASE=2.8
            * APP_LABEL=3scale-api-management
            * TENANT_NAME=3scale
            * RWX_STORAGE_CLASS=null
            * AMP_BACKEND_IMAGE=registry.redhat.io/3scale-amp2/backend-rhel7:3scale2.8
            * AMP_ZYNC_IMAGE=registry.redhat.io/3scale-amp2/zync-rhel7:3scale2.8
            * AMP_APICAST_IMAGE=registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.8
            * AMP_SYSTEM_IMAGE=registry.redhat.io/3scale-amp2/system-rhel7:3scale2.8
            * ZYNC_DATABASE_IMAGE=registry.redhat.io/rhscl/postgresql-10-rhel7
            * MEMCACHED_IMAGE=registry.redhat.io/3scale-amp2/memcached-rhel7:3scale2.8
            * IMAGESTREAM_TAG_IMPORT_INSECURE=false
            * SYSTEM_DATABASE_IMAGE=registry.redhat.io/rhscl/mysql-57-rhel7:5.7
            * REDIS_IMAGE=registry.redhat.io/rhscl/redis-32-rhel7:3.2
            * System MySQL User=mysql
            * System MySQL Password=mrscfh4h # generated
            * System MySQL Database Name=system
            * System MySQL Root password.=xbi0ch3i # generated
            * WILDCARD_DOMAIN=192.168.64.33.nip.io
            * SYSTEM_BACKEND_USERNAME=3scale_api_user
            * SYSTEM_BACKEND_PASSWORD=kraji167 # generated
            * SYSTEM_BACKEND_SHARED_SECRET=8af5m6gb # generated
            * SYSTEM_APP_SECRET_KEY_BASE=726e63427173e58cbb68a63bdc60c7315565d6acd037caedeeb0050ecc0e6e41c3c7ec4aba01c17d8d8b7b7e3a28d6166d351a6238608bb84aa5d5b2dc02ae60 # generated
            * ADMIN_PASSWORD=b6t784nt # generated
            * ADMIN_USERNAME=admin
            * ADMIN_EMAIL=
            * ADMIN_ACCESS_TOKEN=k055jof4itblvwwn # generated
            * MASTER_NAME=master
            * MASTER_USER=master
            * MASTER_PASSWORD=buikudum # generated
            * MASTER_ACCESS_TOKEN=xa7wkt16 # generated
            * RECAPTCHA_PUBLIC_KEY=
            * RECAPTCHA_PRIVATE_KEY=
            * SYSTEM_REDIS_URL=redis://system-redis:6379/1
            * SYSTEM_MESSAGE_BUS_REDIS_URL=
            * SYSTEM_REDIS_NAMESPACE=
            * SYSTEM_MESSAGE_BUS_REDIS_NAMESPACE=
            * Zync Database PostgreSQL Connection Password=efyJdRccBbYcWtWl # generated
            * ZYNC_SECRET_KEY_BASE=dcmNGWtrjCReuJlQ # generated
            * ZYNC_AUTHENTICATION_TOKEN=3FKMAije3V3RWQQ8 # generated
            * APICAST_ACCESS_TOKEN=2ql8txu4 # generated
            * APICAST_MANAGEMENT_API=status
            * APICAST_OPENSSL_VERIFY=false
            * APICAST_RESPONSE_CODES=true
            * APICAST_REGISTRY_URL=http://apicast-staging:8090/policies
  9. 3scale 管理コンソールにアクセスできる Username/Password をメモします。

            * ADMIN_PASSWORD=b6t784nt # generated
            * ADMIN_USERNAME=admin
  10. RH SSO を設定します。

    1. RH SSO をインストールした後にコンソールに表示されるユーザー名/パスワードを使用して https://sso-openshift.OPENSHIFT_IP_ADDR.nip.io/auth から RH SSO 管理コンソールにログインします。
    2. ページの左上隅にある Add Realm ボタンをクリックします。
    3. Add Realm ページで Import Select file ボタンを選択します。
    4. ディレクトリーから ./src/main/resources/keycloak-config/realm-export-new.json を選択します。これは、事前定義されたこのサンプルに必要な realm/client/user/role をインポートします。
  11. 3Scale API ゲートウェイを設定します。

    1. 3Scale をインストールした後にコンソールに表示されるユーザー名/パスワードを使用して https://3scale-admin.OPENSHIFT_IP_ADDR.nip.io/p/admin/dashboard から 3Scale 管理コンソールにログインします。
    2. 新規製品の作成時に、Define manually を選択し、NameSystem name の両方に camel-security-bridge を使用します。
    3. 新規バックエンドを作成する場合は、NameSystem name の両方に camel-security-bridge を使用し、プライベートベース URLhttp://spring-boot-camel-soap-rest-bridge-openshift.OPENSHIFT_IP_ADDR.nip.io/ にする必要があります。
    4. 新規作成したバックエンドを新たに作成したプロダクトに追加します。
    5. マッピングルール Verb:POST Pattern:/ を追加します。
    6. アプリケーションプランを作成する場合には、NameSystem name の両方に camel-security-bridge を使用します。
    7. アプリケーションの作成時に、新しい作成した camel-security-bridge アプリケーションプランを選択します。アプリケーションを作成したら、API クレデンシャルをメモします。これらのクレデンシャルを使用して 3scale ゲートウェイにアクセスします。以下に例を示します。

          User Key 	bdfb53fe9b426fbf21428fd116035798
    8. 新たに作成した camel-security-bridge プロジェクトを編集し、Dashboard の camel-security-bridge から公開します。
    9. Integration > Settings の順に移動します。Credentials location として HTTP Headers を選択します。
    10. Dashboard の camel-security-bridge から Integration > Configuration の順に移動し、Staging APIcastProduction APIcastの両方を昇格します。
  12. デプロイメントしたクイックスタートアプリケーションが含まれるディレクトリーに移動します (例:my_openshift/spring-boot-camel-soap-rest-bridge)。

    $ cd my_openshift/spring-boot-camel-soap-rest-bridge
  13. プロジェクトを OpenShift クラスターにビルドし、デプロイします。

    $ mvn clean oc:deploy -Popenshift -DJAVA_OPTIONS="-Dsso.server=https://sso-openshift.OPENSHIFT_IP_ADDR.nip.io -Dweather.service.host=${your local ip}"

    Openshift の camel-soap-rest-bridge イメージに 2 つの属性を渡す必要があります。1 つは Openshift の RH SSO サーバーアドレスで、これは https://sso-openshift.OPENSHIFT_IP_ADDR.nip.io です。もう 1 つは、バックエンド soap サーバーです。このクイックスタートでは、ローカルマシンでバックエンド soap サーバーを実行するので、マシンのローカル IP アドレスを -Dweather.service.host として渡します(ローカルホストまたは 127.0.0.1 以外の IP アドレスでなければなりません)。

  14. ブラウザーで OpenShift コンソールの openshift プロジェクトに移動します。spring-boot-camel-soap-rest-bridge の Pod が起動していることを確認できるまで待機します。
  15. プロジェクトの Overview ページで、spring-boot-camel-soap-rest-bridge アプリケーションの詳細ページデプロイメント https://OPENSHIFT_IP_ADDR:8443/console/project/openshift/browse/pods/spring-boot-camel-soap-rest-bridge-NUMBER_OF_DEPLOYMENT?tab=details に移動します。
  16. Logs タブに切り替えて、Camel からのログを表示します。
  17. OpenApi API にアクセスします。

この例では、context-path camelcxf/openapi を使用して openapi を使用するサービスの API ドキュメントを提供します。Web ブラウザーから API ドキュメント (http://spring-boot-camel-soap-rest-bridge-openshift.OPENSHIFT_IP_ADDR.nip.io/camelcxf/openapi/openapi.jsonn) にアクセスできます。