TECH
中津川 篤司

開発の自動化を促進するJenkinsをセットアップする

CI(Continuous Integration。継続的インテグレーション)という言葉も一般的に用いられるようになってきました。CIサーバとして有名なのがオープンソース・ソフトウェアのJenkinsです。今回はこのJenkinsをCloudGarageのインスタンスにセットアップしてみます。 利用するディストリビューション 今回はUbuntu 18.04を用いています。16.04でも操作は変わらないはずです。 必要なスペック Installing Jenkinsによると、メモリ256MB、ストレージ1GBが最低限のスペックとなっています。推奨としてはメモリ1GB以上、ストレージ50GB以上となっています。CloudGarageのインスタンスであれば特に問題ないでしょう。 Jenkinsのインストール インストール作業はInstalling Jenkinsに書いてあるコマンドを実行するだけなのですが、デフォルトではJavaが入っていないためにエラーが出ます。 # sudo apt-get install jenkins Reading package lists... Done Building dependency tree Reading state information... Done : See "systemctl status jenkins.service" and "journalctl -xe" for details. invoke-rc.d: initscript jenkins, action "start" failed. ● jenkins.service - LSB: Start Jenkins at boot time Loaded: loaded (/etc/init.d/jenkins; generated) Active: failed (Result: exit-code) since Fri 2018-11-23 20:47:40 JST; 11ms ago Docs: man:systemd-sysv-generator(8) Process: 2359 ExecStart=/etc/init.d/jenkins start (code=exited, status=1/FAILURE) Nov 23 20:47:40 jenkins systemd[1]: Starting LSB: Start Jenkins at boot time... Nov 23 20:47:40 jenkins jenkins[2359]: ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin Nov 23 20:47:40 jenkins jenkins[2359]: If you actually have java installed on the system make sure the executable is in the aforementioned path and that 'type -p java' returns the java executable path Nov 23 20:47:40 jenkins systemd[1]: jenkins.service: Control process exited, code=exited status=1 Nov 23 20:47:40 jenkins systemd[1]: jenkins.service: Failed with result 'exit-code'. Nov 23 20:47:40 jenkins systemd[1]: Failed to start LSB: Start Jenkins at boot time. dpkg: error processing package jenkins (--configure): installed jenkins package post-installation script subprocess returned error exit status 1 Processing triggers for ureadahead (0.100.0-20) ... Processing triggers for systemd (237-3ubuntu10.3) ... Errors were encountered while processing: jenkins E: Sub-process /usr/bin/dpkg returned an error code (1) このエラーが出る場合はJavaをインストールしましょう。実行のみのJREで大丈夫です。 # sudo apt install openjdk-8-jre -y この後、再度インストールを実行します。これは公式サイトに書かれているコマンドを実行すればOKです。 wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins 初期セットアップ http://インストールしたインスタンスのIPアドレス:8080 にアクセスすると初期セットアップがウィザード形式で進められます。特に問題ないと思いますが、最初に /var/lib/jenkins/secrets/initialAdminPassword に書かれた内容をパスワードとして使います。これをコピーしておきましょう。 ~# cat /var/lib/jenkins/secrets/initialAdminPassword 2cf...869 後はウィザードに沿って進めていけばOKです。 まとめ CIではコードを取得してビルドしたり、テストを実行するのでストレージが高速であるとそれだけ速くテストを行えるでしょう。CloudGarageのインスタンスにはぴったりな使い方と言えそうです。ぜひ試してみてください!

TECH
中津川 篤司

インスタンスのスペックを変えてみよう。スケールアップ/ダウン機能の使い方

CloudGarageではリソース(CPU/メモリ/ストレージ)を動的に変更できる機能があります。あらかじめ割り当てられているリソースを自由に配分できるのがCloudGarageの特徴ですが、もし運用している中でスペック不足を感じたりしたら、さらに追加できます(スケールダウンもできます)。 今回はスケールアップ、スケールダウンを行う方法を紹介します。 スケールアップ前 今回、最初のスペックは 1CPU / 2GB / 50GB となっています。コマンドレベルで確認します。 CPU数 # grep cpu.cores /proc/cpuinfo | sort -u cpu cores : 1 メモリ # free total used free shared buff/cache available Mem: 2041340 118100 1518084 644 405156 1772616 Swap: 2097148 0 2097148 ストレージ # df -BM Filesystem 1M-blocks Used Available Use% Mounted on udev 985M 0M 985M 0% /dev tmpfs 200M 1M 199M 1% /run /dev/vda1 49447M 1663M 47768M 4% / tmpfs 997M 0M 997M 0% /dev/shm tmpfs 5M 0M 5M 0% /run/lock tmpfs 997M 0M 997M 0% /sys/fs/cgroup /dev/vda15 105M 4M 102M 4% /boot/efi tmpfs 200M 0M 200M 0% /run/user/0 スケールアップ ではこのインスタンスをスケールアップします。スケールアップはインスタンス詳細画面から行います。スケールアップ・ダウンボタンをクリックします。 出てきたダイアログを使って、新しい設定を入力します。今回は2CPU / 4GB / 100GBにします。 最後に確認が出て、実行となります。 スペックの変更が終わって、再度同じコマンドを実行します。 CPU # grep cpu.cores /proc/cpuinfo | sort -u cpu cores : 2 メモリ # free total used free shared buff/cache available Mem: 4039588 90072 3744240 640 205276 3726616 Swap: 2097148 0 2097148 ストレージ # df -BM Filesystem 1M-blocks Used Available Use% Mounted on udev 1960M 0M 1960M 0% /dev tmpfs 395M 1M 394M 1% /run /dev/vda1 99068M 1725M 97328M 2% / tmpfs 1973M 0M 1973M 0% /dev/shm tmpfs 5M 0M 5M 0% /run/lock tmpfs 1973M 0M 1973M 0% /sys/fs/cgroup /dev/vda15 105M 4M 102M 4% /boot/efi tmpfs 395M 0M 395M 0% /run/user/0 ちゃんと変更されているのが分かります。 スペックアップ・ダウンの利点・欠点 インスタンス自体は同じものになるので、SSHなどはそのまま使えます。なお、スペック変更は一度インスタンスを停止しなければいけません。そのため、運用中のサーバで行うのは難しいでしょう。また、ストレージはスペックアップできますが、スペックダウンできませんので注意してください。 スペックアップ、ダウンともに大体5分程度で終わります。ただし、ストレージは新しいストレージ容量1GBにつき1分程度かかるので注意してください。例えば今回のように100GBにした場合100分程度かかることになります。 まとめ インスタンスを使っている中でスペックの不足感を感じた時に、新しいインスタンスを立てたりせずに今あるインスタンスがそのまま使えるので便利です。ストレージ以外は元に戻すことも可能なので、ぜひ活用してください。

TECH
中津川 篤司

CloudGarage Public APIを使ったNode.js SDK(非公式)を開発しています

CloudGarageもPublic APIが公開されたことで、処理の自動化や外部ツールと組み合わせた操作が可能になります。しかしAPIをHTTPクライアントで利用するのは大変です。そこでSDKが必要になります。 様々な言語で用意されているのが望ましいですが、まずは非公式ながらNode.jsで作り始めてみました。徐々に機能を追加していきたいと思います。 インストール インストールは npm で行います。cloudgarage - npmにてパッケージを公開しています。 $ npm i cloudgarage -g 使い方 まず必ずトークンを取得しないといけません。そのため、あらかじめコントロールパネル | CloudGarageにてAPIのクライアントIDとクライアントシークレットを取得しておきます。 クライアントIDとクライアントシークレットを取得したら、以下のコマンドを入力します。 $ cloudgarage token そうすると対話型でクライアントIDとクライアントシークレットを指定します。デフォルトで .cloudgarage.json というファイルをホームディレクトリ直下に作成します。 $ node_modules/.bin/cloudgarage token ✔ What is your client ID? … ylk...t1P ✔ What is your client secret? … iIG...oUo Write configuration to ~/.cloudgarage.json Done ヘルプは以下のようになっており、クライアントIDとクライアントシークレットをオプションとして指定もできます。 $ cloudgarage help token Usage: cloudgarage-token [options] Options: -i, --id [clientId] This is Client Id that you can get it on Dashboard at CloudGarage -s, --secret [clientSecret] This is Client Secret that you can get it on Dashboard at CloudGarage -o, --output [configFilePath] Output config file path. Default is ~/.cloudgarage.json (default: "~/.cloudgarage.json") -h, --help output usage information ディスクイメージの取得 執筆時点ではディスクイメージの取得しかありません。これは images コマンドで行います。 $ cloudgarage images このコマンドで作成されているバックアップイメージを含め、ディスクイメージが一覧で返ってきます。 $ cloudgarage images ┌─────────┬────────────────────────────────────────┬───────────────┬──────────────────────────────────┐ │ (index) │ Id │ Type │ Name │ ├─────────┼────────────────────────────────────────┼───────────────┼──────────────────────────────────┤ │ 0 │ '38b60dd1-e374-44ef-b58e-9beaeabf0eaa' │ 'OS' │ 'CentOS-6.10-32bit' │ │ 1 │ 'b1e41e1c-1410-4880-aa33-9c83154d3571' │ 'OS' │ 'CentOS-6.10-64bit' │ │ 26 │ '38625780-5355-4da5-918f-2bd12abef9b7' │ 'APPLICATION' │ 'Redmine/Ubuntu-16.04-64bit' │ │ 27 │ '7761c7de-47a6-47a9-83de-3e6bf57f71b1' │ 'APPLICATION' │ 'WordPress/Ubuntu-16.04-64bit' │ └─────────┴────────────────────────────────────────┴───────────────┴──────────────────────────────────┘ -t または --type でディスク種別をフィルタリングできます。指定できるのは OS / APPLICATION / PRIVATEの3つです。他のオプションは以下の通りです。 $ cloudgarage help images Usage: cloudgarage-images [options] Options: -c, --config [configFilePath] Config file path. Default is ~/.cloudgarage.json (default: "~/.cloudgarage.json") -t, --type [type] Filtering image type. [OS, APPLICATION, PRIVATE] -h, --help output usage information まとめ 機能的にはまだ多くありませんが、徐々にバージョンアップしていきます。リポジトリはCloudGarageMania/node-js: CloudGarage SDK for Node.jsにありますので、不具合や優先して欲しい機能などがありましたらぜひIssueにてお願いします。なお、当SDKのライセンスはMITとなっています。

TECH
中津川 篤司

ついに公開されたAPIをPHPから利用する(バックアップ情報を取得する)

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はPHPを使ってAPI操作を行う方法を解説します。処理内容としては、インスタンスに設定されたバックアップ情報を取得します。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 PHP APIキーを取得する 続いてCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 設定ファイルを読み込む まず設定ファイルとなるJSONファイルを取得します。これは上記クライアントIDとクライアントシークレットが保存されたファイルです。 $config = json_decode(file_get_contents('../config.json'), true); トークンを取得する 次にAPIを利用するためのトークンを取得します。これはクライアントIDとクライアントシークレットを用いて、POST /tokens にアクセスします。file_get_contents関数を使ってPOST処理を行います。 $baseUrl = "https://api.cloudgarage.jp"; $token = getToken($baseUrl, $config); // トークンを取得する function getToken($baseUrl, $config) { $url = "$baseUrl/tokens"; $options = array ( 'http' => array ( 'method' => 'POST', 'header' => 'Content-type: application/json', 'content' => json_encode( array( 'client_id' => $config['clientId'], 'client_secret' => $config['clientSecret'] ) ) ) ); $contents = file_get_contents($url, false, stream_context_create($options)); return json_decode($contents, true)['token']['id']; } インスタンス一覧を取得する トークンを取得したら、それを使ってAPIにアクセスできます。まず、既存のインスタンス一覧を取得します。これは GET /servers にリクエストします。 function getInstances($baseUrl, $token) { $url = "$baseUrl/servers"; return get($url, $token, 'servers'); } function get($url, $token, $key) { $options = array ( 'http' => array ( 'header' => implode("\r\n", array( 'Content-type: application/json', "X-Auth-Token: $token" )) ) ); $contents = file_get_contents($url, false, stream_context_create($options)); return json_decode($contents, true)[$key]; } GET処理はこの後でも使うので関数化しておきます。 自動バックアップ情報を取得する インスタンスIDが分かったら、そのインスタンスの自動バックアップ情報を取得します。これは GET /servers/{id}/autoBackup で取得できます。 function getAutoBackupInfo($baseUrl, $token, $id) { $url = "$baseUrl/servers/$id/autoBackup"; return get($url, $token, 'autoBackup'); } 結果を出力すると次のようになります。 array(6) { ["resourceId"]=> string(36) "948...4fc" ["cycle"]=> string(1) "W" ["dayOfCycle"]=> string(6) "MONDAY" ["time"]=> string(8) "01:00:00" ["saveCount"]=> int(1) ["nextExecDatetime"]=> string(23) "2018/12/24 01:00:00.000" } PHPは豊富な関数が用意されているので、それらを組み合わせるだけで簡単に利用できます。特にWeb APIを扱う上でfile_get_contents関数は強力です。ぜひ使いこなしてください! APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

開発の自動化を促進するJenkinsをセットアップする

TECH
中津川 篤司

CI(Continuous Integration。継続的インテグレーション)という言葉も一般的に用いられるようになってきました。CIサーバとして有名なのがオープンソース・ソフトウェアのJenkinsです。今回はこのJenkinsをCloudGarageのインスタンスにセットアップしてみます。 利用するディストリビューション 今回はUbuntu 18.04を用いています。16.04でも操作は変わらないはずです。 必要なスペック Installing Jenkinsによると、メモリ256MB、ストレージ1GBが最低限のスペックとなっています。推奨としてはメモリ1GB以上、ストレージ50GB以上となっています。CloudGarageのインスタンスであれば特に問題ないでしょう。 Jenkinsのインストール インストール作業はInstalling Jenkinsに書いてあるコマンドを実行するだけなのですが、デフォルトではJavaが入っていないためにエラーが出ます。 # sudo apt-get install jenkins Reading package lists... Done Building dependency tree Reading state information... Done : See "systemctl status jenkins.service" and "journalctl -xe" for details. invoke-rc.d: initscript jenkins, action "start" failed. ● jenkins.service - LSB: Start Jenkins at boot time Loaded: loaded (/etc/init.d/jenkins; generated) Active: failed (Result: exit-code) since Fri 2018-11-23 20:47:40 JST; 11ms ago Docs: man:systemd-sysv-generator(8) Process: 2359 ExecStart=/etc/init.d/jenkins start (code=exited, status=1/FAILURE) Nov 23 20:47:40 jenkins systemd[1]: Starting LSB: Start Jenkins at boot time... Nov 23 20:47:40 jenkins jenkins[2359]: ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin Nov 23 20:47:40 jenkins jenkins[2359]: If you actually have java installed on the system make sure the executable is in the aforementioned path and that 'type -p java' returns the java executable path Nov 23 20:47:40 jenkins systemd[1]: jenkins.service: Control process exited, code=exited status=1 Nov 23 20:47:40 jenkins systemd[1]: jenkins.service: Failed with result 'exit-code'. Nov 23 20:47:40 jenkins systemd[1]: Failed to start LSB: Start Jenkins at boot time. dpkg: error processing package jenkins (--configure): installed jenkins package post-installation script subprocess returned error exit status 1 Processing triggers for ureadahead (0.100.0-20) ... Processing triggers for systemd (237-3ubuntu10.3) ... Errors were encountered while processing: jenkins E: Sub-process /usr/bin/dpkg returned an error code (1) このエラーが出る場合はJavaをインストールしましょう。実行のみのJREで大丈夫です。 # sudo apt install openjdk-8-jre -y この後、再度インストールを実行します。これは公式サイトに書かれているコマンドを実行すればOKです。 wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins 初期セットアップ http://インストールしたインスタンスのIPアドレス:8080 にアクセスすると初期セットアップがウィザード形式で進められます。特に問題ないと思いますが、最初に /var/lib/jenkins/secrets/initialAdminPassword に書かれた内容をパスワードとして使います。これをコピーしておきましょう。 ~# cat /var/lib/jenkins/secrets/initialAdminPassword 2cf...869 後はウィザードに沿って進めていけばOKです。 まとめ CIではコードを取得してビルドしたり、テストを実行するのでストレージが高速であるとそれだけ速くテストを行えるでしょう。CloudGarageのインスタンスにはぴったりな使い方と言えそうです。ぜひ試してみてください!

インスタンスのスペックを変えてみよう。スケールアップ/ダウン機能の使い方

TECH
中津川 篤司

CloudGarageではリソース(CPU/メモリ/ストレージ)を動的に変更できる機能があります。あらかじめ割り当てられているリソースを自由に配分できるのがCloudGarageの特徴ですが、もし運用している中でスペック不足を感じたりしたら、さらに追加できます(スケールダウンもできます)。 今回はスケールアップ、スケールダウンを行う方法を紹介します。 スケールアップ前 今回、最初のスペックは 1CPU / 2GB / 50GB となっています。コマンドレベルで確認します。 CPU数 # grep cpu.cores /proc/cpuinfo | sort -u cpu cores : 1 メモリ # free total used free shared buff/cache available Mem: 2041340 118100 1518084 644 405156 1772616 Swap: 2097148 0 2097148 ストレージ # df -BM Filesystem 1M-blocks Used Available Use% Mounted on udev 985M 0M 985M 0% /dev tmpfs 200M 1M 199M 1% /run /dev/vda1 49447M 1663M 47768M 4% / tmpfs 997M 0M 997M 0% /dev/shm tmpfs 5M 0M 5M 0% /run/lock tmpfs 997M 0M 997M 0% /sys/fs/cgroup /dev/vda15 105M 4M 102M 4% /boot/efi tmpfs 200M 0M 200M 0% /run/user/0 スケールアップ ではこのインスタンスをスケールアップします。スケールアップはインスタンス詳細画面から行います。スケールアップ・ダウンボタンをクリックします。 出てきたダイアログを使って、新しい設定を入力します。今回は2CPU / 4GB / 100GBにします。 最後に確認が出て、実行となります。 スペックの変更が終わって、再度同じコマンドを実行します。 CPU # grep cpu.cores /proc/cpuinfo | sort -u cpu cores : 2 メモリ # free total used free shared buff/cache available Mem: 4039588 90072 3744240 640 205276 3726616 Swap: 2097148 0 2097148 ストレージ # df -BM Filesystem 1M-blocks Used Available Use% Mounted on udev 1960M 0M 1960M 0% /dev tmpfs 395M 1M 394M 1% /run /dev/vda1 99068M 1725M 97328M 2% / tmpfs 1973M 0M 1973M 0% /dev/shm tmpfs 5M 0M 5M 0% /run/lock tmpfs 1973M 0M 1973M 0% /sys/fs/cgroup /dev/vda15 105M 4M 102M 4% /boot/efi tmpfs 395M 0M 395M 0% /run/user/0 ちゃんと変更されているのが分かります。 スペックアップ・ダウンの利点・欠点 インスタンス自体は同じものになるので、SSHなどはそのまま使えます。なお、スペック変更は一度インスタンスを停止しなければいけません。そのため、運用中のサーバで行うのは難しいでしょう。また、ストレージはスペックアップできますが、スペックダウンできませんので注意してください。 スペックアップ、ダウンともに大体5分程度で終わります。ただし、ストレージは新しいストレージ容量1GBにつき1分程度かかるので注意してください。例えば今回のように100GBにした場合100分程度かかることになります。 まとめ インスタンスを使っている中でスペックの不足感を感じた時に、新しいインスタンスを立てたりせずに今あるインスタンスがそのまま使えるので便利です。ストレージ以外は元に戻すことも可能なので、ぜひ活用してください。

CloudGarage Public APIを使ったNode.js SDK(非公式)を開発しています

TECH
中津川 篤司

CloudGarageもPublic APIが公開されたことで、処理の自動化や外部ツールと組み合わせた操作が可能になります。しかしAPIをHTTPクライアントで利用するのは大変です。そこでSDKが必要になります。 様々な言語で用意されているのが望ましいですが、まずは非公式ながらNode.jsで作り始めてみました。徐々に機能を追加していきたいと思います。 インストール インストールは npm で行います。cloudgarage - npmにてパッケージを公開しています。 $ npm i cloudgarage -g 使い方 まず必ずトークンを取得しないといけません。そのため、あらかじめコントロールパネル | CloudGarageにてAPIのクライアントIDとクライアントシークレットを取得しておきます。 クライアントIDとクライアントシークレットを取得したら、以下のコマンドを入力します。 $ cloudgarage token そうすると対話型でクライアントIDとクライアントシークレットを指定します。デフォルトで .cloudgarage.json というファイルをホームディレクトリ直下に作成します。 $ node_modules/.bin/cloudgarage token ✔ What is your client ID? … ylk...t1P ✔ What is your client secret? … iIG...oUo Write configuration to ~/.cloudgarage.json Done ヘルプは以下のようになっており、クライアントIDとクライアントシークレットをオプションとして指定もできます。 $ cloudgarage help token Usage: cloudgarage-token [options] Options: -i, --id [clientId] This is Client Id that you can get it on Dashboard at CloudGarage -s, --secret [clientSecret] This is Client Secret that you can get it on Dashboard at CloudGarage -o, --output [configFilePath] Output config file path. Default is ~/.cloudgarage.json (default: "~/.cloudgarage.json") -h, --help output usage information ディスクイメージの取得 執筆時点ではディスクイメージの取得しかありません。これは images コマンドで行います。 $ cloudgarage images このコマンドで作成されているバックアップイメージを含め、ディスクイメージが一覧で返ってきます。 $ cloudgarage images ┌─────────┬────────────────────────────────────────┬───────────────┬──────────────────────────────────┐ │ (index) │ Id │ Type │ Name │ ├─────────┼────────────────────────────────────────┼───────────────┼──────────────────────────────────┤ │ 0 │ '38b60dd1-e374-44ef-b58e-9beaeabf0eaa' │ 'OS' │ 'CentOS-6.10-32bit' │ │ 1 │ 'b1e41e1c-1410-4880-aa33-9c83154d3571' │ 'OS' │ 'CentOS-6.10-64bit' │ │ 26 │ '38625780-5355-4da5-918f-2bd12abef9b7' │ 'APPLICATION' │ 'Redmine/Ubuntu-16.04-64bit' │ │ 27 │ '7761c7de-47a6-47a9-83de-3e6bf57f71b1' │ 'APPLICATION' │ 'WordPress/Ubuntu-16.04-64bit' │ └─────────┴────────────────────────────────────────┴───────────────┴──────────────────────────────────┘ -t または --type でディスク種別をフィルタリングできます。指定できるのは OS / APPLICATION / PRIVATEの3つです。他のオプションは以下の通りです。 $ cloudgarage help images Usage: cloudgarage-images [options] Options: -c, --config [configFilePath] Config file path. Default is ~/.cloudgarage.json (default: "~/.cloudgarage.json") -t, --type [type] Filtering image type. [OS, APPLICATION, PRIVATE] -h, --help output usage information まとめ 機能的にはまだ多くありませんが、徐々にバージョンアップしていきます。リポジトリはCloudGarageMania/node-js: CloudGarage SDK for Node.jsにありますので、不具合や優先して欲しい機能などがありましたらぜひIssueにてお願いします。なお、当SDKのライセンスはMITとなっています。

ついに公開されたAPIをPHPから利用する(バックアップ情報を取得する)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はPHPを使ってAPI操作を行う方法を解説します。処理内容としては、インスタンスに設定されたバックアップ情報を取得します。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 PHP APIキーを取得する 続いてCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 設定ファイルを読み込む まず設定ファイルとなるJSONファイルを取得します。これは上記クライアントIDとクライアントシークレットが保存されたファイルです。 $config = json_decode(file_get_contents('../config.json'), true); トークンを取得する 次にAPIを利用するためのトークンを取得します。これはクライアントIDとクライアントシークレットを用いて、POST /tokens にアクセスします。file_get_contents関数を使ってPOST処理を行います。 $baseUrl = "https://api.cloudgarage.jp"; $token = getToken($baseUrl, $config); // トークンを取得する function getToken($baseUrl, $config) { $url = "$baseUrl/tokens"; $options = array ( 'http' => array ( 'method' => 'POST', 'header' => 'Content-type: application/json', 'content' => json_encode( array( 'client_id' => $config['clientId'], 'client_secret' => $config['clientSecret'] ) ) ) ); $contents = file_get_contents($url, false, stream_context_create($options)); return json_decode($contents, true)['token']['id']; } インスタンス一覧を取得する トークンを取得したら、それを使ってAPIにアクセスできます。まず、既存のインスタンス一覧を取得します。これは GET /servers にリクエストします。 function getInstances($baseUrl, $token) { $url = "$baseUrl/servers"; return get($url, $token, 'servers'); } function get($url, $token, $key) { $options = array ( 'http' => array ( 'header' => implode("\r\n", array( 'Content-type: application/json', "X-Auth-Token: $token" )) ) ); $contents = file_get_contents($url, false, stream_context_create($options)); return json_decode($contents, true)[$key]; } GET処理はこの後でも使うので関数化しておきます。 自動バックアップ情報を取得する インスタンスIDが分かったら、そのインスタンスの自動バックアップ情報を取得します。これは GET /servers/{id}/autoBackup で取得できます。 function getAutoBackupInfo($baseUrl, $token, $id) { $url = "$baseUrl/servers/$id/autoBackup"; return get($url, $token, 'autoBackup'); } 結果を出力すると次のようになります。 array(6) { ["resourceId"]=> string(36) "948...4fc" ["cycle"]=> string(1) "W" ["dayOfCycle"]=> string(6) "MONDAY" ["time"]=> string(8) "01:00:00" ["saveCount"]=> int(1) ["nextExecDatetime"]=> string(23) "2018/12/24 01:00:00.000" } PHPは豊富な関数が用意されているので、それらを組み合わせるだけで簡単に利用できます。特にWeb APIを扱う上でfile_get_contents関数は強力です。ぜひ使いこなしてください! APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

ついに公開されたAPIをSwfitから利用する(SSH公開鍵を取得する)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はSwiftを使ってAPI操作を行う方法を解説します。処理内容としては、コントロールパネルで設定した公開鍵を取得します。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 Xcode Ruby(CocoaPods用) cocoapods-keys CocoaPods HydraAsync SwiftyJSON APIキーを取得する まずはCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 Xcodeで新しいプロジェクトを作成する 最初にXcodeでiOSプロジェクトを作成します。作成したら、一旦終了します。 Gemfileを作成する クライアントIDなどを隠すため、 cocoapods-keys をインストールします。以下の内容で Gemfile を作成します。 source 'https://rubygems.org' gem 'cocoapods-keys' そしてbundlerを実行します。 $ bundle Podfileを作成する 次にCocoaPodsで必要なライブラリをインストールします。 Podfile の内容は次の通りです。 {YOUR_PROJECT} は自分のプロジェクト名に置き換えてください。インストールするのはSwiftでasync/awaitを利用するHydraAsync、そしてJSONを扱いやすくするSwiftyJSONです。cocoapods-keysの設定も行っています。 # Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target '{YOUR_PROJECT}' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! pod 'HydraAsync' pod 'SwiftyJSON' # Pods for ncmbPush target '{YOUR_PROJECT}Tests' do inherit! :search_paths # Pods for testing end target '{YOUR_PROJECT}UITests' do inherit! :search_paths # Pods for testing end end plugin 'cocoapods-keys', { :project => "{YOUR_PROJECT}", :keys => [ "clientId", "clientSecret" ]} これをインストールした状態で pod install を実行すると、clientIdとclientSecretの入力が求められます。先ほどCloudGarageのコントロールパネルで取得したものをそれぞれ指定してください。 $ pod install CocoaPods-Keys has detected a keys mismatch for your setup. What is the key for clientId > ylk...t1P Saved clientId to cloudgarage. What is the key for clientSecret > iIG...oUo Saved clientSecret to cloudgarage. Analyzing dependencies Fetching podspec for `Keys` from `Pods/CocoaPodsKeys` Downloading dependencies Using HydraAsync (1.2.1) Using Keys (1.0.1) Using SwiftyJSON (4.2.0) Generating Pods project Integrating client project Sending stats Pod installation complete! There are 3 dependencies from the Podfile and 3 total pods installed. Xcodeでの作業 .xcworkspace という拡張子のファイルが生成されているので、それを開きます。Xcodeで、新しいヘッダーファイルを作成します。名前は任意ですが BridgeHeader.h などとします。 内容は次の通りです。 CloudgarageKeys.h というファイル名はそれぞれ変わりますが、PodsプロジェクトのDevelopment Pods/Keysの中にあるヘッダーファイルが対象です。 #ifndef BridgeHeader_h #define BridgeHeader_h #import "Keys/CloudgarageKeys.h" #endif /* BridgeHeader_h */ そして作成したXcodeプロジェクトのBuild SettingsにあるObjective-C Bridging Headerにて作成した BridgeHeader.h ファイルを指定します。例えば cloudgarage/BridgeHeader.h といった具合です。 Swiftによる開発 では準備ができましたので実際にコードを書いてみます。まず全体像です。HydraAsyncを使って非同期処理をasync/await化しています。 let baseUrl = "https://api.cloudgarage.jp" async({ _ -> Int in // トークンを取得 let token:String = try await(self.getToken(baseUrl: baseUrl)) // 公開鍵一覧を取得 let keyPairs = try await(self.getKeyPairs(baseUrl: baseUrl, token: token)) as! JSON // 公開鍵の詳細情報を取得 let keyPair = try await(self.getKeyPair(baseUrl: baseUrl, token: token, id: keyPairs[0]["id"].int ?? 0)) // デバッグ出力 print(keyPair) return 0 }).then({stats in print(stats) }) .catch {error in print("Error") print(error) } トークンの取得 まずトークンの取得です。CloudgarageKeysを使ってキーを取得しています。そしてPOSTリクエストを行った後、token.idがあるのかを確認してトークンを返します。 func getToken(baseUrl: String) -> Promise<String> { return Promise<String>(in: .background, {resolve, reject, _ -> Void in let keys = CloudgarageKeys.init() let url = "\(baseUrl)/tokens" let request = NSMutableURLRequest(url: URL(string: url)!) request.httpMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") let params:[String:Any] = [ "client_id": keys.clientId, "client_secret": keys.clientSecret ] request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) do { let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in if error != nil { reject(error ?? NSError(domain: "Request error", code: 1)) } else { let json = try? JSON(data: data!) if let token = json?["token"]["id"].string { resolve(token) } return reject(NSError(domain: "Parse error", code: 1)) } } task.resume() } catch let error as NSError { reject(error) } }) } 公開鍵の一覧を取得 続いて公開鍵の一覧を取得します。get処理を関数化し、一覧を取得する処理自体短くしています。トークンを取得していますので、それを X-Auth-Token ヘッダーに適用して実行します。 func getKeyPairs(baseUrl: String, token: String) -> Promise<Any> { return Promise<Any>(in: .background, {resolve, reject, _ -> Void in let url = "\(baseUrl)/keypairs" self.get(url: url, token: token) .then {json in if json["keypairs"].array != nil { return resolve(json["keypairs"]) } else { return reject(NSError(domain: "Parse error on getKeyPairs \(json)", code: 1)) } } .catch{error in return reject(error) } }) } // GET処理を関数化 func get(url: String, token: String) -> Promise<JSON> { return Promise<JSON>(in: .background, {resolve, reject, _ -> Void in let request = NSMutableURLRequest(url: URL(string: url)!) request.httpMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue(token, forHTTPHeaderField: "X-Auth-Token") let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in if error != nil { reject(error ?? NSError(domain: "Request error", code: 1)) } else { let json = try? JSON(data: data!) return resolve(json!) } } task.resume() }) } 公開鍵の詳細を取得 取得した公開鍵のID(数値)を使って公開鍵詳細を取得します。ここは先ほどのget処理を使って行います。 func getKeyPair(baseUrl: String, token: String, id: Int) -> Promise<Any> { return Promise<Any>(in: .background, {resolve, reject, _ -> Void in let url = "\(baseUrl)/keypairs/\(id)" self.get(url: url, token: token) .then {json in if json["keypair"].dictionary != nil { resolve(json["keypair"]) } else { return reject(NSError(domain: "Parse error on getKeyPair \(json)", code: 1)) } } .catch{error in reject(error) } }) } 結果として以下のような公開鍵情報が得られます。 { "keypair_created_time" : "2018\/09\/03 13:44:29.684", "publicKey" : "ssh-rsa AAA...F+w== nakatsugawa@macpro.local", "name" : "macpro", "id" : 1217 } SwiftはiOSやmacOSアプリの開発はもちろん、サーバサイドでも利用できる言語となっています。静的型付けながら、スクリプト言語のような書き方ができるのが特徴です。ぜひiOSアプリからCloudGarage Public APIを呼び出してみてください! APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

ついに公開されたAPIをGoから利用する(契約情報を取得する)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はGoを使ってAPI操作を行う方法を解説します。契約情報を取得します。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 Go APIキーを取得する 続いてCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 設定ファイルを読み込む APIキーを記述したファイル(config.json)を読み込みます。GoではJSONを扱う際に、まずその構造に合わせて構造体を作っておく必要があります。この場合、Config という構造体になります。 type Config struct { ClientId string `json:"client_id"` ClientSecret string `json:"client_secret"` } そしてファイルを読み込みます。 // APIキーの取得 config, err := loadConfig() if err != nil { log.Fatal(err) } // 読み込む関数 func loadConfig() (Config, error) { // APIキーの取得 bytes, err := ioutil.ReadFile("./config.json") if err != nil { log.Fatal(err) } var config Config err = json.Unmarshal(bytes, &config) return config, err } トークンを取得する まずAPIを利用するためのトークンを取得する必要があります。コードは次のようになります。 POST /tokens リクエストして、その結果として得られるJSONの token.id の値がトークンになります。 今回の構造体は以下のようになります。 type Token struct { Value TokenValue `json:"token"` } type TokenValue struct { Id string `json:"id"` Expires string `json:"expires"` ClientId string `json:"client_id"` } そしてトークンを取得するコードです。 // トークンの取得 token, err := getToken(baseUrl, config) // トークンを取得する関数 func getToken(baseUrl string, config Config) (string, error) { url := baseUrl + "/tokens" params, err := json.Marshal(config) res, err := http.Post(url, "application/json", bytes.NewBuffer(params)) body, err := ioutil.ReadAll(res.Body) var token Token if err := json.Unmarshal(body, &token); err != nil { log.Fatal(err) } defer res.Body.Close() return token.Value.Id, err } CloudGarageのAPIでは {token: { id: ... }} といった具合にレスポンスのJSONがデータモデルのキーでラップされています。そのため Token と TokenValue のように一段階ネストした構造になっています。 契約情報の一覧を取得する トークンを取得したら、そのトークンを使って契約情報の一覧を取得します。こちらもまず構造体を定義します。 type ContractsJson struct { Value []Contract `json:"contracts"` } type Contract struct { Id int `json:"contract_id"` Status string `json:"contract_status"` ProductName string `json:"product_name"` UsedServerCount int `json:"used_server_count"` ContractDateFrom string `json:"contract_date_from"` ContractDateTo string `json:"contract_date_to"` Price int `json:"price"` PriceInit int `json:"price_init"` ResourceInfo ResourceInfo `json:"resource_info"` } そして契約情報の一覧を取得します。getはこの後の契約情報詳細を取得する際にも使います。GETリクエストを行って、その結果をバイト文字列で返します。 // 契約情報の一覧を取得 contracts, err := getContracts(baseUrl, token) func getContracts(baseUrl string, token string) ([]Contract, error) { url := baseUrl + "/contracts" body, err := get(url, token) var contractsJson ContractsJson if err := json.Unmarshal(body, &contractsJson); err != nil { log.Fatal(err) } return contractsJson.Value, err } // GETリクエストを行う処理 func get(url string, token string) ([]byte, error){ req, _ := http.NewRequest("GET", url, nil) req.Header.Set("Content-Type", "application/json") req.Header.Set("X-Auth-Token", token) client := new(http.Client) res, err := client.Do(req) body, err := ioutil.ReadAll(res.Body) defer res.Body.Close() return body, err } 契約情報詳細を取得する 契約情報IDを取得したら、さらに詳細を取得します。これは GET /contracts/{id} となっています。 構造体としては契約情報自体は変わらないので、そのモデルキーになる構造体だけ定義します。さらにCPUやメモリ、ストレージとしたリソース情報を入れる構造体も定義します。 type ContractJson struct { Value Contract `json:"contract"` } type ResourceInfo struct { CpuMax int `json:"cpu_max"` MemoryMax int `json:"memory_max"` DiskMax int `json:"disk_max"` CpuUsed int `json:"cpu_used"` MemoryUsed int `json:"memory_used"` DiskUsed int `json:"disk_used"` } そして契約情報の詳細を得るためのコードです。 // 契約情報の詳細を取得 contract, err := getContract(baseUrl, token, contracts[0].Id) log.Println(contract) func getContract(baseUrl string, token string, id int) (Contract, error){ url := baseUrl + "/contracts/" + strconv.Itoa(id) body, err := get(url, token) log.Println(string(body)) var contractJson ContractJson if err := json.Unmarshal(body, &contractJson); err != nil { log.Fatal(err) } return contractJson.Value, err } 結果として、次のような出力が得られます。 {114581 契約中 C4 1 2018/09/03 2959 0 {2 4 100 1 2 50}} Goの場合、構造体を作るのが若干の手間かも知れません。しかしCloudGarage APIのようにRESTfulの原則に則っていれば構造体の使い回しも効きます。Goのコードは見やすく書けますのでぜひ使ってみてください。 APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

ついに公開されたAPIをPythonから利用する(インスタンス一覧を取得&インスタンスを停止)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はPythonを使ってAPI操作を行う方法を解説します。インスタンスを一覧で取得した後、インスタンスを停止させる操作を行います。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 Python request APIキーを取得する まずはCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 トークンを取得する 次にAPIを利用するためのトークンを取得する必要があります。コードは次のようになります。 POST /tokens リクエストして、その結果として得られるJSONの token.id の値がトークンになります。 import requests import json config = json.load(open('./config.json', 'r')) def getToken(base_url, config): response = requests.post(f"{base_url}/tokens", data=json.dumps({ 'client_id': config['clientId'], 'client_secret': config['clientSecret'], }), headers={ 'Content-Type': 'application/json' } ) return response.json()['token']['id'] base_url = 'https://api.cloudgarage.jp' token = getToken(base_url, config) インスタンス一覧を取得する トークンを取得したら、それを使ってAPIにアクセスできます。次にインスタンス一覧を取得します。これは GET /servers になります。取得したJSONの servers 以下に配列で返ってきます。 def getInstances(base_url, token): response = requests.get(f"{base_url}/servers", headers={ 'X-Auth-Token': token, 'Content-Type': 'application/json' } ) return response.json()['servers'] servers = getInstances(base_url, token) インスタンスを停止する 最後にインスタンスを停止させます。今回はインスタンス一覧の最初のインスタンスを止めてみます。これは POST /servers/operate になります。operateとして今回はSTOP(停止)を指定します。他にもSTART(起動)、RESTART(再起動)、RESTART_HARD(強制再起動)があります。 def stopInstance(base_url, token, id): response = requests.post(f"{base_url}/servers/operate", data=json.dumps({ 'operate': 'STOP', 'servers': [ id ] }), headers={ 'X-Auth-Token': token, 'Content-Type': 'application/json' } ) return response.json() response = stopInstance(base_url, token, servers[0]['id']) 処理が成功した時のレスポンスです。resultに success が入ってきます。 { "operation_results": [ { "result": "success", "resource_id": "ebe...26a" } ] } 失敗時です。すでにインスタンスが停止しているとエラーになります。 { "operation_results": [ { "result": "instance is invalid state for operate : STOP", "resource_id": "ebe...26a" } ] } まとめ Pythonの場合はHTTPリクエストを標準ライブラリだけでも行えますが、requestライブラリがある方がより簡単です。HTTPリクエストを行うのはとても簡単なので、Pythonを通じてAPIをコールするコードを書くのは容易でしょう。 APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

ついに公開されたAPIをRubyから利用する(インスタンス一覧を取得)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はRubyを使ってAPI操作を行う方法を解説します。インスタンスを一覧で取得します。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 Ruby APIキーを取得する まずはCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 トークンを取得する 次にAPIを利用するためのトークンを取得する必要があります。コードは次のようになります。 POST /tokens リクエストして、その結果として得られるJSONの token.id の値がトークンになります。 require 'openssl' require 'net/http' require 'uri' # JSON加工用に必要 require 'json' # 設定 config = JSON.parse(open('../config.json').read) base_url = 'https://api.cloudgarage.jp' # トークンを取得 def getToken(base_url, config) uri = URI.parse("#{base_url}/tokens") https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_PEER req = Net::HTTP::Post.new(uri.request_uri) req["Content-Type"] = "application/json" req.body = { client_id: config['clientId'], client_secret: config['clientSecret'] }.to_json res = https.request(req) JSON.parse(res.body)['token']['id'] end インスタンス一覧を取得する トークンを取得したら、それを使ってAPIにアクセスできます。次にインスタンス一覧を取得します。これは GET /servers になります。取得したJSONの servers 以下に配列で返ってきます。 # インスタンス一覧を取得 def getInstances(base_url, token) uri = URI.parse("#{base_url}/servers") get(uri, token, 'servers') end # GETリクエスト用 def get(uri, token, key) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_PEER req = Net::HTTP::Get.new(uri.request_uri) req["Content-Type"] = "application/json" req["X-Auth-Token"] = token res = https.request(req) JSON.parse(res.body)[key] end インスタンス詳細を取得する インスタンス一覧では詳細情報までは分かりません。そこでさらにインスタンス一覧で取得したIDを使って詳細情報を得ます。 GET /servers/{resourceId} で情報が得られます。 # インスタンス詳細を取得 def getInstance(base_url, token, instance_id) uri = URI.parse("#{base_url}/servers/#{instance_id}") get(uri, token, 'server_detail') end 出力する インスタンス詳細情報を出力すると以下のようになります。 { "id": "ebe...26a", "name": "open-lambda", "addresses": [ { "address": "192.168.0.20", "mac_address": "fa:16:3e:30:aa:aa" }, { "address": "203.000.000.000", "mac_address": "fa:16:3e:30:aa:aa" } ], "instance_status": "ACTIVE", "contract_id": 114581, "instance_created_time": "2018-12-02T01:45:18Z", "instance_updated_time": "2018-12-02T01:45:55Z", "security_rules": [ { "protocol": null, "direction": "ingress", "ether_type": "IPv4", "port_range_min": null, "port_range_max": null, "remote_ip_prefix": "0.0.0.0/0" } ], "os_image": { "id": "a6...57", "os_type": "Linux", "os_distro": "UBUNTU", "os_version": "18.04_64bit", "image_type": "Linux", "image_name": "Ubuntu-18.04-64bit" }, "instance_spec": { "cpu": 1, "memory": 2, "disk": 50 } } インスタンスのスペックをはじめとして、ネットワーク情報やセキュリティルールなども取得できます。 まとめ Rubyの場合は基本的な操作を行う上で追加のライブラリは必要ありません。HTTP POST/GETなどのメソッドはまとめてしまえば、より簡単にCloudGarageを操作できるようになります。ぜひお使いください! APIリファレンスはCloudGarage API リファレンスにありますので、ぜひご覧ください。

レポート&解説:CloudGarage + Plesk 無料ハンズオンセミナー @福岡

イベント・勉強会
セッションチーム

#CloudGarage Advent Calendar 2018 、21日目の記事です。 皆さん、こんにちは。なにしよっと CloudGarageセッションチームのナカエです。 12月14日(金)に福岡天神で開催しました「CloudGarage + Plesk 無料ハンズオンセミナー」につきましてレポートいたします。 当イベントは合同会社01wave様、Plesk Japan様にご協力いただき催行されました。 誠にありがとうございます。 ■ハンズオンイベントの流れ 最新版 Plesk Onyx 17.8を使って複数のWordPressサイトを管理する際の操作方法をハンズオン形式で下記STEPに沿ってレクチャしました。 STEP.1 CloudGarageを利用してPleskインスタンスを立ち上げる。 STEP.2 Pleskのコントロールパネルにアクセスする。 STEP.3 Pleskコントロールパネルでメールアドレスを作成する。 STEP.4 WordPress ToolKitをインストールし、WordPressを操作する。 _WordPress、及びプラグインなどをアップデート(個別&一括) _メンテナンスモードの設定方法 _WordPressサイトの複製(運用中のサイトを数分で複製!) _複製したサイトでPHPのバージョン変更など、もろもろ試す _改修した複製サイトを本番サイトへ同期 STEP.5 WordPress ToolKitを使ってマイグレーションを行う _現在サーバにあるWordPressをPleskのある別サーバに移行。 (これすごい!) ■STEPごとの操作 STEP.1 https://www.youtube.com/watch?v=_O1SumDKOz8 今回のイベントではPlesk様より無償ライセンスキーが配布されましたので、 動画内(0:13-あたり)のPleskライセンスキーのオプション購入は省きました。 STEP.2-5 https://www.slideshare.net/ssusere3d53c/fukuoka-handsondec142018sh STEP2-5については上記スライドを確認しながら作業をすすめることができます。 また補足資料として、Plesk町田様より #CloudGarage Advent Calendar 2018 の中で以下の説明ブログを執筆頂いております。 こちらも合わせてご参照いただくと、より知識を深まります。 WordPressサイトを手軽に移設してみる。 - Plesk_JP’s blog https://plesk-jp.hatenablog.com/entry/2018/12/04/195825 CloudGarage + PleskOnyxでWordPressを5.0にしてみた。 - Plesk_JP’s blog https://plesk-jp.hatenablog.com/entry/2018/12/11/115342 PleskのWordPress Toolkitを使い倒してみる。 - とあるコンパネ屋さん https://plesk-jp.hatenablog.com/entry/2018/12/16/150619 いかがでしたでしょうか? ハンズオンイベントに出席できなかった方でも、この動画や資料に沿ってすすめて頂ければ、CloudGarageでPlesk WordPress ToolKitを操作頂けると思います。 特に複数のWordPressサイトを管理されている方や、サイトのリニューアル・移行にお困りの方は是非とも一度お試しください。 めちゃくちゃ便利です。 ■おまけ ハンズオンイベント後は合同会社01wave様主催のパーティ「BigName交流会」に参加させて頂きました。 こちらも大変楽しかったです!特に01wave様のイベントを盛り上げる仕掛けつくり・ホスピタリティが抜群でした。 当日の様子は01wave様、制作会社リクト様が記事にして頂いておりますので、こちらもぜひ 合同会社01wave blog:BigName交流会 ご参加ありがとうございました!! https://01wave.jp/post-1774/ Webマガジンリクトマグ:その道のプロが集まる、第2回BigName交流会へ参加してきた! https://lctmag.media/lct_blog/2566/ --------------------------- そんなわけでCloudGarageはこれからも、色々な地域、コミュニティ、ユーザーの皆様とこういったイベントを行って参ります。 もしご一緒できるイベントなどございましたら、「CloudGarageさん、イベントしない?」とFacebookやTwitterでお気軽にメッセージくださいませ。 それではまた! https://instagram.com/p/BrW7syGBRyY/

ついに公開されたAPIをNode.jsから利用する(イメージ取得)

TECH
中津川 篤司

CloudGarageのインスタンス操作などを自動化できるAPIがついに公開されました。これでインスタンスの立ち上げや停止を自動化できるようになります。 そこで今回はNode.jsを使ってAPI操作を行う方法を解説します。まずはインスタンスイメージの取得です。 必要なソフトウェア、ライブラリ 今回必要なソフトウェア、ライブラリは以下の通りです。 Node.js superagent プロジェクトのベースの作成する Node.jsのインストールが終わっていることとして、まずは適当なディレクトリを作成し、その中でNode.jsプロジェクトのベースを生成します。 npm init 続いて必要なライブラリである superagent をインストールします。 npm i superagent -S APIキーを取得する 続いてCloudGarageの管理画面にてAPIキーを取得します。管理画面の右上にあるメニューをクリックして、アカウント情報確認/変更を選択します。 一度パスワードを入力する必要があります。 そして一番下にあるAPI Key管理にてAPI Keyを発行します。私はすでに発行済みなので再発行になっていますが、最初はAPIキーがないはずです。Client ID(クライアントID)とClient Secret(クライアントシークレット)の二つで認証します。重要なキーなので漏洩したりしないよう注意してください。 トークンを取得する まずAPIを利用するためのトークンを取得する必要があります。コードは次のようになります。 POST /tokens リクエストして、その結果として得られるJSONの token.id の値がトークンになります。 const config = require('../config'); const request = require('superagent'); const baseUrl = 'https://api.cloudgarage.jp'; const getToken = async (config) => { const response = await request .post(`${baseUrl}/tokens`) .send({ client_id: config.clientId, client_secret: config.clientSecret }); // トークン文字列 return response.body.token.id; } 今後のリクエストはこのトークンを X-Auth-Token ヘッダーに適用すれば良いだけです。 イメージ一覧を取得する では今回はOSイメージの一覧を取得します。これは GET /images リクエストになります。 const getImages = async (token) => { const response = await request .get(`${baseUrl}/images`) .set('X-Auth-Token', token) .send() return response.body.images; } これでOSイメージの一覧が返ってきます。 実行例 例えば今回のコードを以下のように実行します。 (async (config) => { try { const token = await getToken(config); const images = await getImages(token); console.table(images); } catch (e) { console.error(e); } })(config); そうすると結果が以下のように返ってきます(一部抜粋)。 ┌─────────┬────────────┬─────────────────────────────────┬─────────────────┬──────────────┬─────────┬────────────┐ │ (index) │ size │ image_id │ image_name │ os_distribution │ os_version │ os_type │ image_type │ ├─────────┼────────────┼─────────────────────────────────┼─────────────────┼──────────────┼─────────┼────────────┤ │ 0 │ 1612185600 │ '38...aa' │ 'CentOS-6.10-32bit' │ 'CENT_OS' │ '6.10_32bit' │ 'Linux' │ 'OS' │ │ 1 │ 1029636096 │ 'b1...71' │ 'CentOS-6.10-64bit' │ 'CENT_OS' │ '6.10_64bit' │ 'Linux' │ 'OS' │ │ 30 │ 2964258816 │ '21...b9' │ 'minecraft20181111' │ │ │ │ 'PRIVATE' │ └─────────┴────────────┴───────────┴─────────────────────┴─────────────────┴──────────────┴─────────┴────────────┘ インスタンスを立ち上げる際にはこの中の image_id を使って行います。 まとめ Node.jsの場合、HTTPリクエスト用ライブラリのSuperagentとawait/asyncを組み合わせることでネットワークの非同期処理が簡単に書けます。APIリファレンスはCloudGarage API リファレンスにありますので、ご覧ください。

Web開発のためのクラウドサーバー選び

動画・自由研究
クラガレラボチーム

#CloudGarage Advent Calendar 2018 の17日目の記事です。 Web開発をするために必要なものといえば、プログラミングスキルやシステム構成の検討、コーディング運用などアプリケーション特有のものが多く挙がりますが、アプリケーションを載せるサーバーも必要となります。Web開発をする際には、アプリケーションのことだけを考えていれば良いと思われがちですが、サーバーの運用方針の影響を受けることが多々あります。 そこで今回は、Web開発をするためのクラウドサーバー選びについてご紹介していきます。まずは、サーバーの選択肢にどのようなものがあるか確認し、その上でどのようなクラウドサーバーを選択すればいいのか見ていきましょう。 Web開発のためのサーバーの選択肢 Web開発のためのサーバーは、技術が進化するにつれて選択肢が多くなっています。それぞれのサーバー環境を選んだ時、どのようなメリット・デメリットがあるのか確認していきましょう。 - ローカル環境 ここでのローカル環境とは、Windows10やWindows7がOSとしてインストールされているようなPCを指します。誰かのサービスを利用するのではなく、自分のPCにアプリケーションを構築していくため、もちろん申し込みなどの手続きは不要で、すぐにWeb開発を始めることができます。また、自分のPCであるため、Web開発に必要なモジュールやアプリケーションがあれば、すぐにインストールすることも可能です。 一方、PCのスペックには限度があり、大人数がアクセスするようなWebアプリケーションに耐えることができません。その場合には、スペックが高いサーバーへ移行する必要があり、その移行作業に時間を要することもあります。 - オンプレミス環境 オンプレミス環境とは、物理的なサーバー機器を使って構築する環境のことです。サーバー機器を利用するため、OSのインストールなどイチからセットアップする必要があり、インフラに関する知識が必要となります。さらに、サーバー機器を設置する場所にも考慮が必要で、地震や停電などに対応でき、冷却設備も整った専用の設置場所を用意する必要があります。 一方、スペックはローカル環境よりも優れているため、本番リリース後にスペック不足が大きな問題とならない限り、アプリケーションの移行作業は発生しません。また、ローカル環境と同様に、管理者権限も持っているため、社内のIT運用ルールにもよりますが、比較的容易にアプリケーションに必要な環境を整えることができるでしょう。 - レンタルサーバー ここからはクラウドで利用できるサーバーの紹介に入ります。レンタルサーバーは、ベンダー企業が保有しているサーバーの一部を利用者へ貸出するサービスです。サーバーの基本的な設定は、ベンダー企業が実施済みであるため、利用者が行う必要はありません。ただ、レンタルサーバーを利用するためには手続きが必要であり、サーバーの権限も絞られているため、自分でカスタマイズできる範囲が限られます。さらに、ベンダー企業ごとにサーバーの管理範囲が異なるため、Web開発をしていく中で、うまくいかない場合にはベンダー企業へ都度問い合わせが必要となります。 - クラウドサーバー こちらもベンダー企業へ利用開始の手続きが必要となりますが、レンタルサーバーよりも自由にサーバーの設定をすることができます。OSやCPUの数、メモリ容量やディスク容量など、開発するWebアプリケーションの規模に応じて、サーバーのスペックを調整することが可能です。また、管理者権限を取得できるサービスも多く、ある程度サーバーのカスタマイズが可能です。 クラウドサーバーの中には、OSをインストールした状態で利用開始するものもあり、その場合にはOSの各種設定など、インフラの基本的な設定を行う必要があります。 - SaaS環境 SaaS環境とは、サーバー機器だけではなく、WindowsなどOSレベルの管理もベンダー企業が実施するサービスです。利用者は、Web開発をすることだけに専念することができます。もちろんインフラに関する構築や運用は不要で、利用開始手続き後には、すぐにコードを打ち込み始めることができます。インフラの運用はベンダー企業が行うため、突発的なメンテナンスやトラブルに巻き込まれる可能性はあります。また、SaaS特有の使い方があるため、慣れるまでには多少時間が必要です。 サーバーを選ぶならやっぱりクラウド ここまでWeb開発のためのサーバーの選択肢を見てきましたが、構築・運用の容易さや利便性を踏まえると、クラウドサーバーを選択することの方がメリットが多いです。クラウドサーバーの中でも、下記の条件に当てはまるサービスを選ぶようにしていきましょう。 【1. 気兼ねなく作り直しが可能】 クラウドサーバーのメリットは、イチからサーバーを構築する必要が無いというところです。そのため、クラウドサーバーのバックアップを取得していれば、何かトラブルなどが発生したとしても、すぐにバックアップを取得した時点でサーバーを再構築することが可能です。自由にバックアップを取得し、リストアができるサービスは必須ですね。 【2. 検証/本番環境がすぐに作れる】 Web開発では開発した後に検証を行い、バグが見つかれば修正し、正常な動作が確認できた時点で本番リリースを行います。そこで重要となるのは検証するための環境です。本番リリース後も、設定変更が入る可能性は十分にあるため、検証環境と本番環境は分けて構築しておきたいところです。クラウドサーバーでは、環境を分けてサーバーを構築できるサービスを選びましょう。 【3. インフラ環境の設定をすぐに変更可能】 Web開発を進めていく上で、うまくパフォーマンスが出ない、すぐにCPUが100%に張り付いてしまうなど、サーバーリソースの問題が発生する可能性は多々あります。そんな時、クラウドサーバーの設定を変更するだけで、Webアプリケーションの再開発など必要なく、それらの問題に対処することができます。 まとめ 「クラウド」という概念が登場したおかげで、Web開発にとってもこれまで実現できなかったことが、比較的容易にできる時代となりました。クラウドのメリットをサービスに取り込んでいるクラウドサーバーを選び、Web開発にうまく活用していきましょう。

Linuxエディタチートシートまとめ

TECH
中津川 篤司

皆さん、エディタは何を使っていますか。エディタというと宗教戦争を起こしやすいので、気をつけないといけない話です。ローカルのパソコンではVS CodeやAtomなどが人気ですが、サーバにログインした際には別なエディタを使うのが一般的ではないでしょうか。個人的にはEmacs派なのですが、大抵のサーバ用Linuxではデフォルトではインストールされていません。そのためviやnanoを使う人も多いかと思います。 今回はそうした各種エディタのチートシートを紹介します。これを手元に置いておけば、不慣れなエディタであっても最低限戸惑わずに操作できるようになるでしょう。 vi viは高機能なエディタなので、コマンドもとても多いです。Webブラウザから使うのであればVim Cheat Sheet - 日本語を覚えておくといいでしょう。印刷しておく場合にはPDF版を手元においておくと便利です。 nano nanoはシンプルなエディタで、画面下にショートカットキーが表示されています。何よりCtrlキーを基本として入力するので、WindowsなどのGUIエディタ風に操作できるのが魅力です。Web版のチートシートはNano text editor command cheatsheet | Codexpediaに、PDF版はこちらにあります。 ed edはほとんどのLinuxディストリビューション、UNIXでインストールされています。キーバインドが若干特殊ですが、viに似ています(実際には逆で、edがviに影響を与えていますが)ので覚えやすいと思います。Web版のチートシート、PDF版のチートシートがそれぞれあります。 Emacs Emacsは逆にほとんどのディストリビューションでデフォルトインストールされていません。そのため、あえてEmacsをインストールしているということは敢えてチートシートを見ることはないと思いますが…とはいえ、キーバインドが多いので忘れてしまうこともあるでしょう。Web版もありますが、個人的にはSoftware Design社のPDF版がお勧めです。 エディタの使い方によって生産性であったり、開発効率は大幅に変わってきます。誤った操作であったり、操作方法を知らないためにいらいらすることもあるでしょう。チートシートを積極的に活用してスムーズにサーバ操作を行いましょう!

2018年振り返り_広告おじさんがバナナおじさんになるまで。

TECH
バナナ かじる

#CloudGarage Advent Calendar 2018 12/13更新です。 こたつとホットカーペットの隙間から出られません。どうも、バナナです。 2018年も残りわずか、「師走」と書いて師を走らせる12月、自分はこたつに還りつつ2018年を振り返ってみます。 広告おじさんから、ディレクションおじさんへ・・・ 2018年1月、Web広告担当として「昨日読んだマンガの感想を社内slackにアップする」業務に勤しんでいたところ、CloudGarageチームからお声がけをいただきました。会社的なほにゃららがあったため事実上NHN JAPANへの移籍となります。レアル・マドリードにでも所属しない限り移籍なんて経験すること無いと思ってたので、せっかくなので初めての移籍をキメることにしました。 ディレクションおじさんから、出張おじさんへ・・・ CloudGarageチームではWebディレクションを担当しました。社内調整がメイン業務ですが、Webディレクター関連のイベントに参加する機会もいただけました。北は北海道から南は山口県まで(あまり南行かなかった)、全国津々浦々を行脚し、大変貴重な体験をさせていただきました。。。 貴重なとんぺい焼き。。。 https://twitter.com/supo48000/status/1004662702059368448 貴重な海鮮丼。。。 (世界中の北海道出張を命じられた海鮮好きよ...聞こえますか...あなたの心に直接語りかけてます...新千歳空港内の「ふく亭」に行くのです...新鮮なウニイクラカニを味わいなさい...時間がなくてもすぐ行けます...""'お茶漬け"""もできます...むしゃしゃうめええええ... pic.twitter.com/xE5iwkKdCP— supo.from賛否両論 (@supo48000) 2018年10月14日 貴重なジンギスカン。。。 松尾...ありがとう...それ以外の言葉が見つからない...#mtddc pic.twitter.com/fPHi6MBFtF— supo.from賛否両論 (@supo48000) 2018年6月9日 とても貴重でした。うまぁ。 特にフロントエンドに携わる方々や、ディレクターの皆さんが集まるイベントに参加させていただき、いくつかセッションの機会もいただきました。WordBench山口、札幌ひよこ会のみなさま、楽しいお時間をありがとうございました。 北海道では↓のセッションをさせていただきました。飛行機の中でスライドつくってました(酔 この時は何も考えずつくってましたが、ここから私のバナナ街道は始まってたようです。。。(後述 出張おじさんから、バナナおじさんへ・・・ 出張おじさんを経て、ユーザーの皆様と接点を持つ機会をいただけるようになり、嬉しいことにイベントなどでお会いするたびに声をかけていただけるようになりました。社内でディレクションするか家でゲームするか、圧倒的ひきこもりインドア派の自分にとってはこの上ない喜びでした。ちょうど同タイミングでLIG様への掲載もあり、多くの方とお話ができるようになりました。 速くて安いって…最高やな!アメ横で、超高速で有名なサーバーを秒速でベロベロに酔ってPRした話。 イベントにお越しいただく皆様が、私の顔を見るなり「おっすバナナ。」「今日はNOバナナ?」などと声をかけてくれるようになったのもこの頃です。こちらの記事のせいおかげですね。ありがたいことです。 そして伝説へ・・・ 振り返ってみると色々と新しい経験ができた1年でした。あとメシばっかくってました。 チームに加入して右も左もわからない状態の自分から、皆さまのご厚意により「なんか知らん人が来た」から「人畜無害のおじさんが来た」を経て、「とりあえずあのバナナに聞いてみよう」にまで至れたので、自分としては有意義な一年になりました、感謝ですm(_ _)m CloudGarageチームは、これからも皆様との交流を大切にしていければと考えています。全国各地どこでもお伺いします、お気兼ねなくお声掛けください。沖縄まだ行ったことないです(緩募 来年もよろしくお願いいたします。

データベース別コマンドチートシート

TECH
中津川 篤司

WebアプリケーションやWebサービスを開発する際にデータベースは欠かせません。最近ではO/Rマッパーを使うことも増えているのでSQLを直接書く機会は失われているかも知れません。しかし、だからこそSQLを書かないといけない時に手が動かなくなってしまいます。 今回は有名な各種データベースに合わせて、そのチートシートを紹介します。チートシートをブックマークしておけば、いざという時にすぐにSQLやデータベース専用のコマンドを打てるでしょう。 MySQL LAMPスタックで一躍有名になったデータベースです。Oracleに買収された後、MariaDBなどの派生版も出ていますが、基本的なコマンドは変わりないようです。以下がMySQLのチートシートになります。 MySQL Cheat Sheet 日本語版であれば下記が便利です。 MySQLチートシート - Qiita PostgreSQL 堅牢で高機能なオープンソースデータベースとして知られるPostgreSQLです。PostGISのような位置情報系を扱う際にもよく利用されます。以下は英語版のチートシートです。 PostgreSQL Cheat Sheet - Download the Cheat Sheet in PDF Format 日本語版は同じくQiitaの下記が便利です。 PostgreSQLコマンドチートシート - Qiita Oracle 商用データベースとしては最も有名なOracleです。機能がかなり多いので、チートシートもボリュームがあります。下記は英語版です。日本語では良さそうなチートシートがなく、基本は書籍の購入になりそうです。 Oracle Database/SQL Cheatsheet - Wikibooks, open books for an open world SQL Server Microsoft社のデータベース、SQL Serverのチートシートです。画像のものもあるのですが、元サイトでは配布をやめてしまったのでPinterestにあるだけです。 PDF 変わったところではFORMAT関数のチートシートや文字列関数のチートシートもあります。 MongoDB NoSQL、ドキュメント型データベースです。位置情報の取り扱いが容易で、地図系サービスやアプリで利用が多い印象があります。以下は英語版のチートシートです。 MongoDBチートシート(PDF) 日本語版では以下が非常にまとまっています。 MongoDBチートシート - Qiita SQLite3 SQLite3は各プログラミング言語から使えて、あえて別途サーバを立てたりする必要がないファイルベースのデータベースです。英語版のチートシートは以下があります。 SQLite Cheat Sheet 日本語版は以下です。 SQLite3 チートシート - Qiita データベースが用いるSQLは標準SQL規格があり、方言は大幅に減っています(とはいえ、まだまだありますが)。O/Rマッパーはそうした方言を吸収してくれますが、直接SQLを書く場合にはそうはいきません。最適なSQLを書くため、データベースを管理する際にはそのデータベースに特化した書き方になるでしょう。不慣れなデータベースを扱う際には、ぜひチートシートを使ってみてください。

ユーザー利用率調査:OSシェア

動画・自由研究
セッションチーム

皆さん、こんにちは。 CloudGarageセッションチームより#CloudGarage Advent Calendar 2018 、10日目の記事を公開します。 昨日はyassan168さんより「CloudGarageを使ってお手軽にRedmineのModern UX化プロジェクト「Project Opal」を試してみる 」でした。こちらもぜひ。 今回は2017年7月よりサービスを開始してから1年半ほど経ちましたCloudGarageのユーザー利用率調査を報告したい思います。 第一弾となりますお題は「OSシェア」です。 (なお、集計は2018年10月までの累計となります。) CloudGarageで利用されているLinuxディストリビューションはCentOSが最も多く、これにUbuntu、Debianが続いています。 CentOS、Ubuntu、Debianのシェアの合算値は97%となっております。 また今回の集計は2018年11月6日に行いました「OSイメージ追加」以前のデータ集計のため、新たなイメージ追加によってシェアがどのように変遷していくかは楽しみなところです。   ※本記事は掲載時点の情報であり、最新のものとは異なる場合があります。予めご了承ください。

ページトップへ