オープンソースの iPaaS: Syndesis を使ってみる

Syndesis は OpenShift [^OpenShift] 上で動作するオープンソースの iPaaS プラットフォーム。Red Hat がスポンサーして開発されている。
https://syndesis.io/

[^OpenShift]: OpenShift とは ["Enterprise Kubernetes for Developers"](https://github.com/openshift/origin) ＝オープンソースの PaaS で、Kubernetes をベースに開発や管理／監視用のツールセットが追加されたもの。Kubernetes 上でマイクロサービスを開発したいときに、OpenShift が使える。詳細はこちらなど。
 http://nekop.hatenablog.com/entry/2016/12/03/173936

# iPaaS とは

iPaaS というのは、インテグレーション（＝システム間連携）に特化した PaaS のことで、ESB や Web サービスに精通したインテグレーションエンジニアでなくとも、カジュアルなユーザ（＝シチズン・インテグレータ）が GUI で簡単にシステム間連携のソリューションを作れるようにするもの。

例えば、エンジニアでない営業補助のオペレータが、Twitter、Facebook、LinkedIn などからユーザの公開情報を引き抜いて、社内の Salesforce に潜在顧客として集める、といったソリューションを比較的簡単に作れるようになる（はず）。イメージとしては ESB 版の、データベースに対する Excel のようなもの、と言えなくもない。

# Syndesis

Syndesis の特徴は、インテグレーションエンジンに軽量で高機能な EIP [^EIP] フレームワーク Apache Camel を採用していることと、OpenShift / Kubernetes をベースに構築されているのでデプロイやスケールアウトが非常に容易なこと、などがある。

[^EIP]: Enterprise Integration Patterns: http://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html

ここでは、以下のクイックスタートを元に、Syndesis をインストールするところまでを説明する。このクイックスタートでは minishift が使われているが、ここでは oc cluster up を使う。
http://syndesis.io/quickstart/

# OpenShift のセットアップと起動

## インストール

まずは、Docker が入ってなければまず Docker から入れる（ここでは省略）。macOS では [Docker for Mac](https://docs.docker.com/docker-for-mac/) を勧める。

次に、OpenShift のコマンドラインツール `oc` をインストールする。

#### macOS

```shell-session
$ brew install openshift-cli
```

#### Linux

以下から最新版のバイナリを落としてパスに通すか、Linuxbrew を使っている人は Mac と同じようにしてインストールする。
https://github.com/openshift/origin/releases

Fedora の場合は、以下でOK。

```shell-session
$ sudo dnf install origin-clients
```

## セットアップ

セットアップの詳細については、こちらも参照：
https://github.com/openshift/origin/blob/master/docs/cluster_up_down.md

### --insecure-registry "172.30.0.0/16"

基本的には `oc cluster up` と実行するだけで、OpenShift のインスタンスをローカルで起動できる。しかし、そのままだとエラーが出て起動に失敗するので、Docker の insecure registry に `172.30.0.0/16` を登録する必要がある。

#### macOS

Docker for Mac の **Preferences...** を開いて、**Daemon** タブの **Insecure registries:** に `172.30.0.0/16` を登録して、Docker を再起動する。

#### Linux

`/etc/docker/daemon.json` （無ければ作成）を、以下のように編集する。

```json
{
   "insecure-registries": [
     "172.30.0.0/16"
   ]
}
```

その後、Docker デーモンを再起動。

```shell-session
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

### ファイアウォール設定

CentOS / RHEL / Fedora を使っている場合は、以下のようにファイアウォールの設定が必要。

まずは、Docker ネットワーク（`172.17.0.0/16` と仮定）のファイアウォール設定。

```shell-session
$ sudo firewall-cmd --permanent --new-zone dockerc
$ sudo firewall-cmd --permanent --zone dockerc --add-source 172.17.0.0/16
$ sudo firewall-cmd --permanent --zone dockerc --add-port 8443/tcp
$ sudo firewall-cmd --permanent --zone dockerc --add-port 53/udp
$ sudo firewall-cmd --permanent --zone dockerc --add-port 8053/udp
```

次に、ホストマシンのファイアウォール設定。`443/tcp` は Syndesis の起動に必須。でないとエラーが発生して起動しない。`8443/tcp` はマシンの外から OpenShift の Web コンソールにアクセスしたいときには必須。

```shell-session
$ sudo firewall-cmd --permanent --add-port 443/tcp
$ sudo firewall-cmd --permanent --add-port 8443/tcp
```

最後にファイアウォール設定を反映させる。

```shell-session
$ sudo firewall-cmd --reload
```

## ローカル起動

`oc cluster up` で OpenShift は起動するが、oc cluster up はローカルでのテスト用コマンドなので、デフォルトは OpenShift インスタンスへの変更が永続化されない。変更を永続化するには、`--host-data-dir=/path/to/data/dir` パラメータを渡す。また、2回目起動以降は `--use-existing-config` パラメータも加える。さらに、マシンの外から OpenShift の Web コンソールにアクセスできるように、`--public-hostname=xxx.xxx.xxx.xxx` も付ける。

したがって、起動コマンドは以下の通り。（ローカルマシンの IP アドレスが `192.168.1.10` で、データディレクトリを `/opt/openshift/data` にした場合。`--host-data-dir` の場所はユーザが任意に決めていい。）

```shell-session
$ oc cluster up --public-hostname=192.168.1.10 --host-data-dir=/opt/openshift/data
```

（2回目以降）

```shell-session
$ oc cluster up --public-hostname=192.168.1.10 --host-data-dir=/opt/openshift/data --use-existing-config
```

### Web コンソール

https://192.168.1.10:8443/ にアクセスして、ユーザ名：`deveploper` パスワード：`developer` でログイン（実際には初期設定ではパスワードはなんでもOK）。

### 終了

起動した OpenShift インスタンスを終了するには、以下のようにする。

```shell-session
$ oc cluster down
```

# Syndesis のインストール

ここからようやく Syndesis のクイックスタートに入る。しかし、OpenShift のセットアップが正しく終わっていれば、あとはそんなに難しくはないはず。
http://syndesis.io/quickstart/

## GitHub クレデンシャルの取得

まず、以下の URL から自分の GitHub アカウントにアプリケーションを登録して、クレデンシャルを取得する必要がある。
https://github.com/settings/developers

フォームは適当に埋めれば良いが、**Authorization callback URL** には以下を入力する（ローカルマシンの IP アドレスが `192.168.1.10` の場合）。
```
https://syndesis.192.168.1.10.nip.io
```

その後、得られたクレデンシャル（`Client ID` と `Client Secret`）を、後続の作業のために環境変数にエクスポートする。

```shell-session
$ export GITHUB_CLIENT_ID=...
$ export GITHUB_CLIENT_SECRET=...
```

## Syndesis のデプロイ

以下のコマンドを実行して、Syndesis の OpenShift テンプレートをインストールし、最後にアプリケーション `syndesis-restricted` を作成する。

```shell-session
$ oc create -f https://raw.githubusercontent.com/syndesisio/syndesis-openshift-templates/master/syndesis-restricted.yml
$ oc create -f https://raw.githubusercontent.com/syndesisio/syndesis-openshift-templates/master/support/serviceaccount-as-oauthclient-restricted.yml
$ oc new-app syndesis-restricted \
    -p ROUTE_HOSTNAME=syndesis.192.168.1.10.nip.io \
    -p OPENSHIFT_MASTER=$(oc whoami --show-server) \
    -p OPENSHIFT_PROJECT=$(oc project -q) \
    -p OPENSHIFT_OAUTH_CLIENT_SECRET=$(oc sa get-token syndesis-oauth-client) \
    -p GITHUB_OAUTH_CLIENT_ID=${GITHUB_CLIENT_ID} \
    -p GITHUB_OAUTH_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
```

Syndesis の pod がすべてデプロイされるまで待つ。

```shell-session
$ oc get pods -w
```

## Syndesis へログイン

この URL へアクセス： https://syndesis.192.168.1.10.nip.io

デプロイに成功していれば、ログイン画面が現れる。

![syndesis-login.png](https://qiita-image-store.s3.amazonaws.com/0/30502/eabdeb03-9441-80e4-bfad-539eae87bcf5.png)

ユーザ名：`deveploper` パスワード：`developer` でログイン。**Authorize Access** という画面が出て、OAuth クライアントがこのユーザの情報へのアクセス許可を求めてくるので、すべて許可する。

次に、ユーザ情報を更新する画面が出るので適宜入力して送信。

![syndesis-update-account.png](https://qiita-image-store.s3.amazonaws.com/0/30502/037c1199-d72d-72bd-5f85-e169f30fa3d0.png)

すると、先ほど取得した GitHub のクレデンシャルを元にこの Syndesis アプリケーションを GitHub 上で認証するか確認されるので、許可する。

これで以下の画面にリダイレクトされて、めでたく認証情報の初期設定と Syndesis へのログインが完了する。

![syndesis-home.png](https://qiita-image-store.s3.amazonaws.com/0/30502/955b8916-f379-fa8a-87ff-e115bad1b0fd.png)

Syndesis の具体的な使い方は、また別の機会に。