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


はじめに

最近Dockerで楽にアプリケーション運用できる技術があるかを探しているのですが、その一環で、Convoxというサービスを見つけました。

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

Convoxについて

概要

ざっくり説明すると、ConvoxとはAWS上でDockerアプリケーションを稼働させるためのPaaSのようなサービスです。Container Partners - Amazon Web Services (AWS)にも登録されています。

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

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

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

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

Convox Developer Experience on Vimeo

Rackについて

Conboxにおける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上に公開されています。

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

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

Convoxの費用

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

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

参考:Convox Pricing

検証の記録

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

検証の前提

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

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

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

検証の進め方

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

検証の手順

1. Convoxアカウント登録

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

2. Create Organization

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

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

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

3. Connect an AWS account

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

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

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

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]をクリックします。

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

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

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

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

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

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

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

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

5. Connect the Convox CLI

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

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

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

Installing the Convox CLI

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

$ brew install convox
$ convox update

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

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

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

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

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

6. Deploy an App

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

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

Deploy to Convox - Getting Started

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

$ git clone https://github.com/convox-examples/rails
$ cd rails

convoxのアプリケーションを作成します。

$ convox apps create
Creating app rails... CREATING

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

$ convox apps info
Name        rails
Status      running
Generation  2
Release

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

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

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

$ 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」になっていることを確認します。

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

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

7. Uninstall Convox

検証が終わったら、下記ドキュメントを参考にRackを削除しましょう。
もし削除に失敗した場合は、Convoxに関連するCloudFormationスタックを手動削除しましょう。
Uninstalling Convox

触ってみた所感

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

終わりに

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

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