febc技術メモ

Japanese version of http://febc-yamamoto.hatenablog.com

Arukasで任意のコマンドを実行する「Rarukas」 - 雲の向こうの使い捨てコンテナ

f:id:febc_yamamoto:20180225174323p:plain

2018/2/20にArukasのβサービスが再開しましたね!!待ってました!!!

Arukas βサービス提供再開に関するお知らせ

ということで早速使ってみました。

何が変わったの?

GitHubアカウントでのサインイン/サインアップは廃止

先ほどのお知らせにも書かれていましたが、GitHubアカウントでのサインアップが廃止されていました。
以前のArukasでアカウントを持っていた場合でも再作成となるようです。
以下ページからサインアップを行いました。

現在は予約制となっており、サインアップ後に登録可能な状態になったら招待メールが届きます。
(私の時は30分程度で届きました)

Arukas サインアップ

4つのプランの中から選択が可能に

課金体系についても公開されていました。
スペックやインスタンス数の制限などの違いで以下4つのプランがあるとのことです。

名称 vCPU RAM 価格 概要
Free 0.1 128MB 無料 同時に起動できるコンテナーインスタンスは一つだけ
Hobby 0.1 512MB 0.74円/h FreeプランとCPU性能は同じ、RAMサイズ増
Standard x1 0.5 512MB 1.48円/h HobbyプランからvCPU増
Standard x2 0.5 1024MB 2.96円/h Standard x1プランからRAMサイズ増

なお、Freeプラン以外を一度でも起動した月は基本料金として月額50円上乗せされるとのことです。

APIも結構変わった

また、サービス再開に合わせてAPIについても更新されていました。

Arukas API Reference

認証や必要なヘッダなどについては変更ないようですが、リソース名やリソースの内容についてはだいぶ変わっています。
例: app_setsとかは無くなりました。

旧Arukas APIを利用していた場合は変更が必要でしょう。
取り急ぎGo言語についてAPIライブラリを作成しておきましたのでぜひご利用ください。

Go言語向け Arukas APIライブラリ go-arukas

APIライブラリを作ったらアプリも欲しくなりましたのでとりあえず作っておきました。

Arukasで任意のコマンドを実行する「Rarukas」コマンド

shell(sh)に対するremote-shell(rsh)みたいに、Arukasでもっと手軽にコマンド実行したいなーということでremote-arukas = rarukasというコマンド作りました。

GitHub: rarukas - CLI for running one-off command(s) on Arukas

Go言語で書いてますので、インストールはバイナリをGitHubからダウンロードして実行権付与するだけです。
ダウンロードは以下のGitHub Releasesページから行えます。

GitHub: rarukas - releases

以下のような感じで任意のコマンドをArukas上のコンテナで実行可能です。
コンテナはオンデマンドに作成され、コマンド実行が終了すると破棄されます。エコですね!!

# 事前にAPIキーを環境変数に設定(コマンドラインオプションでも指定可)
$ export ARUKAS_JSON_API_TOKEN=<APIトークン>
$ export ARUKAS_JSON_API_SECRET=<APIシークレット>

# Arukas上でcurlコマンドを実行
$ rarukas curl -L https://arukas.io/

動きとしてはこんな感じです。

f:id:febc_yamamoto:20180225163229p:plain

  • SSH用のキーペアを生成(オプション指定でキーの指定もできる)
  • Arukas APIでコンテナ作成 & 起動、SSH用の公開鍵をArukas API経由でコンテナに渡す
    (起動するコンテナはRarukas側で用意したSSH/SCP可能なイメージを利用してます)
  • (任意)コンテナが起動したらSCPでローカルのファイルをコンテナのworkdirへアップロード
  • コンテナ上で指定のコマンド実行
  • (任意)コンテナ上のworkdirをローカルにダウンロード
  • Arukas APIでコンテナ破棄

実行したいコマンドはファイルでの指定もできる

実行したいコマンドはファイルでの指定も可能になっています。
例えばローカルマシンにrun_on_arukas.shというスクリプトを用意しておいて、以下のようにオプション指定すればOKです。

お好きなシェルスクリプトが利用できます!

# 実行したいコマンドを別ファイルで指定
rarukas -c run_on_arukas.sh

ローカルマシンのファイルをアップロード/コマンド実行後にコンテナからダウンロード

さらにはSCP経由でファイル/ディレクトリのやりとりができるため、

  • ローカルの処理したいデータをアップロード
  • Arukas上で加工
  • 加工したデータをローカルにダウンロード

ということもできます。

このために--sync-dirというオプションを用意しており、これで指定したディレクトリをコマンド実行前にアップロード、コマンド実行後にダウンロードしてくれるようになります。

# カレントディレクトリの内容をアップロード/コマンド実行で生成されたファイルをダウンロード
$ rarukas --sync-dir . "echo from-arukas > result.txt"

# ローカルマシンにコンテナ上で生成されたファイルがダウンロードされている
$ ls
result.txt

ベースイメージの選択ができる

Arukas上で起動するコンテナのベースイメージはデフォルトでは軽量なalpineベースですが、実行したいコマンドに応じて以下のようなものを指定できます。

  • alpine : デフォルト、alpineベースの軽量イメージ
  • centos : CentOS7ベース
  • ubuntu: Ubuntu 16.04ベース
  • ansible: Ansible実行用のalpineベースイメージ
  • sacloud : さくらのクラウド系ツール(usacloudterraformpackerなど)の実行用イメージ、alpineベース

ベースイメージはオプション指定することで変更できます。

# ubuntuベースのイメージを利用する場合
rarukas --type ubuntu <your-command>

どんな時に使うの?

バッチ処理のオフロードや多少時間がかかってもいいから自分のマシンの負荷を上げたくない時などに便利です。
rarukasコマンドでArukasコンテナを起動するのには早くて10〜20秒、負荷状況によってはもう少しかかることもあるため速度を求める処理には向きませんが、 複数のコンテナに分散して並列に処理できるような場面では真価を発揮します。

利用例: 10コンテナでコマンドを分散/並列実行

以下のように xargsなどと組み合わせることで任意の処理を複数のコンテナに分散/並列実行できます。
この例ではecho Hello World from Rarukas -(連番)というコマンドを10台に分散/並列実行しています。
(複数インスタンスの利用となるため、--planオプションでhobbyプランを利用するように指定)

# 10コンテナに分散してコマンド実行
$ seq 10 | xargs -P10 -n1 rarukas --plan hobby echo Hello from Rarukas -$1 

これを実行すると以下のような表示になるはずです。
ただし、並列実行のため順序は保証されませんので多少出力順が異なる可能性があります。

# 見やすくするために標準エラー出力は除いています
Hello from Rarukas - 2
Hello from Rarukas - 9
Hello from Rarukas - 4
Hello from Rarukas - 1
Hello from Rarukas - 8
Hello from Rarukas - 3
Hello from Rarukas - 7
Hello from Rarukas - 10
Hello from Rarukas - 5
Hello from Rarukas - 6

利用例: Ansibleで複数マシンのプロビジョニングやレポート作成を分散/並列実行

先ほども出てきましたが、ansibleコマンドを実行できるイメージを用意しています。
これを利用すれば自マシンに負荷をかけることなく大量のサーバのプロビジョニングも行えますね。

まずはインベントリファイルやSSH用の秘密鍵などを準備しておきます。
この例ではプロビジョニング対象の各サーバ毎にインベントリファイル&秘密鍵を用意するようにしています。

# 対象のサーバ毎にインベントリファイルと秘密鍵を準備
$ tree .
.
├── host1
│   ├── ansible.cfg
│   ├── hosts
│   └── private_key
├── host2
│   ├── ansible.cfg
│   ├── hosts
│   └── private_key
├── host3
│   ├── ansible.cfg
│   ├── hosts
│   └── private_key
├── host4
│   ├── ansible.cfg
│   ├── hosts
│   └── private_key
└── host5
    ├── ansible.cfg
    ├── hosts
    └── private_key

# バックグラウンドでrarukasコマンド起動(5台分)
$ rarukas --type ansible --plan hobby --sync-dir host1 ansible host1 -i hosts -m setup --tree ./ &
$ rarukas --type ansible --plan hobby --sync-dir host2 ansible host2 -i hosts -m setup --tree ./ &
$ rarukas --type ansible --plan hobby --sync-dir host3 ansible host3 -i hosts -m setup --tree ./ &
$ rarukas --type ansible --plan hobby --sync-dir host4 ansible host4 -i hosts -m setup --tree ./ &
$ rarukas --type ansible --plan hobby --sync-dir host5 ansible host5 -i hosts -m setup --tree ./ &

他にも大容量のファイルのファイルのダウンロード -> 他のサーバへ送信といったように自マシンやネットワークの負荷を軽減するような使い方もありますね。 色々応用できると思います。

でもお高いんでしょ?

Rarukasを使うことで手軽にコンテナを使い捨てできますが、その際に心配なのがやっぱり料金ですね。

例えば1台あたり10分かかる処理を10台で行なったとすると、1実行あたり100分、毎日1回実行とすると30日で3,000分 = 50時間ですね。
Hobbyプランだと時間あたり 0.74円ですので、月額利用料としては

@0.74円 × 50時間 + 基本料金50円 = 87円

なんと、87円!!!

87円ですよ!!これはお安いですね!!!

ちなみに、公式サイトの料金の部分に「課金は秒単位」と記載があるので、ちょっとだけ起動して破棄する = 使い捨てる運用にもってこいですね!!

f:id:febc_yamamoto:20180225180033p:plain

ということでコンテナ使い捨てにRarukasは非常にお手軽です。
是非ご利用くださいー!!

終わりに

Arukasは3/19までは無料で利用できるとのことです。
この機会に一度試してみてはいかがでしょうか?
その際は是非Rarukasコマンドもよろしくお願いします!!

以上です。