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さんやら関係パッケージ周りの仕組みが未知数な部分がありすぎて謎だ。