簡単!さくらのVPSにcoreOSをインストールする方法

さくらのVPSを契約直後の状態から10〜15分程度でインストールが完了します。

SSHで準備する

SSHでログインしてインストールに必要なファイルを収集します。
sshならコピー&ペーストできるので、この後のコンソール操作で手が抜けるようにこの段階で出来るだけ纏めておきます。

cloud-init

まだ勉強中なので最低限の設定だけしています。

static.networkの[Match]で悩んでる方が多いですがeth*は非推奨みたいなのでMACAddressで良いのではと思ってますが機種に依存する設定は省きたいし難しいですね←アドバイスお待ちしております

mkdir -p /tmp/work
export VPS_IP=160.16.83.xx          # VPSのIPアドレス
export VPS_GATEWAY=160.16.82.1      # VPSのGATEWAYアドレス
export VPS_DNS1=210.188.224.10      # プライマリDNS
export VPS_DNS2=210.188.224.11      # セカンダリDNS
export VPS_MAC=9C:A3:BA:01:CD:F1    # MACアドレス
export NTP_SERVER=ntp1.sakura.ad.jp # sakura以外ならntp.nict.jpが便利
export ETCD_HOST=`curl -s https://discovery.etcd.io/new` # ディスカバリー用アドレスを発行する
cat > /tmp/work/cloud-config << EOT
#cloud-config
hostname: $HOSTNAME
coreos:
#  etcd:
#    discovery: $ETCD_HOST
#    peer-addr: $VPS_IP:7001

  units:
#    - name: etcd.service
#      command: start
#    - name: fleet.service
#      command: start
    - name: docker.service
      command: start
    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=set the timezone

        [Service]
        Type=oneshot
        ExecStart=/usr/bin/timedatectl set-timezone Asia/Tokyo
        RemainAfterExit=yes
    - name: swap.service
      command: start
      content: |
        [Unit]
        Description=Turn on swap

        [Service]
        Type=oneshot
        Environment="SWAPFILE=/swapfile"
        Environment="SWAPSIZE=1GiB"
        RemainAfterExit=true
        ExecStartPre=/usr/bin/sh -c '/usr/bin/fallocate -l \${SWAPSIZE} \${SWAPFILE} && chmod 0600 \${SWAPFILE} && /usr/sbin/mkswap \${SWAPFILE}'
        ExecStartPre=/usr/sbin/losetup -f \${SWAPFILE}
        ExecStart=/usr/bin/sh -c "/sbin/swapon \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)"
        ExecStop=/usr/bin/sh -c "/sbin/swapoff \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)"
        ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)"

        [Install]
        WantedBy=multi-user.target

    - name: static.network
      content: |
        [Match]
        MACAddress=$VPS_MAC

        [Network]
        Address=$VPS_IP/23
        Gateway=$VPS_GATEWAY
        DNS=$VPS_DNS1
        DNS=$VPS_DNS2

write_files:
  - path: /etc/ntp.conf
    content: |
      server $NTP_SERVER
      restrict $NTP_SERVER kod nomodify notrap nopeer noquery
      restrict default ignore
      restrict 127.0.0.1

ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEA5BqkP+ToroYtzOhnZ2aOJj8WqUpRcQRy/D2ojlPsQutM9Pqfo3qI+75iLpTAAkt+X0RlSBNFLfLsDgfV45IWS/5jv7CKLF/AAIU8Ke5wKVXZrC1LkZ7HfnluALhepUkeB3ilrhFQS+qeS8LHw2s2C2Ig/bGj8lXuEyt93aSREIU= makoto@2ch.to
EOT

※公開鍵は自分のに書き変えてください。

ファイルの収集

installerの中で呼ばれるコマンドや設定ファイルを準備します。
(コンソールでviとか面倒臭いので出来るだけこの段階で用意しましょう)

cp /sbin/{blockdev,wipefs,blkid} /tmp/work/
cp /bin/{mktemp,sed,grep,bash,lsblk,env,mkdir,rm,mount,umount,echo,cp} /tmp/work/
cp /usr/bin/{tee,wget,gpg,bzip2,which} /tmp/work/
(cd /tmp/work && ln -f bzip2 bunzip2)
echo 'nameserver 8.8.8.8' > /tmp/work/resolv.conf
coreos-install

coreOSのインストーラー本体をダウンロードして他のファイルと共にアーカイブします。
不要ファイルは削除しておきましょう。

wget -O /tmp/work/coreos-install https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install
(cd /tmp/work && tar cf /work.tar ./)
rm -rf /tmp/work/
sync

VNCコンソールを立ち上げる

コントロールパネルからカスタムOSインストールを選択して「CentOS7 x86_64」をインストールするVNCコンソールを立ち上げます。
(/dev/vdaを解放した状態でシェルが使いたいだけなので互換性のあるOSならなんでもかまいません)

「Troubleshooting」を選択

「Rescue a CentOS system」を選択

「Skip」を選択


coreOSをinstallする

しばらくするとシェルが立ちあがりますのでまずは先ほど作成したwork.tarを取り出します。

mkdir -p /mnt/root
mount /dev/vda3 /mnt/root
tar xf /mnt/root/work.tar -C /tmp
umount /mnt/root

coreOSのinstall中にネットワークが必要になるのでネットワークを有効にします。

ifconfig eth0 160.16.83.xx(IPアドレス)/23
route add default gw 160.16.xx.1(ゲートウェイ)
cp /tmp/resolv.conf /etc/

「coreos-install」を実行します。

export PATH=$PATH:/tmp/
bash /tmp/coreos-install -d /dev/vda -C stable -c /tmp/cloud-config

「Success! CoreOS stable current is installed on /dev/vda」と表示されたらシャットダウンし、コントロールパネルから起動します。
(rebootだとカスタムOSインストールが終わらないのでシャットダウンが必要です)

インストール完了

パスワードは設定されてないのでSSH秘密鍵を使ってcoreユーザーにログインします。
初回ntp.confの書き換えがntpdの起動後になるのでntpdの再起動が必要です。

jQuery.Deferredを使って非同期ループしよう!

突然ですが、Deferred使ってますか?

jQuery.DeferredとはjQueryのバージョン1.5から導入された、非同期処理をうまく扱うための標準モジュールです。
使いこなすことで、以下のような効果が見込めます。

  • 非同期処理を連結する際、コールバック地獄から解放される(直列処理、並列処理が可能)
  • エラー処理をうまく記述できる
  • 一連の非同期処理を関数化して再利用しやすくできる

って説明される事が多いかと思います。
利用方法を説明してるサイトもいっぱいあります。

…が非同期に慣れてない方や、とりあえずjQueryは触れるよ!くらいの人だとすごくわかりにくい動きになっています。

そこでjQuery.eachと同じように使えるにプラグインを書いてみました。

jquery-asyncEach.js

if(jQuery) !function($){
	'use strict';
	if( typeof $.asyncEach === 'undefined' ){
		// setTimeoutとDeferredを使い非同期にする関数
		var async = function($callback){
			var $dfd = $.Deferred();
			setTimeout(function(){
				$callback($dfd);
			},0);
			return $dfd.promise();
		};
		// $.asyncEachメソッド本体
		$.asyncEach = function($array,$callback,$thisArg){
			if( typeof $thisArg === 'undefined' ) $thisArg = $array;
			//$arrayが大量だった時に$whenを作るのに時間がかかるのでいきなり非同期化
			return async(function($dfd){
				//$arrayの要素を1個づつ非同期化
				var $when	= $.map($array,function($value,$index){
					return async(function($dfd){
						return $callback.call($thisArg,$dfd,$value,$index);
					});
				});
				//$whenが全てresolveするとdone、ひとつでもrejectするとfailする
				return $.when.apply($,$when)
					.done(function(){
						//argumentsを配列に変換して返す
						var $_ = [];
						$_.push.apply($_,arguments);
						return $dfd.resolve($_);
					})
					.fail(function(){
						var $_ = [];
						$_.push.apply($_,arguments);
						return $dfd.reject($_);
					})
				;
			});
		};
	}
}(jQuery);

テストコード

jQuery.js、jquery-asyncEach.jsの順で読み込んで実行してください。

!function(){
	console.log('最初に表示される');
	$.asyncEach([1,2,3,4,5,6,7,8,9,10],function($dfd,$value,$index){
		//ここに重い処理(…の、かわりにランダムで待たせてから返す)
		var $r = Math.floor( Math.random() * 1050 );
		setTimeout(function(){
			//どちらかを使って返り値を返す
			// $dfd.resolve() = 処理成功
			// $dfd.reject()  = 処理失敗
			return $r <= 1000
				? $dfd.resolve($value * 2)
				: $dfd.reject($value + 'がキモイ');
		},$r);
	}).then(//.done,.failでもいい
		function($result){
			console.log('重い処理が全部終わったら呼ばれる');
			console.log($result);
		},function($result){
			console.log('途中でrejectされたら呼ばれる');
			console.log($result);
		}
	);
	console.log('asyncEachは非同期なので2番目に表示される');
}()

「ほぼiphone」じゃダメなんでしょうか?

今年の夏モデルこそは!と期待してましたがやっぱり出ませんでした。
あきらめてiPod touch + IIJmio高速モバイル/Dサービス + モバイルルーターはいかがでしょうか?
iPod touchでは皆大好きsiriも動くそうです。

最初に必要な物

amazonなので日によって値段は変わりますが送料入れても7万円でお釣りがくる程度で購入できます。

IIJmio高速モバイル/Dサービス」って?

IIJmio高速モバイル/Dサービス」はdocomo回線のMVNOです。
通常は200kbpsに制限されていますがクーポンを利用(アプリでon/offできます)するとLTE/3Gの最大値まで利用可能になります。
購入したSIMをそのまま利用すると500MBで使えなくなってしまうので以下のどちらかにアップグレードします。

  • ミニマムスタートプラン 月額945円
  • ライトスタートプラン 月額1,974円(毎月1GB分のクーポンが付いてくる) ←よく使うのであればこっちがオススメ

IIJmioのFAQを見ると「050 plus」で安定した通話ができます。
アップデートは自宅で行うようにして必要な時だけクーポンを使う癖をつければライトスタートプランで十分運用が可能です。

音声通話はできません

lineでいいんじゃないか?って気もしますが、どうしても電話番号が必要なら「050 plus」を利用する事で月額315円で電話番号を取得できます。

かいちゃった(//▽//

ちゃんと探せばありそうだけど見つからないので…

かいちゃった(////

数字をKB,MB,GB等に変換する関数

(function($size,$fixed,$unit){
	return function($size,$fixed,$unit){
		var $len	= ($size.length > $unit.length ? $unit.length : $size.length) - 1;
		return {
			size	: Number($len > 1 ? $size[$len] + '.' + $size[$len-1] : $size[$len]).toFixed($fixed),
			unit	: $unit[$len],
			toString: function(){return this.size+this.unit}
		};
	}(
		(
			function($size){
				while($size != ($size = $size.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
				return $size;
			}( new String($size) )
		).split(/,/).reverse(),
		typeof($fixed) === 'undefined' ? 0 : $fixed,
		typeof($unit ) === 'undefined' ? 'Byte,KB,MB,GB,TB,PB,EB,ZB,YB'.split(/,/) : $unit
	);
}(Math.pow(10,9),2) ).toString();

数字をKB,MB,GB等に変換する関数(簡易版,2^10で計算)

(function($size){
	return function($size,$){
		var $unit	= $.shift(),$_;
		while( ( $_ = $size >> 10 ) >= 1 ) $unit = $.shift(),$size = $_;
		return $size + $unit;
	}(Number($size),'Byte,KB,MB,GB,TB,PB,EB,ZB,YB'.split(/,/));
})(0.5*Math.pow(2,30));

無名関数のままじゃかわいそうなので名前付けてかわいがってあげて!

GMOクラウドPublicの簡易見積もりを作ってみた

GMOクラウドPublic簡易見積もり

GMOクラウドPublicって?

GMOグループ運営してる(GMOクラウド株式会社)が運営してるクラウドサービスです。
利用してるプラン内で自由にリソースを割り振れる素晴らしいクラウドサービスで
GMOクラウドのVPS」や「GMOクラウド専用サーバー」と相性が良いのが特徴です。

料金プランが分かりにくい

パックプラン+超過分は従量課金という料金体系なので、どの料金プランを選んだらいいか分かりにくいかと思います。

構成例がおかしい

間違った料金が掲載されていたり(パック8は29,600円/月)、色々計算が間違っていたり(LBのCPU使用率は10%,Web1,2のディスク容量が10GBだと思われる)と構成例を元に構成しても計算が合わない罠が仕掛けられています。

見積もり機能が無い

さくらのクラウドと違って簡易見積もり機能がありません。
問い合わせをすれば計算してくれるようです…がした事がありません

ってことで

GMOクラウド簡易見積もりを作成しました。
それだけではつまらないので、ほぼ同じ様な構成でGMOクラウドのVPSを利用した場合の料金も計算するようになっています。

http://cloud.2ch.to/gmo/

最後に

不具合報告や問い合わせはコメントかツイッターにお願いします。
それではGMOクラウドPublic簡易見積もりをよろしくお願いします。


dreamobjectsを利用した画像アップローダを作ってみた。

2ちゃんねる画像アップローダという画像アップローダを作成しました。
高負荷にも耐えれる安定したサービスを目指して頑張っていますのでよろしくお願いします。
…というか悲鳴上げるほどアクセス増えて欲しいです。

2ちゃんねる画像アップローダ

動機

DreamObjectsというamazon S3と互換性のあるストレージサービスを最近知ったのでを作成してみました。
DreamObjectsがストレージ7¢/GB、Transfer Outも7¢/GB、API呼び出しは無料、先払いによる割引もあります。
S3の米国スタンダードリージョンが$0.095 /GB,$0.120 /GB,$0.01/1,000リクエストなのでずいぶん安くすみそうです。

さて、ここからはサーバの構成のお話です。

フロントエンド

さくらのVPS 1G」を利用しています。

DreamObjectsが転送料課金なのでnignxがメモリとHDDの大半を使いキャッシュをしています。また、phpを動かすのにapacheも動いています。
負荷が増えた場合、nginxとapacheのサーバを分離後、それぞれ並列化できるように設計しています。

データベース

DBってスケーリングしにくい(というイメージな)ので利用していません。
プログラムでRSSを出力してDreamObjectsにおいています。
Google Developers経由で一覧を作成しています。
件名等各種情報はファイルが持っています。

サムネイル

rethumb - image management serviceというサービスを利用しています。
一覧表示や画像ページ等元画像以外はこちらを経由しています。
リザイズ後の画像はキャッシュしてくれてるので負荷分散にも役立っています。
時々エラーが出たり、海外のサービスなので遅い等もあってオリジナルを作ろうか検討しています。

ストレージ

DreamObjectsを利用しています。
HTMLやCSS等もここに入っています。(phpのみフロントエンドにおいてあります)

現在は使用量が少ないので完全従量制を利用しています。
将来的には1TB PAN($54.95/mon)あたりが必要になると思います。
80円/$だと4,396円ですみますが120円/$だと6,594円と1,000円以上の差が付いてしまいます。
個人のサイフで海外のサービス利用すると為替リスクが怖いですね。

最後に

使い勝手が悪い、バグがある、仕組みに質問が有るなどありましたらコメントかツイッターにお願いします。
それでは2ちゃんねる画像アップローダをよろしくお願いします。


さくらのVPSの賢い使い方

時々wordpress等のCMSを使っていて負荷増えてきたから「さくらのVPS」の4Gや8Gにしたったという話を耳にします。
本当に4GBや8GBで良かったのでしょうか?

構成 プラン 料金 メモリ コア HDD 用途
構成1 さくらのVPS 4G 3,980円 4GB 4コア 400GB すべて
構成2 さくらのVPS 2G
さくらのVPS 2G
合計
1,480円
1,480円
2,960円
2GB
2GB
4GB
3コア
3コア
6コア
200GB
200GB
400GB
nginx+apache
DB
-
構成3 さくらのVPS 1G
さくらのVPS 2G
さくらのVPS 2G
合計
980円
1,480円
1,480円
3,940円
1GB
2GB
2GB
5GB
2コア
3コア
3コア
8コア
100GB
200GB
200GB
500GB
nginx
apache
DB
-

構成1

  • サーバ1台なので設定は楽
  • コア数一番少ないのに料金は一番高い
  • 静的コンテンツが200GBでおさまらない場合はしょうがない
  • nginx(静的コンテンツを返す)+apache(プログラム処理)+DBを1台で行うのでコンテキストスイッチが多く発生する

構成2

  • WEB(nginx+apache)とDBに分離する事で、サーバはそれぞれの仕事に専念できるし、カーネルのIOキャッシュも有効利用できる。
  • さくらのVPS 4Gより安いのにコア数が2多い
  • 画像はWEBに保存されるので200GBまで

構成3

  • 3台も設定すんのかよ!
  • さくらのVPS 4Gとほぼ同じ値段で合計メモリ5GB、8コアを利用できる。
  • proxy(nginx)とWEB(apache)とDBに分離し、proxyにcacheを持たせる事でWEBの負荷を減らせる
  • 今回の構成で一番アクセスを捌ける(ハズ)

まとめ

このように用途毎にサーバをわけてより小さいプランを数個契約すると、安くなったり、同じ価格でより高性能な環境を得る事が出来て、お得な事があります。
同様にさくらのVPS 8GBもそれ以下のプランを複数組み合わせる事で安くなったりよりアクセスを捌ける環境を作る事ができる可能性があります。
※管理コストは増えますのでご注意ください

ところで

twitterに[twitter:@sakuravps]という、さくらインターネットVPSサービスの公式アカウントが有るのですが魂が宿っていません。
かわいそうなのでさくらのVPSを利用してる方はフォローしてあげてください。

あと、サーバ構成の検討〜初期設定のお手伝い案件がありましたら是非ご相談ください。