KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

IDCFクラウドのオブジェクトストレージをdjango-storagesから使ってみた。

最近はオブジェクトストレージをうまく使って、静的ファイルを配信するのが大きな潮流な模様。

静的ファイルのサイズが増え続けたり、ミニマムスタートでサービス立てたり、アプリケーションサーバー側をステートレスで必要に応じてスケーリングしたり...

オブジェクトストレージ殿は、そんな要求たちを一気にやっつけてくれるえらい奴だと、思い込んでおります。(全然実務の方ではご縁になることが、ややしばらくなさそうなんですけど...)

こないだ300円サーバーを作ってみたIDCFクラウドにもオブジェクトストレージのサービスがあって、50GBまでなら月額無料、転送もOUTトラフィック10GBまでは月額無料だというので、こりゃ試してみるのにはちょうどよさげだと思って、試してみることにしました。

www.idcf.jp

ちょうどDjangoさんを弄っていたところだったので、Djangodjango-storagesからS3のようにさくっと使えるだろうと思って始めたのですが... pypi.python.org

意外と情報がなくって微妙に苦戦したのでメモしておきます。S3互換のAPIが提供されているとはいえ、エンドポイントとかがS3とは違うわけなので、ライブラリにお任せする時にはちょっと設定をしないといけないのですね(あたりまえ)

IDCFクラウドの方は、コンパネからAPIユーザーを作って、バケットを作っておいてあげればOKです。 デフォルトだと非公開バケットができるので、バケットの詳細設定からパブリックしておく必要がありますね。

設定で必要になる情報は、APIユーザーを選択したときに最初に表示される画面(以下)に集約されています。 f:id:kacchan822:20161010224606p:plain

Djangoの方の設定は、基本的に公式ドキュメント通りで、以下のような感じになりました。 bucket_nameに作成したバケット名を入れましょう。idcfクラウドは基本的にサブドメイン形式な模様。

setting.py

INSTALLED_APPS = [
    ...

    'storages',

    ...
]

 ...

STATIC_URL = 'https://bucket_name.ds.jp-east.idcfcloud.com/'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'bucket_name'

 ...

これで、あとは、アクセスキーとシークレットキーを環境変数で渡してあげればOKだぜ!と思って

python manage.py collectstatic -n

ってやったら怒られました。つながんねーと的なことでした。Google大先生に尋ねたところ、 masato.github.io

こちらが大変参考になりました。~/.botoファイルに以下のような内容を書いてあげればよろしいよと。

~/.boto

[Credentials]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyy

[s3]
host = ds.jp-east.idcfcloud.com

これをつくってから、もう一度

python manage.py collectstatic -n

やったら、一生懸命あげる感じの雰囲気がでました。-n外してやったら確かにIDCFクラウドのオブジェクトストレージ上に保存されて、静的ファイルがそちらから配信されました。

ということで、とりあえずお試し完了です。


編集後記

アクセスキーとシークレットキーは環境変数経由で直接Djangoの設定ファイルへ渡せるっぽいけど、hostの方の設定はどうにかなるのだろうか。Djangoさんやら関係パッケージ周りの仕組みが未知数な部分がありすぎて謎だ。

IDCFクラウドに300円サーバーを作ってみた。

クラウドサーバーがあっちこっちにあって、どこがいいのだか全く謎ですが、ワンコイン(500円)という最小価格の安さでプッシュしている感の強いIDCFクラウドが目にとまりました。

とりあえず仮想マシン作成のテンプレートを眺めていたら、Ubuntu16.04がなくて悲しくなりましたが、公式以外の公開テンプレートを物色したところ、以下のような記事で紹介されているテンプレートを発見。

cloudyarouze.blogspot.jp

さくらクラウドやconohaクラウドだと仮想マシンの停止だけだと課金が続くので、こういう使い方には向かなくて、AWSとかの方になるだろうなと思っていたら、IDCFクラウドならディスクの方の課金は止まりませんが、マシン分の課金が止まるので、かなりお安くちょっとしたサーバーを建てられるということになるようです。

上のテンプレートを使うのもいいんですけど、せっかくなので、使ってみたかったSnappy Ubuntu Coreさんを使ってみることにしました。ここでIDCFクラウドのマイテンプレートなる機能が、力を発揮してくれます。

SnappyをIDCFクラウドで立ち上げるまで

1. マイテンプレートにSnappy Ubuntu CoreのOVAイメージをつくる

Snappyのページ(の下の方)から、OVAのイメージダウンロードURLを取得。 https://developer.ubuntu.com/en/snappy/start/#ova

今回、自分が使ったのはこのURL。 http://cloud-images.ubuntu.com/ubuntu-core/15.04/core/stable/current/core-stable-amd64-cloud.ova

マイページ→コンピューティング→テンプレートとたどっていくと、以下のようなテンプレートの管理ページが開きます。

f:id:kacchan822:20160915214825p:plain

ここで右上の緑色の「テンプレート作成」をクリックすると、以下のような画面がポップアップしてくるので、先ほど取得したURLをURLのところに入れて、その他の必須項目をいい感じ設定してあげて、フォームの最下部にある緑色の「テンプレートを作成」ボタンをクリックすれば作成が始まります。

f:id:kacchan822:20160915214839p:plain

ややしばらく待つと、

f:id:kacchan822:20160915215211p:plain

ステータスが「Download Complete」になってテンプレートが使える状態になります。

2. 作ったマイテンプレートから仮想マシンをつくる

コンピューティングの画面を開いていれば常に画面左上に入るっぽい水色の「仮想マシン作成」をクリックして、先ほど作ったマイテンプレートを指定してつくれば、OKです。

f:id:kacchan822:20160915215429p:plain

最小のプランのlight.S1で追加ディスクなし(ルートディスクの5GBのみ)にすれば、月額300円上限のお安いサーバーが仕上がります。

3. SSH接続のためのNAT設定をする

サーバーが立ち上がるまで少しだけ待ち時間があるので、この間にNATルーターの設定をしてあげます。IDCFクラウドの仮想サーバーたちは、デフォルトだと閉じたクラウドネットワークの中にいるようで、グローバルからつながりません。FWとポートフォワードの設定をしてあげる必要があります。

左側のメニューリストの「IPアドレス」をクリックするとグローバルIPの一覧が出るので、一つデフォルトで割り当てられるIPアドレスの名前をクリックして設定画面を開きます。

まず、FWで必要なポートを開けます。SSHの標準22を開けるのもありですが、雑な攻撃対策として、ポートを変えてみました。とりあえず2000とかにしてみます。 f:id:kacchan822:20160915220721p:plain

FWで開けたポートに対応するように、ポートフォワードの設定をします。
パブリックポートはFWで開けた、2000、プライベートポートは仮想マシンは標準ポートでSSHを待ち構えているので、22を指定します。仮想マシン側のsshの設定ファイルを調整せずにSSHのポート変更ができるという意味では、VPSとかを使う時より楽ちんです。 f:id:kacchan822:20160915220732p:plain

SSH接続できるか確認してみます。ユーザー名はubuntuで、ポート2000、仮想マシン作成時に指定した公開鍵とペアの秘密鍵を使って接続します。 f:id:kacchan822:20160915222203p:plain

うまくいけば、ウェルカムなメッセージが出るはずです。よきSnappyライフを。


という具合にして300円サーバーが出来上がりました。厳密には、マイテンプレートの保存料金が誤差の範囲ぐらいの額かかるようです。月額30円上限?課金の部分についてはよくわかりませんので、気になる方は実践する前にIDCFクラウドサポートに問い合わせてください。書いてある通りにやったら、300円以上かかったじゃないか!と言われても、私は責任を負いかねます....ご注意を。

国内のクラウドサービスとしては通信量に対する課金が無いところが多いイメージですが、IDCFクラウドは、デフォルトだと、月間3TBまでの通信が無料で、それ以上は従量課金ということです。3TBに行くのかな....。少し使ってみて様子を探ります。

PostfixAdmin的なものを作ってみた。

1台のメールサーバーで複数ドメイン運用したり、システムアカウントと連動せずにメールアカウント運用したいとかのときに、便利なPostfixAdmin( Postfix Admin - Web based administration interface)さん。

わたくしもお世話になっておりましたが、MySQLPostgreSQLと一緒にメールサーバーを動かしてあげないといけないのが面倒になってきた今日この頃...。LXDコンテナで流浪人のように移動しやすいコンテナとしておきたいわけです。もちろんMySQLでもPostgreSQLでもコンテナごと動かす分にはいんですけど、システムリソース的に...ということで...。

そんなオレオレ要件を満足させるものを作ってみました。 github.com

バーチャルメールユーザー管理画面

f:id:kacchan822:20160911135015p:plain

バーチャルメールユーザーの変更画面

f:id:kacchan822:20160911135033p:plain

バーチャルメールエイリアス管理画面

f:id:kacchan822:20160911135020p:plain

バーチャルメールエイリアスの変更画面

f:id:kacchan822:20160911135448p:plain

バーチャルメールドメイン管理画面

f:id:kacchan822:20160911135023p:plain

バーチャルメールドメインの変更画面

f:id:kacchan822:20160911135511p:plain

今回使ったもの

Pythonの軽量フレームワークのBottleをメインにして、UI部分と入力制御系をJavascriptで実装してみました。
本当は、PostfixAdmin的にユーザーログインによる認証機構もつけようとしたのですが、オレオレツールとしては、取り急ぎ必要ではないという英断により、未実装。これからお勉強がてら実装したいです。
Cork - Authentication for the Bottle web frameworkというのを使えばよさげかなと思っています。

今回、ちょっと積極的にcodeclimateさんのチェックを通しながらやったら、確かにコードが短くなったり煩雑だったところがすっきりとしました。(最初のコーディングが美しくな過ぎたというのはさておき....pythonやら、javascriptやら、jQueryやら、PostfixやらDovecotやらsqlite3やらいろんな勉強になったので、個人的には満足です。(これってよくあるダメなやつじゃないか...)

いうまでもなく、現状としてはデバックもかねて、SSHトンネル経由でbottleの簡易サーバー機能をそのまま使って動かしているレベルなので、実運用レベルにはありません。


ちなみにGoogle先生に「postfixadmin sqlite」尋ねてみたら、こんなのがあった。

github.com

2010年3月ごろからある模様。MySQLやらPostgreSQLやらを使ってやるまでの規模じゃないんだけど...なことはそりゃ考えるよな。


(2016.09.15 追記)

2016/09/12にPostfixAdmin3.0がついにリリースされたようで、なんと、add sqlite backend optionと言っているので、動作検証していないけどsqliteでも使えるようになったようです。

sourceforge.net

0. Raspberry Pi3 の初期セットアップ

Raspbery Pi3のセットアップの記事を探すとさくっと出てくるのはディスプレイを繋いで、マウスとキーボード繋いで式だったりしますが...

HDMIの繋がるディスプレイなんてないよ!」
でも大丈夫!僕らにはSSHがあるじゃないか。

「有線LANとか繋ぐのだるくね?」
でも大丈夫!wifiの設定ファイルを書いちゃっとけばいいじゃないか。

という我が家の環境を鑑みたバージョンでお送りします。

Raspbianイメージの書き込まれたmicroSD作成

1. OSイメージファイルのダウンロード

Download Raspbian for Raspberry Pi
素直にRaspbianにしておく。あとでリモートデスクトップとか別所で画面つないで使うこともあるので、「Full desktop image based on Debian Jessie」の方を利用。

2. OSイメージをmicroSDに書き込む

Installing operating system images - Raspberry Pi Documentation
公式殿のドキュメントにしたがってやればよい。Ubuntu16.04環境でやると以下のような流れ。

## SDカードのマウント状況確認
kacchan822@ubuntu16:~$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         7.8G     0  7.8G   0% /dev
tmpfs                        1.6G  9.5M  1.6G   1% /run
/dev/mapper/ubuntu--vg-root  101G   45G   52G  47% /
tmpfs                        7.8G  390M  7.4G   5% /dev/shm
tmpfs                        5.0M  4.0K  5.0M   1% /run/lock
tmpfs                        7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda2                    237M  171M   54M  77% /boot
/dev/sda1                    511M  3.6M  508M   1% /boot/efi
cgmfs                        100K     0  100K   0% /run/cgmanager/fs
tmpfs                        1.6G   80K  1.6G   1% /run/user/1000
/dev/mmcblk0p1                15G  8.0K   15G   1% /media/kacchan822/9779-6F81


## microSD(/dev/mmcblk0p1)がマウントされていたのでマウント解除
kacchan822@ubuntu16:~$ umount /dev/mmcblk0p1

### マウント解除されたのを一応確認
kacchan822@ubuntu16:~$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         7.8G     0  7.8G   0% /dev
tmpfs                        1.6G  9.5M  1.6G   1% /run
/dev/mapper/ubuntu--vg-root  101G   45G   52G  47% /
tmpfs                        7.8G  390M  7.4G   5% /dev/shm
tmpfs                        5.0M  4.0K  5.0M   1% /run/lock
tmpfs                        7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda2                    237M  171M   54M  77% /boot
/dev/sda1                    511M  3.6M  508M   1% /boot/efi
cgmfs                        100K     0  100K   0% /run/cgmanager/fs
tmpfs                        1.6G   80K  1.6G   1% /run/user/1000


### ダウンロードしたOSイメージファイルのディレクトリへ移動・ファイル存在確認
kacchan822@ubuntu16:~$ cd Downloads/
kacchan822@ubuntu16:~/Downloads$ ls
2016-05-27-raspbian-jessie.img


## OSイメージの書き込み
### さっきのアンマウントしたのは、「/dev/mmcblk0p1」だけど、書き込み先としては、「/dev/mmcblk0」になるので注意って公式ドキュメントも言っている。
kacchan822@ubuntu16:~/Downloads$ sudo dd bs=4M if=2016-05-27-raspbian-jessie.img of=/dev/mmcblk0
[sudo] password for kacchan822: 
958+1 records in
958+1 records out
4019191808 bytes (4.0 GB, 3.7 GiB) copied, 859.35 s, 4.7 MB/s

## 公式殿にはこのあとmd5チェックサムで書込結果の検証する方法が紹介されているけど、大丈夫だと信じて割愛。
3. Wi-fiの設定ファイルを編集する。

2.でOSイメージを書き込んだSDカードをマウントし直す。コマンドでやればいい気もするけど、一回抜いて、挿し直せば自動でマウントしてくれるはず。

「boot」と「2f840c69-cecb-4b10-87e4-01b9d28c231c」というようなのがマウントされるので、長ったらしい名前の方のマウントされている方の中にあるwifiの接続設定ファイルを編集れば、有線で最初に一度繋がなくていい。

## 設定ファイルのあるディレクトリへ移動
kacchan822@ubuntu16:~$ cd /media/kacchan822/2f840c69-cecb-4b10-87e4-01b9d28c231c/etc/wpa_supplicant/

## 設定ファイルを開く(root権限(SUDO)で開く必要がある。)
kacchan822@ubuntu16:/media/kacchan822/2f840c69-cecb-4b10-87e4-01b9d28c231c/etc/wpa_supplicant$ sudo vi wpa_supplicant.conf 

設定ファイルを以下のように編集する。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="接続するwifiのSSID"
    psk="接続するwifiのパスワード"
    key_mgmt=WPA-PSK
}

countryは後でも直せるけどついでなのでJPにしておく。 wifiのセキュリティ設定によって、少し設定値が変わってくるだろうけど、 wpa_supplicant.conf(5) - Linux man pageを参考にすれば大丈夫かなと。

完成!

取り出しておく。

Raspbery Pi3を起動してSSH接続

1. OS起動!

f:id:kacchan822:20160813145901j:plain OSイメージの入ったmicroSDをRaspberry Pi3に差し込んで、microUSBで給電するとピカピカと、赤および緑のランプが光って起動を始める。緑のランプの点滅が落ち着いた頃合いでsshしてあげるとよさ気。

2. SSHで接続

IPアドレスDHCPで割り当てられるだろうので(固定にしたかったら、wifiの設定をした流れでついでにネットワークせってファイルもいじっとけばいいだろう)、ipアドレスがわからないが、、、

kacchan822@ubuntu16:~$ ssh pi@raspberrypi.local

と叩けば、うまいこと見つけて接続してくれる。初期パスワードは「raspberry」なので、パスワードを聞かれたら入力してあげるとログインできる。

とりあえずアップデートとか

ログインできたらとりあえず、初期パスワードからログインパスワードを変更したり、ソフトウェアアップデートをしたり、raspberrypiの設定値をいろいろ調整したりしておく。

## ログインパスワード変更
pi@raspberrypi:~ $ passwd

## アップデート(結構時間かかる)
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade

## 設定値の変更
pi@raspberrypi:~ $ sudo raspi-config 

ひとまずこんなところでしょうか。raspi-configの各種設定値はお好みで。Expand Filesystemは、32GB、16GBのは特にしなくてもうまいことなっている感じだった。

kitaeng.hateblo.jp

Raspberry Pi3 で子どもたちと「遊ぶ」までの道のり(とりあえず自分で遊んでみる編)

前々から気になっていたRaspberry Piですが、なんだかんだとウダウダしていて、なかなかポチッとなしてなかったのですが、実験やらプログラミングやら電子工作やらして子どもらと遊ぶことになったので、ついに購入。

子どもらとどうやって遊ぶかも含めて、まずは自分で遊び倒してみることにしたはいいが、やれることが無限大すぎて、どこから手をつけたらいいものやらなので、Raspberry Pi3と一緒に注文してみた、以下のキットに含まれる部材でできることをいろいろやってみることにする。

amzn.to

とりあえず以下予定。

  • 0. Raspberry Pi3 の初期セットアップ
  • 1. Raspberry Pi3 でLEDをチカチカ
  • 2. Raspberry Pi3 でLCDに文字表示
  • 3. Raspberry Pi3 で温度センサーで室温取得
  • 4. Raspberry Pi3 でフルカラーLEDをチカチカ
  • 5. Raspberry Pi3 でモーター制御
  • 6. Raspberry Pi3 でサーボモーター制御