AWS上でPaaSっぽくDockerアプリケーションを動かせるConvoxというサービスを触ってみた

## はじめに

最近Dockerで楽にアプリケーション運用できる技術があるかを探しているのですが、その一環で、<a href="https://convox.com" target="_blank" rel="nofollow noopener">Convox</a>というサービスを見つけました。

今回は、Convoxを使って、サンプルのRailsアプリケーションを動作させるところまで試してみようと思います。

## Convoxについて

### 概要

ざっくり説明すると、<a href="https://convox.com" target="_blank" rel="nofollow noopener">Convox</a>とはAWS上でDockerアプリケーションを稼働させるためのPaaSのようなサービスです。<a href="https://aws.amazon.com/jp/what-are-containers/partners/" target="_blank" rel="nofollow noopener">Container Partners - Amazon Web Services (AWS)</a>にも登録されています。

Convoxは、Dockerで構築されたアプリケーションをAWS上で稼働させるために最低限必要なAWSリソース(ネットワークやALB、ECS、RDS、IAM、etc)などを「Rack」というまとまりでCloudFormation経由で構築してくれます。

Rack構築後は、開発者はCLIで```convox deploy ```といったデプロイコマンドを実行するだけで、アプリケーションがデプロイ出来るようになります。

またGUIのダッシュボードも用意されていて、複数のアプリケーションを稼働させたときも管理しやすい形になっています。

Convoxの利用イメージはvimeoにアップされていますので併せてご確認ください。

<a href="https://vimeo.com/190645705" target="_blank" rel="nofollow noopener">Convox Developer Experience on Vimeo</a>

### Rackについて

ConboxにおけるRackとは、アプリケーションをデプロイするために必要なプラットフォームのことを指します。

https://convox.com/docs/rack/

上記ドキュメントに詳しく説明されていますが、内容について意訳してみます。

> Convox Rack is an open source deployment platform that is installed into your AWS account. A Rack creates and manages all of the underlying infrastructure needed to run and monitor your applications. A Rack is the unit of network isolation – applications and services on a Rack can only communicate with other applications and services on the same Rack.

> (意訳) Convox Rackとは、AWSアカウントにインストールされたオープンソースのデプロイプラットフォームです。Rackはアプリケーションの稼働・監視に必要な基礎となる全ての基盤を構築・管理します。Rackはネットワーク的に独立した - Rack上のアプリケーションやサービスは同じRack上にある別アプリケーションやサービスとのみ通信出来る - ユニットです。

オープンソースということで、Rackを構築する仕組みはGithub上に公開されています。

https://github.com/convox/rack

Rackの構成図もドキュメントに載っています。ConvoxのCLIからはAPI Gateway経由でRackと通信し、アプリケーションはELB経由でインターネットから公開される形になっているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/050b4ef0-806f-e17f-c288-c30925613ea9.png)

Image: https://convox.com/docs/rack/

### Convoxの費用

監査ログ保持期間やサポート対応の厚さで費用が変わってくるようです。

* Developer: 無料(1ユーザーのみ)
* Basic: $59/user
* Pro: $129/user
* Enterprise: 要相談

参考：<a href="https://convox.com/pricing" target="_blank" rel="nofollow noopener">Convox Pricing</a>

## 検証の記録

前置きが長くなってしまいましたが、今回はConvoxにアカウント登録して、サンプルのRailsアプリケーションを動作させるところまで試してみようと思います。

### 検証の前提

以下の手順は、AWSアカウントがあることを前提にします。

またこちらの手順を一通りやると、CloudFormation経由でAWSのリソースを幾つか立ち上げることになるため、**多少コストがかかると思います。**

検証後すぐにStackを削除すれば数ドル程度になると思いますので、課金対応は忘れずにお願いします。

### 検証の進め方

下記ドキュメントに載っている手順に沿って検証を進めます。

https://convox.com/docs/getting-started/

### 検証の手順

#### 1. Convoxアカウント登録

まず下記URLからアカウント登録します。登録したらConvoxのダッシュボードにアクセスします。

https://console.convox.com/grid/signup

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/a3a64031-c1f7-6465-cb94-934f136859a1.png)

#### 2. Create Organization

まずOrganizationを作成します。Organizationは複数のRackを包含する概念というイメージです。

[Create Organization]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/cc63a960-3a53-9e45-2e68-dd8651ac44e1.png)

Organization名を入力し、[Create]をクリックして作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/e4704881-4bcb-6710-51d9-ad372efc845b.png)

#### 3. Connect an AWS account

次にConvoxとAWSアカウントを連携します。[Connect an AWS account]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/9e35f7a8-dbf7-0b83-84e1-1eef6caeb021.png)

[AWS Integration]画面に移ります。ここでいずれかの方法を用いて、ConvoxとAWSアカウント連携のためのIAMRoleを作成します。

* 1度だけ使うAccessKeyを登録し、IAMRoleを作成
* AWS CLI経由でIAMRoleを作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/95a92bc2-8cb8-4902-171e-c3c201ed450b.png)

AWS CLI経由で作成するほうがセキュアだと思いますが、ここでは手順簡略化のため、AccessKeyの方法を取りました。

**※作成後、ここで利用したAWSのAccessKeyは利用不可ないしは削除しておくのを忘れないようにしましょう！！**

作成されるIAMRoleで利用されるIAMポリシーを見てみるとこんな感じでした。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:*"
            ],
            "Resource": [
                "arn:aws:iam::*:instance-profile/convox/*",
                "arn:aws:iam::*:policy/convox/*",
                "arn:aws:iam::*:role/convox/*",
                "arn:aws:iam::*:user/convox/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetServerCertificate",
                "iam:ListServerCertificates",
                "iam:UploadServerCertificate"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

#### 4. Launch a private PaaS

Dockerによるアプリケーションを稼働させるための基盤となる、Rackを作成します。
[Launch a private PaaS]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/d4b1f683-2c07-109d-f89e-fba804a57909.png)

すると[Install New Rack]画面に移るので、フォームに必要な情報を入力していきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/94609f2f-af7f-2a0b-f6d3-ee2f5dc39767.png)

Nameを入力し、Regionを選択します。

また、「Advanced Network and Compute Options」をクリックすると詳細設定が開きますので、そちらでネットワークやEC2インスタンスタイプなど詳細な設定ができるようです。

ちなみにInstance Countがmin:3になっており、最低3台作成が必要のようです。3台以下にしたら下記のようなバリデーションエラーが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/12c38587-a6b4-a9cb-cae3-f4f3d7e07900.png)

今回は検証ですので、特に設定を変更せずに、[Install Convox]をクリックします。

インストールの進捗画面に移ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/2110c523-1861-5e65-119e-66e6c9605f3e.png)

AWS側ではCloudFormationスタックが作成されているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/2eadd2cf-2622-56ad-95c4-e716d52c67c2.png)

Rackの作成が完了したら、statusが緑色で[running]になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/2b88fc17-ce1e-8f59-c187-ac996e529889.png)

#### 5. Connect the Convox CLI

Rackが作成できたら、CLIからConvoxを操作できるように、ConvoxのCLIをインストールします。
[Connect the Convox CLI]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/17a27cb9-bf9c-cbb4-6826-404afab9d19e.png)

遷移した画面で、[First, Install the Convox CLI]をクリックします。

クリックすると、下記リンクのConvox CLIのインストールのドキュメントに遷移します。Mac/Linux/Windowsどれも対応しているようです。

<a href="https://convox.com/docs/installation/" target="_blank" rel="nofollow noopener">Installing the Convox CLI</a>

僕ばMacOSXのHomeBrewでパッケージ管理しているので、下記でインストールしました。

```bash
$ brew install convox
$ convox update
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/62c8c1c4-36be-1ffa-4c3e-36dfafd0273f.png)

Convoxの画面に戻ると、AdministratorのAPI Keyが表示されています。（画像キャプチャではマスクしています）

こちらを控えておき、Convox CLIでログインします。成功すれば「Logged in successfully.」と表示されます。

```bash
$ convox login console.convox.com -p <API Key>
Logged in successfully.
```

その後、```convox racks```コマンドで作成したRackを確認できます。今は前の手順で作成したRackが一つだけ表示されます。

```bash
$ convox racks
RACK                            STATUS
gotchane-org/production-sample  running
```

#### 6. Deploy an App

アプリのデプロイをしてみましょう。
[Deploy an App]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/35db66f9-f04d-14dc-9688-07ddf973e1e8.png)

クリックするとこちらのリンクに遷移します。convoxのサンプルRailsアプリケーションをデプロイする例ですね。

<a href="https://convox.com/docs/getting-started/#deploy-to-convox" target="_blank" rel="nofollow noopener">Deploy to Convox - Getting Started</a>

サンプルRailsアプリケーションをgitからクローンします。

```bash
$ git clone https://github.com/convox-examples/rails
$ cd rails
```
convoxのアプリケーションを作成します。

```bash
$ convox apps create
Creating app rails... CREATING
```

下記コマンドでアプリケーションの起動中であることが確認できます。

```bash
$ convox apps info
Name        rails
Status      running
Generation  2
Release
```

ConvoxのGUIからもアプリケーションの起動が確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/3e7fab07-f5d9-73dd-7852-bc55ff95f75b.png)

この時点ではConvoxにアプリケーションの情報が登録された段階であり、デプロイはまだされていませんので、下記コマンドでアプリケーションをデプロイします。（標準出力のハッシュ値はマスクしています）

DockerFileのビルドが走り、AWSのElastic Container Registryにイメージをpushしている挙動が確認できます。

```bash
$ convox deploy
Deploying rails
Creating tarball... OK
Uploading:  949.64 KiB / 949.47 KiB [=====================] 100.02% 2s
Starting build... OK
Authenticating 000000000000.dkr.ecr.us-east-1.amazonaws.com: WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
building: .
running: docker build -t 0000000000000000000000000000000000000000 -f /tmp/000000000/Dockerfile /tmp/000000000
Sending build context to Docker daemon  645.6kB
Step 1/10 : FROM convox/rails:2.5.0
 ---> 000000000000
Step 2/10 : COPY Gemfile      ./
 ---> Using cache
 ---> 000000000000
Step 3/10 : COPY Gemfile.lock .
 ---> Using cache
 ---> 000000000000
Step 4/10 : RUN bundle install
 ---> Using cache
 ---> 000000000000
Step 5/10 : COPY Rakefile   /app/Rakefile
 ---> Using cache
 ---> 000000000000
Step 6/10 : COPY config     /app/config
 ---> Using cache
 ---> 000000000000
Step 7/10 : COPY public/    .
 ---> Using cache
 ---> 000000000000
Step 8/10 : COPY ./app/assets/ /app/app/assets
 ---> Using cache
 ---> 000000000000
Step 9/10 : RUN rake assets:precompile
 ---> Using cache
 ---> 000000000000
Step 10/10 : COPY . .
 ---> Using cache
 ---> 000000000000
Successfully built 000000000000
Successfully tagged 0000000000000000000000000000000000000000:latest
running: docker tag 0000000000000000000000000000000000000000 convox/rails/web:00000000
running: docker tag convox/rails/web:00000000000 000000000000.dkr.ecr.us-east-1.amazonaws.com/produ-regis-xxxxxxxxxxxxx:web.XXXXXXXXXXX
pushing: 000000000000.dkr.ecr.us-east-1.amazonaws.com/produ-regis-xxxxxxxxxxxxx:web.XXXXXXXXXXX
Release: XXXXXXXXXXX
Promoting XXXXXXXXXXX... UPDATING
```

アプリケーションのステータスが「running」になっていることを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/8df37872-e76f-e876-a921-af10b94dc688.png)

アプリケーションのエンドポイントは、アプリケーション名のリンクをクリックすると画面右側に[Endpoints]が表示されるので、HTTPS/HTTPいずれかでアクセスできるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/3b9d6cbe-f4b0-165f-807c-d30a4b7dcb2f.png)

Railsのサンプルアプリケーションの画面が表示されればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/e00d8800-8844-6aa0-2fc5-c036e4a3434e.png)

#### 7. Uninstall Convox

検証が終わったら、下記ドキュメントを参考にRackを削除しましょう。
もし削除に失敗した場合は、Convoxに関連するCloudFormationスタックを手動削除しましょう。
<a href="https://convox.com/docs/uninstalling-convox/" target="_blank" rel="nofollow noopener">Uninstalling Convox</a>

## 触ってみた所感

* CLIをベースにdockerアプリケーションを簡単にデプロイできたので、CLIベースでDockerアプリケーションの開発・デプロイをするユースケースには合いそうな気がする
* CLI操作が主になるので、APIキーをローカルに保持するのがマストになる。APIキーの権限は、Administrator/Developer/Operator程度の色分けはつけられる模様(参考: <a href="https://convox.com/docs/access-control/#users" target="_blank" rel="nofollow noopener">Access Control - Convox</a>)
* Rackの構築状況はConvoxのGUIからだとステータスしか確認できないので、うまくいかない場合は結局CloudFormationの作成状況を見に行く必要があった
* Convoxの他の機能を確認したい場合は、<a href="https://convox.com/docs" target="_blank" rel="nofollow noopener">Convox Documentation</a>を見に行くのが近道な気がする

## 終わりに

今回は初歩的な部分を触ってみましたが、便利だなと思うところもあれば、Herokuなどのようにアプリケーションレイヤ以下がマネージドでない分、注意して触る必要があるところもありました。

ただドキュメントを読むとGithubやSlackとの連携、CloudWatch経由の監視などもあり、他にも機能が色々あるみたいなので、機会があれば試してみようと思います。