stoplight/prismを使用して、Swagger-ui上でモックサーバーを動かす方法(AWS/EC2・Docker利用)

[1]:https://qiita.com/wadakatu/items/c1995b392e7900c0ccd7
[2]:https://qiita.com/wadakatu/items/5f40a7c6f992c82e5fb3
[3]:https://qiita.com/wadakatu/items/61516175f3e283a6e612
[4]:https://qiita.com/wadakatu/items/000537a5a6f54a1782a3
[5]:https://hub.docker.com/r/stoplight/prism
## 前提条件
1. AWS/EC2インスタンスを作成済・SSH接続が可能
2. nginxをEC2にインストール済
3. swagger-uiが利用可能(Docker利用)
4. swagger-uiに任意のyamlファイルを読み込み済

１がまだの方。
　・[AWS/EC2インスタンス作成][1]
２がまだの方。
　・[nginxの設定][2]
３がまだの方。
　・[swagger-uiの設定][3]
４がまだの方。
　・[swagger-uiに任意ファイルを読み込ませる設定][4]

以上を参考に、まず前提条件を全て満たすようにしてください。

## 1.EC2インスタンスにSSH接続する

```sshLogin.ec2
ssh -i keypair_hogehoge.pem ec2-user@******
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/3049b1cc-e67f-4443-8b57-11ea9f4d8178.png)

上記のような画像が表示されれば、**SSH接続成功**です。

## 2.dockerイメージをpull

SSH接続後に、[stoplight/prism][5]のdockerイメージをpullする

```prismPull.docker
sudo docker pull stoplight/prism:3
```

![スクリーンショット 2020-12-12 10.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/36f9138f-e5a2-c87b-f172-417bb51a958c.png)

上記画像のようになれば、無事pull成功です。

## 3.nginx.confにモックサーバーのルーティングを設定する

### nginx.confを開く

```
sudo vim /etc/nginx/nginx.conf
```

### nginx.confに追記する

```vim
server {
        listen       80;
        listen       [::]:80;
        server_name  _;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

　　　　　//swagger-editorの設定
        location /swagger-editor/docker/ {
          proxy_pass http://localhost:8000/;
          proxy_redirect off;
        }
　　　　　
　　　　　//swagger-uiの設定
        location /swagger-ui/docker/ {
          proxy_pass http://localhost:8001/;
          proxy_redirect off;
        }

　　　　　//モックサーバーの設定(今回はこちらを設定する)
        location /swagger-mock/docker/ {
          proxy_pass http://localhost:4010/;
          proxy_redirect off;
        }

```

## 4.yamlファイルにモックサーバーを追記する

今回は、[こちら][4]で設定したyamlファイルを使用します。
そして、**servers**のところにモックサーバーを追加します。

```vim
servers:
  - url: http://petstore.swagger.io/
  //モックサーバー用設定
  - url: http://EC2インスタンスのIPアドレス/swagger-mock/docker/
```

**EC2インスタンスのIPアドレス**の部分は、適切な値に変更してください。

## 5.モックサーバーを起動する

モックサーバーを起動する際に、**任意のyamlファイル**を指定する必要があります。

今回の設定
コンテナ名：prism
yamlファイルを保存しているディレクトリ: /home/ec2-user/www
yamlファイル: pet.yaml

```prism.docker
sudo docker run --name prism -it -p 4010:4010 -v /home/ec2-user/www:/tmp stoplight/prism:3 mock -h 0.0.0.0 /tmp/pet.yaml
```

コンテナ名指定(任意)

```containerName.docker
--name hogehoge
```

yamlファイル指定(必須)

```yaml.docker
mock -h 0.0.0.0 /tmp/pokemon.yaml
```

以下のように、ターミナルに表示されれば、OKです。

```terminal
[ec2-user@ip-00-0-0-00 ~]$ sudo docker run --name prism -it -p 4010:4010 -v /home/ec2-user/www:/tmp stoplight/prism:3 mock -h 0.0.0.0 /tmp/pet.yaml
[3:37:33 AM] › [CLI] …  awaiting  Starting Prism…
[3:37:34 AM] › [CLI] ℹ  info      GET        http://0.0.0.0:4010/pets?limit=60
[3:37:34 AM] › [CLI] ▶  start     Prism is listening on http://0.0.0.0:4010
```

## 6.swagger-uiにアクセスし、モックサーバーを試す

### 6a.モックサーバーを選択する
swagger-uiにアクセスして、適切なサーバーを選択する

![スクリーンショット 2020-12-19 13.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/5465ce29-2b88-d12d-9c5b-f288fa42f1be.png)

### 6b.URLのタブを開き、[Try it out]ボタンを押す

![スクリーンショット 2020-12-19 13.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/5b34696e-7534-5d43-eeae-2d924f5ce53f.png)

### 6c.[execute]ボタンを押す

　![スクリーンショット 2020-12-19 14.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/19effd5e-ec1b-af06-4082-a4705de213d0.png)

### 6d.結果を確認する

下記のように、yamlファイルに設定した成功レスポンスが結果として表示されれば、OK

![スクリーンショット 2020-12-19 14.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/af4f4dd3-4036-6155-d797-084f90a7b21b.png)

ターミナルにも下記のように表示されているはずです。

```terminal
[5:55:41 AM] › [HTTP SERVER] get /pets ℹ  info      Request received
[5:55:41 AM] ›     [NEGOTIATOR] ℹ  info      Request contains an accept header: application/json
[5:55:41 AM] ›     [VALIDATOR] ✔  success   The request passed the validation rules. Looking for the best response
[5:55:41 AM] ›     [NEGOTIATOR] ✔  success   Found a compatible content for application/json
[5:55:41 AM] ›     [NEGOTIATOR] ✔  success   Responding with the requested status code 200
```

## その他の設定

### モックサーバーをバックグラウンドで動かす方法

もし、ターミナル上で[Try it out]→[Excute]の結果を確認しなくても良い場合は、モックサーバーをバックグラウンドで動かすことも可能です。

フォアグラウンドver

```terminal
sudo docker run --name prism -it -p 4010:4010 -v /home/ec2-user/www:/tmp stoplight/prism:3 mock -h 0.0.0.0 /tmp/pokemon.yaml
```

バックグラウンドver

```terminal
sudo docker run --name prism -it -d -p 4010:4010 -v /home/ec2-user/www:/tmp stoplight/prism:3 mock -h 0.0.0.0 /tmp/pet.yaml
```

```
-d
```

このオプションがつくと、各コンテナをバックグラウンドで起動させることができます。

## エラー対処

```terminal
docker: Error response from daemon: Conflict. The container name "/prism" is already in use by container "768393267a3839c7db21028daeb8f5a39b67766f994615de3e068ea7f819c500". You have to remove (or rename) that container to be able to reuse that name.
```

**docker run**コマンドを入力後に、上記のエラーが出た場合、コンテナ名が被っていることが原因です。
下記のコマンドを入力して、コンテナを削除しましょう。

```terminal
sudo docker rm 任意のコンテナ名
```

コンテナ削除する前に、コンテナを停止することを忘れないようにしましょう。

```terminal
sudo docker stop 任意のコンテナ名
```

## 最後に

以上が、[stoplight/prism][5]を使用したモックサーバーの構築方法です。

不明点、質問などがあればコメント欄にお願い致します。