RHOAM を使って外向きと内向きのAPIをデプロイする

# はじめに

RHOAM を使って、外向き(Internet 向き)のAPI と内向き (Private Network向き) の2種類の APIをホストする環境を作成してみます。

ROHAM の導入自体は難しくはないのですが、以下の記事の環境が完成しているのが前提となるため、初心者向けの記事にはなっていなのでご注意下さい。

<a href="https://qiita.com/Yuhkih/items/caeefdefc08f214fdafb" target="_blank" >ROSA上にインターネット公開/非公開の2種類のアプリを作成する</a>

RHOAM 導入前の構成として以下の構成ができています。の部分を、外向けのドメインである

![Copy of ROSA Basic 2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/de17009b-1fd5-fd8e-7e0d-28ee616414f6.png)

# RHOAM の導入

https://console.cloud.com にアクセスして、RHOAM をインストールしたいクラスターを選択します。その後「Add-on」のタブに移動します。

RHOAM の導入には Worker Node が最低でも11vCPU が必要になります。
前提条件を満たしてないと以下のような表示になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0211b3e7-ab94-cc56-a9b1-1643c3f4f1c6.png)

理論上は、4vCPU の Worker Node が3本あれば、条件を満たす事ができますが、既に使用さている分もあるので 4vCPU x 4 本程度の Worker Node が必要になります。足りない場合は、Worker Node を増やして下さい。

前提条件を満たしている場合、以下の様にアイコンがクリックすると「Install」ボタンが出てくるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/b477dadb-f9c6-37f0-ef8e-f90800894273.png)

はじめの CIDR 部分で指定した VPCがRHOAMで使用するRDB等が配置される VPCとして作成されます。既存のVPCと被ってない必要があります。特に問題が無ければデフォルトをそのまま使用しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/a29b5610-ca85-ebc2-3b02-c1f523d88686.png)

後は「Install」ボタンを押して25~30 分ほど待つと Install が完了すると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/ccae51a4-2784-be1e-843e-8ca7041a7d93.png)

以上で RHOAM のインストールは完了です。

# SSH Port Forward の設定を行う

RHOAM の構成は Web Browser を通して行います。RHOAM のコンソールの URLは、OpenShift の Web Console と同じ `*`.**app**.`[cluster domain]` で提供されます。

ベースとして使用している構成は、セキュリティを考えた結果、`*`.**app**.`[cluster domain]`は、インターネットに公開されてない構成になっているため、Web Console は、Private Network に配置された踏み台 (bastion 2 ) からアクセスする必要があります。

ここでは、SSH の Port Forward を設定する事で、2つの踏み台 (bastion1, bastion2) 経由で Web Browser コンソールを使用する設定を行います。

**ターミナル1**

ローカルの 10022 ポートへのアクセスが、PUBLIC_BASTION (bastion 1) の接続を通して、PRIVATE_BASTION (bastion 2) の 22 ポートにフォワードされるように設定します。

```
$ export PUBLIC_BASTION=3.231.221.111  # bastion 1
$ export PRIVATE_BASTION=10.8.63.146   # bastion 2
$ ssh -i BastionKeyPair.pem -p 22 ec2-user@$PUBLIC_BASTION -L 10022:$PRIVATE_BASTION:22
```

bastion1への接続が確立するので、そのままターミナルを閉じずに放置しておきます。

**ターミナル2**

ローカルの 10044 ポートへのアクセスが、ローカルの10022への接続 (= PRIVATE_BASTIONへの接続) を通して、その先に( bastion2 の先に) にフォワードされるように設定します。

```
$ ssh -i BastionKeyPair.pem -p 10022 ec2-user@localhost -D 10044
```

bastion2への接続が確立するので、そのままターミナルを閉じずに放置しておきます。

**ローカルの /etc/hosts ファイルの設定**

OpenShift Console の ホスト名とそれに紐付いた Private IPアドレスを登録します。
もう一つ `console-openshift-console` の頭の部分を `oauth-openshift` に変更したドメイン名も同じ IPで登録してください。

```
10.7.35.213    console-openshift-console.apps.rosa-cluster.70d7.p1.openshiftapps.com  
10.7.35.213    oauth-openshift.apps.rosa-cluster.70d7.p1.openshiftapps.com  
```

実際のログインでは、OpenShift の Console にアクセスした後、OAuth サーバーにリダイレクトされるので、両方の名前が解決できるようになっている必要があります。`oauth-openshift...` は、OpenShift の OAuth サーバーです。


**Firefox の socks 設定**

「Network Settings」で以下のように設定します。

- localhost の 10044 ポート を Proxy 先として指定します。
- Proxy DNS when using SOCKS v5 にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/37ef7ee2-0b63-1375-b9a8-195cd079fb3a.png)

**OpenShift Console への接続**

以上の設定で https://console-openshift-console.apps.rosa-cluster.70d7.p1.openshiftapps.com へブラウザ経由でアクセスできるようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/82c37f71-42bd-8a10-23f2-fc1be67b3890.png)


# 環境のおさらい

この環境は2つの Ingress がデプロイされています。

```
$ rosa list ingresses -c rosa-cluster
ID    APPLICATION ROUTER                                         PRIVATE    DEFAULT    ROUTE SELECTORS
z9l9  https://apps.rosa-cluster.70d7.p1.openshiftapps.com       yes        yes
o7h4  https://apps2.rosa-cluster.70d7.p1.openshiftapps.com      no         no         access=external
$
```


**apps**.rosa-cluster.70d7.p1.openshiftapps.com は、Private Network のみから使用できるドメインです。Private Network 内のIPを持っているので、インターネットからはアクセスできません。

```
$ dig +short test.apps.rosa-cluster.70d7.p1.openshiftapps.com
10.7.16.163    # Private Network IP  
10.7.35.213    # Prvaite Netowrk IP

※ 10.0.0.0-10.255.255.255 は RFC1918 で予約された Private 向け IPのレンジです。
```


**apps2**.rosa-cluster.70d7.p1.openshiftapps.com は、インターネットに向いた Elastic IPを持ったドメインです。Private Network からもインターネットに抜ける事ができればアクセス可能です。また、Route Selector が設定されており、Route に明示的に `access=external` とラベルを付けたものだけを処理する事が可能です。

```
$ dig +short test.apps2.rosa-cluster.70d7.p1.openshiftapps.com
54.249.117.179     # Public Metwork IP
54.249.243.234     # Public Network IP
$ 
```

# デモ用のバックエンドのアプリをデプロイする

RHOAM を使用するには、APIを「被せる」ためのバックエンドのアプリが必要になります。
ここでは2つのデモ用のバックエンドアプリをデプロイします。

私個人が作成したコンテナで docker hub に公開しているので誰でもダウンロードできます。ご自身でビルドしたい方は、[こちら](https://github.com/yuhkih/hello-api1)と[こちら](https://github.com/yuhkih/hello-api2)に Dockerfile が置いてあります。


## Backend Application 1 のデプロイ

```
$ oc new-project backend-sample-1
$ oc new-app --image=docker.io/yuhkih/hello-api1:0.3
$ oc get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
hello-api1   ClusterIP   172.30.22.41   <none>        8080/TCP   53s
```

Route を作ってサービスを公開します。

```
$ oc create route edge --service=hello-api1
route.route.openshift.io/hello-api1 created
$ oc get route
NAME         HOST/PORT                                                                  PATH   SERVICES     PORT     
  TERMINATION   WILDCARD
hello-api1   hello-api1-backend-sample-1.apps.rosa-cluster.70d7.p1.openshiftapps.com          hello-api1   8080-tcp 
  edge          None
$
```

このアプリが使用している `apps.rosa-cluster.70d7.p1.openshiftapps.com` は内向けドメインなので、Private Network からのみアクセス可能です。

アクセスできる事を確認します。

```
$ curl https://hello-api1-backend-sample-1.apps.rosa-cluster.70d7.p1.openshiftapps.com
{ "Message": "Hello API!" }
{ "access": "External" }   # 外部向けのAPI向けのバックエンドとして使用する事を想定して External とメッセージがでるようにしています。
$ 

# ドメイン名には Private アドレスを返す CLB が紐付いているのでインターネットからはアクセスできない。
$ dig +short hello-api1-backend-sample-1.apps.rosa-cluster.70d7.p1.openshiftapps.com
10.7.35.213
10.7.16.163
$
```

## Backend Application 2 のデプロイ

```
[ec2-user@ip-10-8-63-146 ~]$ oc new-project  backend-sample-2
[ec2-user@ip-10-8-63-146 ~]$ oc new-app --image=docker.io/yuhkih/hello-api2:0.3

[ec2-user@ip-10-8-63-146 ~]$ oc get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
hello-api2   ClusterIP   172.30.237.164   <none>        8080/TCP   29s
[ec2-user@ip-10-8-63-146 ~]$
```


Route を作ってサービスを公開します。

```
$ oc create route edge --service=hello-api2
route.route.openshift.io/hello-api2 created
$ oc get route
NAME         HOST/PORT                                                                  PATH   SERVICES     PORT     
  TERMINATION   WILDCARD
hello-api2   hello-api2-backend-sample-2.apps.rosa-cluster.70d7.p1.openshiftapps.com          hello-api2   8080-tcp 
  edge          None
$
```

このアプリが使用している `apps.rosa-cluster.70d7.p1.openshiftapps.com` は内向けドメインなので、Private Network からのみアクセス可能です。

アクセスできる事を確認します。

```
$ curl https://hello-api2-backend-sample-2.apps.rosa-cluster.70d7.p1.openshiftapps.com
{ "Message": "Hello API!" }
{ "access": "Internal" }  # 内部向けのAPI向けのバックエンドとして使用する事を想定して Internal とメッセージがでるようにしています。
$

# ドメイン名には Private アドレスを返す CLB が紐付いているのでインターネットからはアクセスできない。
$ dig +short hello-api2-backend-sample-2.apps.rosa-cluster.70d7.p1.openshiftapps.com
10.7.35.213
10.7.16.163
[ec2-user@ip-10-8-63-146 ~]$
```

# APIの作成

## RHOAM コンソールへのアクセス

この環境は踏み台を前提にしているので、RHOAM のコンソールの URL に直接アクセスできません。以下をローカル端末の /etc/hosts に登録します。3scale の Console のドメイン名と、SSO用の Red Hat SSO の Console のドメイン名です。

```
10.7.35.213  3scale-admin.apps.rosa-cluster.70d7.p1.openshiftapps.com   
10.7.35.213  keycloak-edge-redhat-rhoam-rhsso.apps.rosa-cluster.70d7.p1.openshiftapps.com
```

IPアドレスは、OpenShift Console のアドレスを登録した時と同じです。OpenShfit Console や 3Scale のコンソールは OpenShift のアプリケーションとして OpenShift 上にホストされています。また、`apps.rosa-cluster.70d7.p1.openshiftapps.com` の部分は ROSA 環境毎に異なるのでご自身の環境のものを使用して下さい。


RHOAMのコンソールからAPIを作成します。OpenShift Web Console にログインして、右上のタイルから「API Management」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/c4c575e7-541d-e871-68b3-475464c2a77c.png)


初回はチュートリアル画面が出て、簡単なAPIが作成されます。この解説ではこのチュートリアルは飛ばしますが、API Management の概念がわかり易く説明されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0fdb945d-6cd0-f858-f4ed-92a317dfea61.png)

RHOAM のコンソールにログインできたら以下のような Overview 画面が見えるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/d1379724-76f2-c01c-5c68-3ba9b021b1c6.png)

## Backend の登録

左上のメニューから「Backend」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/c0678eb8-808a-1f33-5662-23b4c3594bd2.png)

「Create Backend」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/4508e6a1-3a2e-75d6-09fb-adb155944df2.png)

Name は `backend-sample-1`
System name は、`external-system`
Private Base URL は、先ほど作成した Backend Application 1 のURL `https://hello-api1-backend-sample-1.apps.rosa-cluster.70d7.p1.openshiftapps.com` を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/d69b5773-a0c4-e148-0fe3-053cbd4686d5.png)

「Backend」のトップページに戻って、同様にしてもう一つの Backend 用に作成した Sample APplicationを登録します。「Create Backend」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/2d7c0bbb-e519-51e6-d7e5-66c8d0ef5674.png)

Name は `backend-sample-2`
System name は、`internal-system`
Private Base URL は、先ほど作成した Backend Application 1 のURL `https://hello-api1-backend-sample-2.apps.rosa-cluster.70d7.p1.openshiftapps.com` を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/861eec35-f2f7-8c0c-a71e-1de5bb019431.png)

「Create Backend」をクリックして完了です。


## 内向きのAPIの作成

内向きのAPIの方が簡単なので、内向きのAPIから作成して行きます。


### Product を作成

左上のメニューから「Prodcuts」を選んで「Create Prodcut」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/5cc86658-0811-5114-8002-fbe5f16e71fd.png)

Name : `intenral-api-1`
System name : `intenrnal-system` 
と入力して「Create Prodcut」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/69f2e014-c64b-e788-c392-0dfc10edfa2d.png)

### Product に Backend を登録

「Integration」- 「Backends」に移動して、この Product の Backend を追加します。「Add Backend」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/963e6616-e9f7-e9c2-4364-9eef888ed3f7.png)

既に登録済みの「backend-sample-2」を選択して「Add to Product」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/b3a95ffc-9456-07b4-8a7b-a9dfe7572a49.png)

### Application Plan を作成

「Application」-「Application Plans」を選択し、「Create Application plan」をクリックします。

Name: `internal-api1-application-plan`
System name : `internal-system` 

を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/626caf64-2f6e-0680-c847-e4940f35c7df.png)
「Create Application plan」をクリックします。

### Application を作成

「Applications」-「Listing」を選択し、「Create Application」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/7ace515c-6d31-718a-2798-4cd73ead2989.png)

Account は、`Developer` を選びます。
Application plan は、先ほど作成した `internal-api-1-application-plan` を選択します。
Name は `internal-application-1`
Description は、`test` と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/5d0e59dc-febb-cfa9-487b-90e651227d71.png)
入力が完了したら「Create application」をクリックします。

ここで画面が飛んでしまうので、再び、画面左上から「Products」を選んで...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/bf4ba9d2-3f8e-d391-c7be-dc2bbe84275e.png)
作成した「internal-api-1」を再度クリックして元の画面に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/726f2761-a1ea-ab44-4560-9603f1783eda.png)


### API のデプロイ

「Integration」-「Configuraiton」を選択します。
青い「Promote v.1 to Staging APIcast」ボタンをクリックします。これで Stagingドメインで APIが公開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/2f4cb40d-0cb3-ce1e-f37b-2f7b8bfc165f.png)

Statging API Cast の項目の「Example curl for testing」の部分をコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/d5f52038-7902-35af-2416-1e6edb52618d.png)


このAPIはこのROSA 環境のdefault である内向けのドメインを使っているので、Private Network 上にある Bastion サーバー (bastion 2) から API アクセスをテストします。

```
$ curl https://hello-api2-backend-sample-2.apps.rosa-cluster.70d7.p1.openshiftapps.com
{ "Message": "Hello API!" }
{ "access": "Internal" }
$
```

問題が無ければ、「 Promote v.1 to Production APIcast」をクリックして、さらに Staging を Production に Promotion させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/bd78a9af-5654-b362-f75a-e56da360568d.png)

Production APIcast のボックスから同じように URL をコピーします。今度は Staging の部分から user_key の部分をコピーして、足してあげてテストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/8ad8cbe6-fc1b-8965-f974-63ac6c43e260.png)

curl で Production ドメインのURLにアクセスしてみます。アクセスは、Private Network 環境の Bastion サーバー (bastion2) から行います。

```
$ curl https://insternal-system-3scale-apicast-production.apps.rosa-cluster.70d7.p1.openshiftapps.com/?user_key=668a746c3211db09b5f189a2a01ee6e1
{ "Message": "Hello API!" }
{ "access": "Internal" }
$ 
```

問題なくアクセスできました。
これで内向けのAPIの作成は完了です。

## 外向きのAPIの作成

今度は外向きのAPIを作成します。

### Product を作成

左上から「Prodcuts」を選んで、「Create Product」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/dbaa62a1-adbf-5638-b8ec-6948f9ac3bbf.png)

Name : `external-api-1` 
system name : `external-system`
を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/b9e6653e-3af8-d036-9395-e5949a267c32.png)
入力が終わったら「Create Product」をクリックします。

### Product に Backend を登録

「Integration」- 「Backends」に移動して Backend を追加します。「Add Backend」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/963e6616-e9f7-e9c2-4364-9eef888ed3f7.png)

既に追加している「backend-sample-1」を選択して「Add to Product」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/258c60ab-6903-c56e-2196-d2c25a1a1390.png)

### Application Plan を作成

「Application」-「Application Plans」を選択し、「Create Application plan」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/eb50ca85-f4f3-9285-25f4-d6fb3d05c8f0.png)

「Create Application plan」をクリックします。
Name : `external-api-1-application-plan` 
System name : `external-system`
を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/bf86a453-bf87-bac7-5c2b-8881185c7439.png)
入力が完了したら「Create Application Plan」をクリックします。

### Application を作成

「Applications」-「Listing」を選択し、「Create Application」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/7ace515c-6d31-718a-2798-4cd73ead2989.png)

「Create Application」をクリックします。
Account は、`Developer` を選択します。
Application Plan は、先ほど作成した `external-api-1-application-plan` を選択します。
Name は、 `external-applicaiton-1`
Descrpiton は、`test` と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f11751ea-01e1-e369-77fd-8e7f60d88373.png)
入力が完了したら「Create application」をクリックします。

ここで画面が飛んでしまうので、画面上から再び「Products」を選んで...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/bf4ba9d2-3f8e-d391-c7be-dc2bbe84275e.png)
作成した「external-api-1」を再度クリックして元の画面に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f7087df3-fcca-74fe-923d-55e41b1ced67.png)

### API のデプロイ

「Integration」-「Configuraiton」を選択します。
「Promote v.1 to Staging APIcast」をクリックして、Staging ドメインで APIを公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/b686d83c-843a-6615-db76-25474163c7f8.png)

これで Staging 環境にAPIがデプロイされました。「Example curl for testing」の部分をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/683819bb-0484-d37f-82f8-f47726bc13bf.png)

このAPIはこのROSA 環境のdefault である内向けのドメインを使って作っているので、Private Network 上にある Bastion サーバー (bastion 2)から API アクセスをテストします。

```
$ curl "https://external-system-3scale-apicast-staging.apps.rosa-cluster.70d7.p1.openshiftapps.com:443/?user_key=6bd2659f32618904eef5c2a686c204bd"
{ "Message": "Hello API!" }
{ "access": "External" }
$ 
```

問題なくアクセスできています。ただし、これは内向きのドメインを使っているのでこれを外向きのドメインに変更します。

### 外向きのドメインに変更する

「Integration」- 「Settings」に移動します。

ここで使用されるドメインが記載されているので、このドメイン名を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/1ce8d992-4017-9a61-30ab-cd1a655f4ce1.png)

この環境での内向けのドメインである `*`.**apps**.`[cluster domain]` の部分を、外向けのドメインである  `*`.**apps2**.`[cluster domain]` に変更します。 (この apps2ドメインはこの環境独自に構成しているもので、apps2が存在し、ドメインが外向きかどうかは構築している環境によって異なります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/1db32ec9-11dc-ff49-2b3e-be3148f5bfee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f46d39a4-6be6-81e3-a93b-595f13d14637.png)
編集が完了したら、画面の一番下にある「Update Product」をクリックして更新します。

この更新により「Integraiton」-「Confiuration」の部分に以下のようなマークが出るはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/757da8ff-d625-4155-168a-803c662f021b.png)

一番上の Promote のボタンの中身が v2 にアップデートされて、押す事ができるようになっているのでクリックします。
これでドメイン名を外向きに変更した API が、Staging ドメインで公開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/668b240c-d0f9-cf60-d5aa-ed511a6baea9.png)

ドメイン名が更新されたURLが生成されています。今度は、外向きのドメイン(**apps2**)を使用したAPIドメインになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0ba38c47-e926-9a2a-20cf-7238d3a2e6bd.png)

### route にラベルを付ける

ROSA 環境に CLIでアクセスできるコンソールに移動して、`redhat-rhoam-3scale` の project に移動します。
ここで、今作成している API の Staging 用と Production 用の Route を探します。ドメイン名から判別が付くと思います。

```
[ec2-user@ip-10-8-63-146 ~]$ oc project redhat-rhoam-3scale
Now using project "redhat-rhoam-3scale" on server "https://api.rosa-cluster.70d7.p1.openshiftapps.com:6443".
[ec2-user@ip-10-8-63-146 ~]$ oc get route
NAME                         HOST/PORT                                                                                 PATH   SERVICES                 PORT      TERMINATION     WILDCARD      
backend                      backend-3scale.apps.rosa-cluster.70d7.p1.openshiftapps.com                                      backend-listener-proxy   http      edge/Allow      None
zync-3scale-api-cszs5        api-3scale-apicast-production.apps.rosa-cluster.70d7.p1.openshiftapps.com                       apicast-production       gateway   edge/Redirect   None
zync-3scale-api-kw4rn        api-3scale-apicast-staging.apps.rosa-cluster.70d7.p1.openshiftapps.com                          apicast-staging          gateway   edge/Redirect   None
zync-3scale-api-pdjls        external-system-3scale-apicast-production.apps2.rosa-cluster.70d7.p1.openshiftapps.com          apicast-production       gateway   edge/Redirect   None
zync-3scale-api-xl5hr        external-system-3scale-apicast-staging.apps2.rosa-cluster.70d7.p1.openshiftapps.com             apicast-staging          gateway   edge/Redirect   None
zync-3scale-master-5fmhs     master.apps.rosa-cluster.70d7.p1.openshiftapps.com                                              system-master            http      edge/Redirect   None
zync-3scale-provider-5f4z4   3scale.apps.rosa-cluster.70d7.p1.openshiftapps.com                                              system-developer         http      edge/Redirect   None
zync-3scale-provider-twnbf   3scale-admin.apps.rosa-cluster.70d7.p1.openshiftapps.com                                        system-provider          http      edge/Redirect   None
[ec2-user@ip-10-8-63-146 ~]$
```

このAPI用の Route に `access=external` のラベルを振ります。Staging 用と Production 用の2つのルートがあるので両方にラベルを付けます。
この環境では、Security 上の利用で、外向きのドメインを取り扱う Ingress は、このラベルが貼られた Route しか処理しません。

```
$ oc label route zync-3scale-api-pdjls  access=external
$ oc label route zync-3scale-api-xl5hr  access=external
```


「Example curl for testing」の部分をコピーして curl で、インターネット上からアクセスしてみます。

```
$ curl "https://external-system-3scale-apicast-staging.apps2.rosa-cluster.70d7.p1.openshiftapps.com:443/?user_key=6bd2659f32618904eef5c2a686c204bd"
{ "Message": "Hello API!" }
{ "access": "External" }   
$ 
```

無事にアクセスできました。

特に問題が無ければ、Promete の項目にある「Promote v.2 to Production APIcast」をクリックして、 Production に Promotion させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f27c4bbf-3092-8000-a352-2c2c670e5cb2.png)

「Production APIcast」の URLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/9c36ac18-9d8c-a089-edd0-9ea347ec3f92.png)

user_key の部分は Staging の「Example curl for testing」の部分から、コピペして URLを作成します。
インターネット上からアクセスできるはずです。

```
$ curl  https://external-system-3scale-apicast-production.apps2.rosa-cluster.70d7.p1.openshiftapps.com:443?user_key=6bd2659f32618904eef5c2a686c204bd
{ "Message": "Hello API!" }
{ "access": "External" }   
$ 
```

無事にアクセスできました。

# まとめ

ここで作成したAPIは次の二つです。

内向けのAPI。Private Network からのみアクセス可能です。

```
$ curl https://insternal-system-3scale-apicast-production.apps.rosa-cluster.70d7.p1.openshiftapps.com/?user_key=668a746c3211db09b5f189a2a01ee6e1
{ "Message": "Hello API!" }
{ "access": "Internal" }
$ 
```


外向けのAPI。インターネットからアクセス可能です。

```
$ curl  https://external-system-3scale-apicast-production.apps2.rosa-cluster.70d7.p1.openshiftapps.com:443?user_key=6bd2659f32618904eef5c2a686c204bd
{ "Message": "Hello API!" }
{ "access": "External" }   
$ 
```