2016年7月7日

はじめまして、ブロードバンドタワー緒方です。

今回、初投稿になりますので、簡単に自己紹介させていただきます。所属はテクニカルセールスグループになりまして、主に 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 keysecret access key の設定が必要になります。それぞれ Default の値は下記の通りになります。

  • ~/.aws/credentials
[default]
aws_access_key_id = accessKey1
aws_secret_access_key = verySecretKey1

AWS CLI を利用してみる

それでは早速、 AWS CLI を利用して Scality S3 Server を操作してみます。

ここでポイントなのが、--endpoint-urlhttp://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 を試してみる

新規バケット作成

まずは、新しくバケットを作成してみましょう。 mybucketmybucket2 と 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 を利用したアプリケーションの開発やテストが簡単にできることがわかりました。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: 緒方 亮

主に Azure や AWS などの Public Cloud を担当しています。機械学習/深層学習で R を利用しているため、投稿する記事に R がよく登場します。