はじめまして、ブロードバンドタワー緒方です。
今回、初投稿になりますので、簡単に自己紹介させていただきます。所属はテクニカルセールスグループになりまして、主に Amazon web service ( AWS ) や Microsoft Azure などのパブリッククラウド周りを担当しています。
Scality S3 Server
先日、Scality 社が Scality S3 Server を OSS として公開しました。
https://s3.scality.com/
Scality S3 Serverは、S3 ベースのアプリケーション開発をより簡単に進めるためのソリューションです。Docker イメージでも配布されているのでお手軽に利用することが可能になっています。
今回は Docker を利用するのではなく、業務で利用しています Mac mini に環境を準備して試してみました。
手元の Mac の環境は下記のようになっています。
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.10.5
BuildVersion: 14F1808
$ node -v
v4.4.5
セットアップ
ソースコードのダウンロード
$ git clone https://github.com/scality/S3.git
Cloning into 'S3'...
remote: Counting objects: 8262, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 8262 (delta 10), reused 0 (delta 0), pack-reused 8219
Receiving objects: 100% (8262/8262), 2.92 MiB | 335.00 KiB/s, done.
Resolving deltas: 100% (5577/5577), done.
Checking connectivity... done.
インストール
$ cd S3
$ npm install --save scality/S3
npm WARN engine s3@1.1.0: wanted: {"node":"~4.2.0"} (current: {"node":"4.4.5","npm":"2.15.5"})
> ioctl@2.0.0 install /Users/ryo/node_modules/s3/node_modules/ioctl
> node-gyp rebuild
CXX(target) Release/obj.target/ioctl/src/ioctl.o
SOLINK_MODULE(target) Release/ioctl.node
npm WARN deprecated minimatch@1.0.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
-
> leveldown@1.4.6 install /Users/ryo/node_modules/s3/node_modules/level/node_modules/leveldown
> prebuild --install
s3@1.1.0 node_modules/s3
├── async@1.4.2
├── utf8@2.1.1
├── xml@1.0.1
├── node-uuid@1.4.7
├── werelogs@1.1.0 (safe-json-stringify@1.0.3)
├── arsenal@1.1.0
├── sproxydclient@1.1.0 (werelogs@1.1.0)
├── vaultclient@1.1.0 (commander@2.9.0, arsenal@1.1.0)
├── bucketclient@1.1.0 (werelogs@1.1.0, arsenal@1.1.0)
├── multilevel@7.3.0 (duplexer@0.1.1, level-manifest@1.2.0, stream-combiner@0.2.2, rpc-stream@2.1.2, tmp-stream@0.3.2, mux-demux@3.7.9)
├── level-sublevel@6.5.4 (ltgt@2.1.2, typewiselite@1.0.0, xtend@4.0.1, pull-stream@2.21.0, bytewise@1.1.0, levelup@0.19.1)
├── ioctl@2.0.0 (bindings@1.2.1, nan@2.3.5)
├── xml2js@0.4.16 (sax@1.2.1, xmlbuilder@4.2.1)
├── babel-plugin-transform-es2015-destructuring@6.9.0 (babel-runtime@6.9.2)
├── babel-plugin-transform-es2015-modules-commonjs@6.10.3 (babel-plugin-transform-strict-mode@6.8.0, babel-template@6.9.0, babel-types@6.10.2, babel-runtime@6.9.2)
├── babel-plugin-transform-es2015-parameters@6.9.0 (babel-helper-get-function-arity@6.8.0, babel-helper-call-delegate@6.8.0, babel-template@6.9.0, babel-types@6.10.2, babel-traverse@6.10.4, babel-runtime@6.9.2)
├── babel-core@6.10.4 (babel-template@6.9.0, slash@1.0.0, babel-messages@6.8.0, shebang-regex@1.0.0, path-exists@1.0.0, path-is-absolute@1.0.0, babel-helpers@6.8.0, private@0.1.6, convert-source-map@1.2.0, source-map@0.5.6, debug@2.2.0, babylon@6.8.1, babel-types@6.10.2, minimatch@3.0.2, babel-code-frame@6.8.0, babel-traverse@6.10.4, babel-generator@6.10.2, json5@0.4.0, lodash@4.13.1, babel-register@6.9.0, babel-runtime@6.9.2)
└── level@1.4.0 (level-packager@1.2.0, leveldown@1.4.6)
以上でセットアップが完了です。
Scality S3 Server の起動
細かい設定は後回しにして、早速起動してみましょう。
$ npm start
> s3@1.1.0 start /Users/ryo/Desktop/S3
> node init.js && node index.js
{"name":"S3","level":"warn","message":"WARNING: Synchronization directory updates are not supported on this platform. Newly written data could be lost if your system crashes before the operating system is able to write directory updates.","hostname":"Macmini.local","pid":941}
{"name":"S3","level":"info","message":"Init complete. Go forth and store data.","hostname":"Macmini.local","pid":941}
:
AWS CLI を利用してみる
AWS コマンドラインインターフェイス ( AWS CLI ) を利用して Scality S3 Server にアクセスしてみます。
AWS CLI セットアップ
私は業務で AWS CLI を利用していますので、既にインストールされているのですが、AWS CLI のインストールする場合には下記のコマンドを実行すればインストールされます。
$ pip install awscli
AWS CLI を利用するために、下記ファイルに access key
と secret access key
の設定が必要になります。それぞれ Default の値は下記の通りになります。
- ~/.aws/credentials
[default]
aws_access_key_id = accessKey1
aws_secret_access_key = verySecretKey1
AWS CLI を利用してみる
それでは早速、 AWS CLI を利用して Scality S3 Server を操作してみます。
ここでポイントなのが、--endpoint-url
で http://localhost:8000
を指定してローカルの Scality S3 Server を指定してあげます。
ちなみに、Scality S3 Server は下記のように *:8000 でアクセスを受け付けますので、Scality S3 Server を実行していないリモートからもアクセス可能です。
$ netstat -anf inet
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
:
tcp46 0 0 *.8000 *.* LISTEN
:
AWS CLI は aws コマンドの引数に操作を行いたいサービスを指定して実行してあげます。 S3 を操作する際の引数は 2 つあって、s3 と s3api があります。
s3 はバケットを作ったり、ファイルをバケットに追加したりと比較的シンプルな作業を行う際に利用します。対して、s3api はバケットのポリシーの操作やライフサイクルの設定など細かい設定を行うことができます。
aws s3 を試してみる
新規バケット作成
まずは、新しくバケットを作成してみましょう。 mybucket
と mybucket2
と 2 つのバケットを作成してみます。
$ aws s3 --endpoint-url http://localhost:8000 mb s3://mybucket
make_bucket: s3://mybucket/
$ aws s3 --endpoint-url http://localhost:8000 mb s3://mybucket2
make_bucket: s3://mybucket2/
バケットの確認
先ほど作成したバケット確認してみます。
$ aws s3 --endpoint-url http://localhost:8000 ls
2016-06-22 14:55:51 mybucket
2016-06-23 11:50:40 mybucket2
ちゃんと作成されています。
ファイルの設置
先ほど作成しましたバケットにファイルを設置してみましょう。
$ aws s3 --endpoint-url http://localhost:8000 cp ~/Desktop/andy.jpg s3://mybucket/andy.jpg
upload: ../andy.jpg to s3://mybucket/andy.jpg
バケットのファイル一覧を取得
最後に先ほど設置したファイルが mybucket
に設置されたか確認してみます。
$ aws s3 --endpoint-url http://localhost:8000 ls s3://mybucket/
2016-06-23 11:54:33 127520 andy.jpg
ちゃんと設置されていますね。
aws s3api を試してみる
今度は、aws s3api を試してみましょう。
バケットの確認
aws s3 コマンドで先ほど作成した mybucket
のバケット一覧を確認してみます。
$ aws s3api --endpoint-url http://localhost:8000 list-buckets
{
"Owner": {
"DisplayName": "accessKey1displayName",
"ID": "accessKey1canonicalID"
},
"Buckets": [
{
"CreationDate": "2016-06-22T05:55:51.479Z",
"Name": "mybucket"
},
{
"CreationDate": "2016-06-23T02:50:40.152Z",
"Name": "mybucket2"
}
]
}
mybucket
および mybucket2
が確認できました。
バケットのアクセスリストの確認
今度は、 mybucket
のアクセスリストを確認してみましょう。
$ aws s3api --endpoint-url http://localhost:8000 get-bucket-acl --bucket mybucket
{
"Owner": {
"DisplayName": "accessKey1displayName",
"ID": "accessKey1canonicalID"
},
"Grants": [
{
"Grantee": {
"Type": "CanonicalUser",
"DisplayName": "accessKey1displayName",
"ID": "accessKey1canonicalID"
},
"Permission": "FULL_CONTROL"
}
]
}
AWS SDK for Python
今度は Python を利用して Scality S3 Server を操作してみます。
AWS SDK for Python のセットアップ
下記 pip コマンド実行してあげればセットアップ完了です。
$ pip install boto3
Collecting boto3
Downloading boto3-1.3.1-py2.py3-none-any.whl (113kB)
100% |████████████████████████████████| 122kB 6.3MB/s
Requirement already satisfied (use --upgrade to upgrade): futures<4.0.0,>=2.2.0 in /usr/local/lib/python2.7/site-packages (from boto3)
Requirement already satisfied (use --upgrade to upgrade): jmespath<1.0.0,>=0.7.1 in /usr/local/lib/python2.7/site-packages (from boto3)
Requirement already satisfied (use --upgrade to upgrade): botocore<1.5.0,>=1.4.1 in /usr/local/lib/python2.7/site-packages (from boto3)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python2.7/site-packages (from botocore<1.5.0,>=1.4.1->boto3)
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.10 in /Library/Python/2.7/site-packages (from botocore<1.5.0,>=1.4.1->boto3)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5 in /usr/local/lib/python2.7/site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.5.0,>=1.4.1->boto3)
Installing collected packages: boto3
Successfully installed boto3-1.3.1
AWS SDK for Python ( boto3 ) を利用してみる
Pythonの対話型インタプリタである ipython を利用して操作してみます。
$ ipython
Python 2.7.11 (default, Jan 22 2016, 08:28:37)
Type "copyright", "credits" or "license" for more information.
IPython 3.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
事前準備
In [1]: from boto.s3.connection import S3Connection
In [2]: from boto.s3.connection import OrdinaryCallingFormat
In [3]: cf=OrdinaryCallingFormat()
In [4]: apikey='accessKey1'
In [5]: secretkey='verySecretKey1'
Scality S3 Server への接続
S3Connection()
に必要な値を入力してみます。
In [6]: conn = S3Connection(aws_access_key_id=apikey,aws_secret_access_key=secretkey,
...: is_secure=False,
...: host='localhost',
...: port=8000,
...: calling_format=cf)
新規バケットの作成
新規で mybucket3
を作成してみます。
In [7]: conn.create_bucket('mybucket3')
Out[7]: <Bucket: mybucket3>
In [8]: conn.get_all_buckets()
Out[8]: [<Bucket: mybucket>, <Bucket: mybucket2>, <Bucket: mybucket3>]
conn.get_all_buckets()
の出力結果から、ちゃんと作成されていることが確認できました。
バケットの削除
先ほど作成した mybucket3
を削除してみましょう。
In [9]: conn.delete_bucket('mybucket3')
In [10]: conn.get_all_buckets()
Out[10]: [<Bucket: mybucket>, <Bucket: mybucket2>]
conn.get_all_buckets()
の出力結果から、削除されていることが確認できました。
最後に
駆け足での説明になってしまいましたが、Scality S3 Server を利用すれば S3 を利用したアプリケーションの開発やテストが簡単にできることがわかりました。
本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。