ABAP Cloud Developer Trial 2022でCloud Connectorを設定

## はじめに
ABAP Cloud Developer Trial 2022は、今年の4月に登場したトライアル用のABAP開発環境で、[Docker Hub](https://hub.docker.com/r/sapse/abap-cloud-developer-trial#before-you-pull-the-image)で提供されています。"Cloud"とつくのは、このバージョンから言語バージョン"ABAP for Cloud Development"を選択できるためです。すなわち、開発者拡張の検証もできます！

https://community.sap.com/t5/technology-blogs-by-sap/abap-cloud-developer-trial-2022-available-now/ba-p/13598069

インストール手順は上記Docker Hubのドキュメントのほか、以下の記事がわかりやすいです。（以下の記事は1909ですが、手順は基本的に同じです）

https://qiita.com/SAITO_Keita/items/d826c66d0853282f4b9c#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%ABsap-gui%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

過去に[NW AS ABAP Developer Editionで環境構築](https://qiita.com/tami/items/031c8c8e12e24b467e75)したときと比べ、手順が簡単になっていることに驚きました。

## 本記事の目的
ABAP Cloud Developer Trialには、Cloud Connectorがデフォルトで含まれています。この記事では、Cloud Connectorを設定してABAP環境とBTP環境を接続する手順について説明します。

## 環境の構成
私の場合、ABAP Cloud Developer TrialはEC2インスタンスの中で実行しており、GUIやCloud Connectorにはローカルの環境から接続しています。

ABAPサーバとCloud Connectorは同一のDockerコンテナの中で起動しています。ABAPサーバはポート50000をHTTP用に、50001をHTTPS用に公開しています。Cloud Connectorはポート8443を公開しています。

![architecture.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/662e1870-1130-1919-f6c4-5d8aa5f7bbb0.png)


## 設定手順
1. Cloud Connectorの起動
1. Cloud Connectorにログイン
1. BTPサブアカウントと接続
1. ABAP環境と接続
1. Destinationの登録
1. BASからの疎通確認

### 1. Cloud Connectorの起動
a4hのコンテナを起動したあと、[ドキュメント](https://hub.docker.com/r/sapse/abap-cloud-developer-trial#before-you-pull-the-image)の"Cloud Connector"のセクションに従い、Cloud Connectorを起動します。

```
docker exec -it a4h bash
/usr/local/sbin/rcscc_daemon start
```

※以下のエラーが出ますが、Cloud Connectorは使える状態です
```
ERROR: shell command for retrieving PID of process bound to SCC port failed -- com.sap.scc.util.ShellCommand$ExecutionException: Command lsof -i :8443 failed, caused by java.io.IOException: Cannot run lsof - execvpe failed (ENOENT - No such file or directory)
WARNING: cannot determine PID of process using port 8443
Cloud Connector 2.16.2 started on https://vhcala4hci:8443 (master)
```

### 2. Cloud Connectorにログイン
以下のURLで接続します。

```
https://<the container's IP>:8443
```

hostsでIPに`vhcala4hci`に割り当てている場合は`https://vhcala4hci:8443`でアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/87a28160-8f22-ee16-16cf-fd7385af0633.png)

ユーザ：`Administrator`、パスワード：`manage`でログインします。ログイン後、パスワード変更を求められるので変更します。

### 3. BTPサブアカウントと接続
Connector > Add Subaccountをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9ef9ee00-7c75-bcde-5c22-7b30708733c0.png)

接続先のサブアカウントの情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/de2be7ce-9350-f17e-cedf-903112691499.png)

### 4. ABAP環境と接続
ABAP環境との接続を追加します。いくつかつまづきがあったので、トラブルシューティングの過程も含めて書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/daea399b-a33d-6bc0-6c53-e5cc9cea44dd.png)

#### 4.1. 最初の設定
最初の設定では、Internal Hostを`localhost`としていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e55e5468-cf1b-aceb-26ef-790a2945fbb8.png)

接続チェックを行うと`Not Reachable`となり、詳細を確認すると _Issueer with subject DN CN=*.dummy.nodomain ... is not trusted. Add this issuer to the Cloud Connector backend trust store_ というメッセージが出ていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/935d9d5c-46b9-9f28-f936-24101e22d13b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d1d0aca5-fbc8-9f9c-a3d2-9ee3be2f5016.png)

`CN=*.dummy.nodomain ...`というのはABAPサーバの証明書であり、Tr-cd:STRUSTで、"SSL Server Standard"に設定されているものでした。

:::note info
証明書のチェックが走るのはプロトコルをHTTPSにしているためで、HTTPにするとこの段階でも接続できます。
:::

#### 4.2. ABAPサーバの証明書をCloud ConnectorのBackend Trust Storeに追加
Tr-cd:STRUSTで、ABAPサーバの証明書をエクスポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/aa479482-3030-0a45-e502-91c0167a2a97.png)

エクスポートした証明書をCloud ConnectorのConfiguration > ON PREMISEのタブからBackend Trust Storeにアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6c42e816-7bae-5eb8-409e-60a03403e697.png)

再度接続確認を行ったところ、次は _Certificate for <localhost> doesn't match any of the subject alternative names_ というメッセージが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2fc510dc-6ea8-2781-7eb8-20923f897546.png)

これは、Internal Hostに`localhost`と設定しているが、ABAPサーバの証明書のSubject、およびSubject (Alt)には`localhost`が含まれていないため、信用できないということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c2955c3c-b06a-72b4-1e62-2d37af8aad10.png)

対応方法として2つを考えました。
- Internal HostをABAPサーバの証明書のCNと合わせて`*.dummy.nodomain`とする
- ABAPサーバの証明書を変更する

まずは一つ目の方法を試してみます。

#### 4.3. Internal HostをABAPサーバの証明書のCNと合わせる
Dockerコンテナ内のhostファイルを確認します。
```
cat /ect/hosts
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1d148270-8102-7767-735a-e440f8c4c6ef.png)

`*.dummy.nodomain`に関するマッピングは定義されていないので、追加しました。
```
echo "172.0.0.1 test.dummy.nodomain" >> /etc/hosts
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e60ffcbf-548f-8533-c41e-8210e2949eb4.png)

そのうえで、Internal Hostを`test.dummy.nodomain`とすると接続が成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1fbc18bd-e812-d643-cc90-ddb04e3389b7.png)

#### 4.4. ABAPサーバの証明書を変更する
このままでも問題ないのですが、`test.dummy.nodomain`というのがしっくりこなかったので、ABAPサーバの証明書側を更新することにしました。

Tr-cd: STRUSTでSSL server Standardを右クリックし、Replaceを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5e578e20-1eac-487f-cac3-c0c410075e8c.png)

Nameに`vhcala4hci`を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/67edb3fe-558c-8178-95fc-a767d974c131.png)

このあと、新しい証明書をエクスポートし、Cloud ConnectorのBackend Trust Storeの証明書を置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4dbfe767-f626-ae5e-1004-ca7bd93d1a43.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2d6aeb4a-2642-d54a-f930-050581c7f1e4.png)

そのうえで、Internal Hostを`vhcala4hci`とすると接続が成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8e057b4c-012a-b598-120f-67231561ab7f.png)

#### 4.5. 許可するパスの追加
ODataサービスに接続できるよう、許可するパスに`/sap/opu/odata/`を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6ed782d2-cc77-c8ea-bfab-62d7a77106e9.png)

### 5. Destinationの登録
BTPサブアカウントに以下のDestinationを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/76dd65f6-9cdb-67e1-fa15-09d8122d3a01.png)

### 6. BASからの疎通確認
最後にSAP Business Application Studio (BAS)から疎通を確認します。テンプレートからUI5アプリを作成でODataの接続を確認してもよいのですが、以下のブログに載っているcurlコマンドで確認する方法がより手軽です。

https://community.sap.com/t5/technology-blogs-by-sap/how-to-check-the-connectivity-to-your-backend-system-in-business/ba-p/13479832

```
curl -v -i "<destination>.dest/sap/opu/odata/iwfnd/catalogservice;v=2/ServiceCollection?%24top=1"
```
ステータスコード200が返ってくれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3fef88a5-0a23-342f-9f08-8521a411571e.png)

※Destinationの設定を変更した場合は、以下のコマンドでキャッシュのクリアが必要です。
```
curl localhost:8887/reload
```
## おわりに
[以前](https://qiita.com/tami/items/c36eb787b03b437c6c5b)Cloud Connectorの設定をしたときは、証明書のエラーは出なかったのですが、記事を見返すとこのときはHTTP接続を使っていました。実際ABAPサーバとCloud Connectorは同一コンテナ内で十分セキュアなので、HTTPでもよかったのかもしれません。それでも、HTTPS接続のときに必要な設定を知れたのは収穫でした。