GrailsからS3を扱う

GrailsAmazon Web Services Simple Storage Service (S3)を使ってみる。
プラグインがあるので、利用は簡単。

http://www.grails.org/plugin/amazon-s3

まずは、インストールから。ドキュメントとしては、install-pluginコマンドを使っているけども、
BuildConfig.groovyに以下のように記述してインストール。

plugins {
runtime ':quartz:0.4.2'
runtime ':amazon-s3:0.8.2'
}

Config.groovy

aws {
domain="s3.amazonaws.com"
accessKey="【accesskey】"
secretKey="【secretKey】"
bucketName="grails"
}

データをアップロードすると、S3上で以下のような名前でバケットが作成されて、そのバケットにデータが保存されていく。

【accessKey】.grails

存在しないバケットの場合はUSの方に作られてしまうので、事前に使いたいリージョンでこの名前のバケットを作成しておく。作成さえしておけば、そのバケットを利用するようになっている。

このプラグインは、S3の操作にJetS3tというライブラリ(と言っていいのかわからないけど)を利用していて、現在のバージョンは、日本リージョンに対応しているみたいだけど、プラグインに入っているバージョンでは、日本リージョンに対応していない。USと、EUROPEには、対応しているけども、プラグインソースコードでは、リージョンの指定すらしていない。

これでS3を利用する準備は完了。次に、データを登録してみる。

プラグインで用意されているS3AssetControllerを使ってデータの登録が出来るようになっている。
デフォルトパッケージで作成されているので、あくまで確認用の位置づけになっていると思われる。
実際にプロジェクトにプラグインを組み込む際は、このControllerは、なにかしらのアクセス制御をしておく必要があるだろう。

http://【serverHost】/【appName】/s3Asset/create

http://【serverHost】/【appName】/s3Asset/list

データをアップロードすると、一旦サーバーローカルにファイルが保存され、その後、バックグラウンド処理として、S3にデータがアップロードされる。
このプラグインは、S3のファイルの管理情報をGrailsドメインで管理していて、プラグイン経由でアップロードされたファイルのみ操作可能になる。
ドメイン上に、アップロードの状況など(アップロード中とか、保存済みとか)が書き込まれていく。
データを削除した場合は、そのステータスが削除済みになり、ドメイン上に情報は残される。当然、S3上のファイルは削除される。

別途ツールなどを使ってアップロードしても、Grailsアプリケーションの一覧に出てこない。
そういったファイルは、何かしらの方法でGrailsドメインにデータを登録すればリストに出すことは出来そうだ。

あと、バケット内にフォルダを作って登録することができないので、ファイルをグループに分けて管理するした場合は、ドメイン上にあるdescriptionとかに管理用情報を入れておくか、動的にバケットを作成、利用してアプリケーション上で工夫する必要がある。