Vapor Cloud紹介☁️☁️☁️

# Vapor cloudとは？

Vapor cloudはVaporチームが提供するVaporホスティングサービス。


```

Vapor　=　MacOSとUbuntuで動作するSwiftのWebフレームワーク　+　Vaporが提供するすべてのパッケージ
```

Vaporの目標は、Web開発をより速く、より安全、より<b>簡単</b>にすること。 WebフレームワークとしてのVaporはこの目標を達成しているが、ホスティングはまた難しい部分である。そのために、開発されたのはVapor Cloud。
目標は、ホスティングを<b>簡単</b>にすること。
Vapor Toolbox CLIを使えるため、1つのコマンド（```vapor cloud deploy```）だけで、アプリケーションを☁️にデプロイできる。

## Versions
β版リリース　2017年7月
Vapor Cloud 1.0リリース　2017年10月

## Features
* ウェブ、API、またはリアルタイムアプリをワンクリックでデプロイ
* MySQL、PostgreSQL、MongoDB＆AWS Auroraでデータを保存可能
* 数秒でサーバー数やゾーン設定を変更
* リクエスト数、レスポンス時間、CPU、メモリ使用量などで、アプリケーションのパフォーマンスを把握
* 複数人（組織、チーム）でのプロジェクト開発で使用可
* Redisキャッシュをワンクリックで追加して、アプリケーションを高速化
* 自動設定されたAWS S3にファイルを保存
* ゼロダウンタイム
* CDN

## Pricing
無料枠から、Hobby(\$6), Small(\$30), Medium($65)、小刻みで選択しやすそう。
 <b>無料枠　20,000リクエスト/1ヶ月</b>✨
詳細は<a href="https://vapor.cloud/pricing.html">こちら</a>
☣️<sup>支払い情報（クレジットカードなど）入力した場合、20,000まで使える。
支払い情報未入力の場合、2,000リクエスト/1ヶ月</sup>

## やってみよう

Vapor projectがある人は、projectのところで```vapor cloud deploy```を実行して、
次々から出て来る質問に答えて行くだけ!👏👏👏
<img width="788" alt="Screen Shot 2018-12-10 at 18.08.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/1ef49816-4146-f73b-d089-311c49c6cef0.png">

### Step By Step
##### 1. Vaporをインストール（ここのStep by stepは省略）
##### 2. ```vapor cloud --help``` でVapor Toolboxが正しくインストールされているか確認
<img width="747" alt="Screen Shot 2018-12-10 at 10.14.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/914a2b44-948a-a5c0-a2a7-0021a5f9692e.png">

##### 3. ```vapor cloud create org```で組織(Organization)作成　
<img width="284" alt="Screen Shot 2018-12-10 at 18.58.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/4fa0df7a-7142-2e06-469b-25bb5323616c.png">
自分だけのテストなので、適当にMeと名付け。
<img width="241" alt="Screen Shot 2018-12-10 at 18.57.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/4aaf6a0c-b87d-bba2-d876-955c1483f0a6.png">
こんな感じで聞かれることに答えて行くだけで完了する。  
同じように、```vapor cloud create proj```コマンドで質問に答える感じでprojectも作成できる。
プロジェクトに対して、一緒に開発する人を招待でき、ユーザごとに権限を設定可能。チーム単位でプロジェクトに招待することもできる。

プロジェクト内で、アプリケーション単位でに異なる権限を割り当てることはできまない。ただし、作成可能なプロジェクト数に制限がない。（大きい組織だと、管理するのが面倒になりそう🤔）

組織とプロジェクト設定は<a href="https://dashboard.vapor.cloud/organizations">web</a>でもできる！
<img width="1285" alt="スクリーンショット 2018-12-10 23.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/091c1978-b8f8-2b16-5255-f0ef8edcdd45.png">

##### 4.　デプロイ
デプロイするための、事前準備はprojectをGitにあげること。なので、Gitに上がっているSwiftプロジェクトを用意しよう。  
今回は公式の<a href=https://docs.vapor.codes/3.0/getting-started/hello-world/>Hello world</a>で適当に。ほとんど```vapor new firstVaporCloud```だけ。
<img width="825" alt="Screen Shot 2018-12-10 at 10.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/fd0b58c8-fe3c-9926-aa24-5aed70373fe1.png">
（かわいい😍、ターミナルがカラフルでみやすいのがvaporの良さの一つ）
書いてある通り、```cd firstVaporCloud```で、ディレクトリに入る。

☣️<sup>一応デプロイ前に、コピーして来たprojectをbuild, runして、動作確認として、localhost:8080にアクセスし、"It works！"と表示されることを確認。</sup>


そして、```vapor cloud deploy```でデプロイ！！！
各アプリケーションは、ホスティング、データベース、キャッシュなど、複数のサービスを持てるので、それぞれの設定に関する質問が↓のように次々から出て来る。
<img width="1431" alt="スクリーンショット 2018-12-11 1.52.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/dae42171-e884-dbe7-4921-e647c44e7de7.png">
<b>Application</b>
Would you like to create an application now?/ アプリケーションを作成しますか?
y/n? y
と答え、アプリケーション名を聞かれるので、今回はfirstAppとした。

次に、slugとよくわからないものについて聞かれる。
<b>Slugとは</b>🐌🐌🐌🧐
例えば、slugに`kaki`を使用している場合、アプリケーションは `https://kaki.vapor.cloud` からアクセスできる。
`develop`のような本番環境以外の環境を作成する場合は、 - 接尾辞を使用して別々の環境にアクセスできる。たとえば、`https://kaki-develop.vapor.cloud`
（牡蠣がおいしい季節ですね😋）

<b>Environment</b>
環境の場合、branch名をいれることが推奨されているので、ブランチ名と同じくmaster。

<b>Database</b>
データベースも接続可。今回はnと答え、スキップ。
追加したい場合、```vapor cloud create db```

<b>Replicas</b>
Replica選択の質問では、
1: Free
2: Hobby
...
のように番号と<a href="https://vapor.cloud/pricing.html">値段表</a>でみた単語がセットで出て来る。今回は無料枠利用したいので`1`と入力。

Vapor Cloudでは複数のレプリカにアプリケーションをデプロイすることで、高可用性と高スループットを実現できる。ただし、フリーサイズのレプリカでは、レプリカ数は0または1に制限されている。レプリカ数を`0`に設定するとアプリケーションはオフラインになり、`1`に設定するとオンラインになる。

<b>Branch</b>
Gitブランチ名。

<b>Build</b>
1: Incremental
ビルドを単純に実行。依存関係は更新されない。この中で一番速い。

2: Update
ビルドを実行する前にパッケージアップデートを実行。このオプションはIncrementalよりわずかに遅くなる。Package.swiftファイルを変更した場合は必要。

3: Clean
すべてのビルドメタデータ（.buildフォルダなど）を削除してから、ビルドを実行。このオプションは、UpdateやIncrementalよりもかなり長い時間がかかるが、ビルドの問題を修正することがある。

今回は1を選択。<br>
##### 5. これで、一通り設定完了し、数分待つと↓
<img width="788" alt="Screen Shot 2018-12-10 at 18.08.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/f2eb39bd-f7fb-1a48-f7f9-9c601d290c48.png">

##### 6. `https://firstapp-master.vapor.cloud/` にアクセスすると↓
<img width="922" alt="Screen Shot 2018-12-10 at 18.09.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/323066/427dd10b-0ffe-7892-09e4-11ec6a199858.png">
🎉🎉🎉
## 最後に

Vapor cloudについて日本語の検索結果が少なかったので、少し事細かく説明するようにしてみました。

* Vaporと相性いい
* ボタン押して操作すると言うよりは、コマンドを打って、既に設定のものは反映され、未設定のものについて質問をしてくるようなインタラクティブな感じが使いやすい
* Free枠が月２万リクエストまでということで始めやすい
* 複数のreplicaを一つのアプリケーションに設定可能 x replicaの種類が多い(5つ)　=　自由度が高い