まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:object

IBM Cloud の比較的新しい機能として、オブジェクトストレージ内の CSV ファイルに対して SQL を実行してレコードを抽出することができるようになりました。その新機能 SQL Query を紹介します。なお以下で紹介する手順は IBM Cloud のライトアカウント(無料版)の範囲内でも実施可能なので、興味ある方はぜひ本記事を参考に使ってみてください。
2021011600



この SQL Query はオブジェクトストレージ内の CSV ファイルを対象として実行するので、まずは(まだ利用していない場合は)クラウドオブジェクトストレージサービスを作成します。プランが「ライト」のものを選択して作成すれば一定条件内で無料で利用可能です:
2021011601


作成したオブジェクトストレージサービスの "Integrations" メニューを表示すると、このオブジェクトストレージサービスに統合されたサービスを確認できます。作成直後ではここには何もないはずですが、画面下部に「SQL Query を新規に作成して統合可能」と案内されています。この SQL Query のアイコンを選択することで、SQL Query (の無料版)を新規に作成して、このオブジェクトストレージと紐付けて利用することができるようになります:
2021011602


作成する SQL Query サービスの属性を設定する画面が表示されます。このプランとして「ライト」を選択すれば一定条件内で無料利用が可能です。最後に「作成」をクリック:
2021011603


SQL Query サービスが追加され、オブジェクトストレージと統合されて利用できるようになりました:
2021011604


また「バケット」メニューを参照すると、SQL Query 用のバケットが1つ追加されていることが確認できます。このバケットは必ずしも利用する必要はありませんが、SQL を実行する CSV ファイルや、SQL の実行結果をファイルとして残したい場合のファイル格納場所として利用できます。

今回はこの作成されたバケット内に CSV ファイルを置いて SQL を実行し、その実行結果ファイルもこのバケット内に作成する手順を以下で紹介します。というわけで、まずはこのバケット内に CSV ファイルを格納するため、バケット名部分を選択します:
2021011605


選択した(作成したばかりの)バケット内のファイル一覧が表示されますが、この時点ではまだ CSV ファイルは格納されていません:
2021011606


もし自分でお持ちの CSV ファイルを利用したい場合は、その CSV ファイルをこの一覧部分にドラッグ&ドロップしてアップロードしていただいても構いません。以下のサンプルでは以前に自分が全く別の目的でラズベリーパイの機器温度等を1秒おきに取得した際の CSV ファイルがあったので、このファイルを使って紹介することにします。

同 CSV ファイルは以下に公開しているので、以下ページを表示して、マウス右クリックから「名前を付けて保存」し、RPDATA.csv という名前で保存してください:
https://raw.githubusercontent.com/dotnsf/RPDATA/master/RPDATA.csv

2021011607
(1行目は列定義、2行目以降がデータで、左から ID、CPU 温度(℃)、CPU 負荷(%)、サイン値)


ダウンロードした RPDATA.csv をオブジェクトストレージ内のバケットにドラッグ&ドロップ(または「アップロード」ボタンからアップロード)して同バケット内に格納しておきます:
2021011608


これで SQL を実行する準備ができました。では SQL Query のサービスに移動します。改めてオブジェクトストレージのサービス画面から Integrations メニューを選択し、統合されている SQL Query サービス名部分を選択します:
2021011601


SQL Query サービス画面が表示されたら、画面右上の "Launch SQL Query UI" ボタンをクリックして UI 画面に移動します:
2021011602


以下のような IBM SQL Query の UI 画面が表示されます(↓この画面ではエラーメッセージが表示されていますが気にしないでください(苦笑)):
2021011603


画面上部に SQL を入力します。その際の from 直後のテーブル部を指定する箇所では、アップロードした CSV ファイルを指定します。CSV ファイルは Target location に表示されている文字列の、最後の result/ を除いて変わりに RPDATA.csv を指定し、最後に Run ボタンをクリックします:
2021011601
("select * from cos://us-south/XXXXXX/RPDATA.csv limit 10" と入力しました。一般的な SQL SELECT 文のテーブル名を指定する箇所にオブジェクトストレージ内の CSV ファイルを URI で指定する形になっています)


すると画面下部に SQL クエリーの実行結果が表示されます。特にテーブル定義をすることなく、CSV の1行目にかかれていた列情報をそのまま使って SELECT 文の実行ができることがわかります:
2021011602


またこの実行結果はもとのオブジェクトストレージのバケット内の新 CSV ファイルとしても保存されています。必要に応じてダウンロードするなどして結果を確認できます:
2021011603


オブジェクトストレージに格納された CSV ファイルに対して直接クエリーを実行できるので、IoT システムなどによって記録された CSV ファイルをバッチ処理でオブジェクトストレージ内に格納できてしまえすれば、(SQL 型のデータベースにインポートすることなく)その CSV ファイルの中から条件にあった列だけを取り出すことができる、ということがわかりました。実行結果もオブジェクトストレージ内のファイルとして生成することができるので、IoT システムなどでセンサーデータを集める場合でも「とりあえずは CSV にしてオブジェクトストレージに入れておけば、条件を指定した取り出しは後からできる」ことになって便利だと感じました。




PiTop を購入して依頼、ラズベリーパイ(以下「ラズパイ」)をデスクトップ環境として使うことが多くなりました:

2016080702


さて PiTop に限りませんが、ラズパイをデスクトップ環境として使う場合の問題点はアプリケーションの充実度と、ストレージの少なさです。前者は少しずつ充実しつつあるのですが、そもそもマイクロ SD カードを挿して、そこに OS を導入して使うという手法を取る以上は、このマイクロ SD カードの容量が全空間なわけです。これはどうにもならない。。

・・・と諦めかけていた中で思いつきました。そもそも IoT 機器として使うことも多いラズパイは常に給電状態であることも多く、ネットワークもONの前提で使うことができます。であればクラウドなどの外部ストレージをネットワークマウントしてしまえば、この容量の問題を解決できるのではないか!? と。

実際に試したみた時の様子を以下に記載します。今回はいわゆる S3 互換(Swift互換)のオブジェクトストレージをラズパイにマウントする、という方法に挑戦してみました。具体的には IBM Bluemix のオブジェクトストレージサービスを使って実現してみました:

Swift のオブジェクトストレージをマウントするために CloudFuse を使うことにします。CloudFuse に関しては(前提環境が異なりますが)以前にもこのブログで何度か紹介したことがあります。興味のある方、特に CentOS でマウントさせることに興味ある方はこちらも参考にしてみてください:
SoftLayer の Object Storage をサーバーインスタンスにマウントする


話を戻して、まずはラズパイに CloudFuse を導入しましょう。まずは root になって apt-get のリポジトリを更新します(これをしないとエラーになったので):
$ sudo su
# apt-get update
# apt-get upgrade

次に CloudFuse の実行やビルドに必要なライブラリをまとめて導入しておきます:
# apt-get install build-essential libcurl4-openssl-dev libxml2-dev libssl-dev libfuse-dev libjson-c-dev

ここまで準備できれば CloudFuse のビルドが可能になります。GitHub からソースコードをダウンロードして、展開して、ビルドして、インストールします:
# cd /usr/local/src
# git clone https://github.com/redbo/cloudfuse
# cd cloudfuse
# ./configure
# make
# make install

これで CloudFuse の準備ができました。後はオブジェクトストレージの環境に合わせた設定をしてマウントするだけです。既にオブジェクトストレージ環境をお持ちの方はその環境に合わせた情報を使ってください。

以下はまだオブジェクトストレージ環境をお持ちでない場合の方向けに、IBM Bluemix のオブジェクトストレージ環境を入手する方法から紹介します。IBM Bluemix のオブジェクトストレージのインスタンスを利用するにはこちらの手順を参照ください(無料で 5GB まで使えるオブジェクトストレージ環境が入手できます):


上記手順の、オブジェクトストレージサービスの接続情報を取得するところまでができていればOKです。以下、ここで取得したオブジェクトストレージのファイルシステムをラズパイにマウントしてみます。
2016080701


この Bluemix 環境のオブジェクトストレージを利用する場合は、上記画面の環境変数内の auth_url, userId, password の3つの値(下記の赤字部分)が必要になります。この3つの値をメモしておきましょう:

{
  "credentials": {
    "auth_url": "https://identity.open.softlayer.com",
    "project": "object_storage_**************************",
    "projectId": "******************************",
    "region": "******",
    "userId": "(userId)",
    "username": "Admin_*************************************",
    "password": "(password)",
    "domainId": "**********************************************",
    "domainName": "******"
  }
}


改めてラズパイ環境に戻ります。ラズパイに導入した CloudFuse を使って、このオブジェクトストレージ環境をマウントするにはホームディレクトリ以下に .cloudfuse というテキストファイルを以下の3行の内容で作成します:
username=(userId)
api_key=(password)
authurl=https://identity.open.softlayer.com/v3/

最初の username の値は環境変数内のuserId の値、api_key の値は同 password の値、そして authurl の値には同 auth_url の値に "/v3/" をつけたものを指定します。Bluemix のオブジェクトストレージ以外の環境を使っている場合はその環境に合った相当する値を取り出して指定してください。

これで準備完了です。最後にマウントポイント(この例では /mnt)を指定して CloudFuse を実行します:
# cloudfuse /mnt

このコマンドが成功すると、オブジェクトストレージの内容を /mnt 以下にマウントすることができます:
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         30G  4.6G   24G   17% /
devtmpfs         459M     0  459M    0% /dev
tmpfs            463M     0  463M    0% /dev/shm
tmpfs            463M  6.4M  457M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1    60M   20M   41M   34% /boot
tmpfs             93M  8.0K   93M    1% /run/user/1000
cloudfuse        8.0T  7.5M  8.0T    1% /mnt
  ↑最大 8TB までのストレージがラズパイ上で使えるようになりました!


ちなみに、マウントしたオブジェクトストレージを解除するには umount コマンドでアンマウントするだけです:
# umount /mnt


IBM Bluemix からは(Swift 互換の)Object Storage サービスが提供されています:
2016051701


このオブジェクトストレージのサービスインスタンスは他の(外部の)システムにマウントして使うことができます。その一例として、Linux(CentOS) から CloudFuse を使ってマウントする方法を紹介します(2016/May/17 時点での情報です)。

まずは Bluemix にログインし、Object Storage サービスを1つ作成するために、カタログのサービス一覧から "Object Storage" を選択します(現在は「ストレージ」カテゴリ内にありました):
2016051702


Object Storage サービスに関する説明が紹介されるので内容を確認してください:
2016051701


このタイミングで利用する Object Storage サービスの料金プランを選択する必要があります。無料プランでは 5GB まで、標準プランでは使用量の上限はなく 1GB あたりで 4.2 円と、アウトバウンド転送 1GB につき 9.45 円がかかります。好きな方を選んでインスタンスを「作成」します:
2016051703


Object Storage サービスが作成できたらダッシュボードからそのサービスインスタンスを選択します:
2016051704


Object Storage サービスの画面が表示されたら、左ペインで「サービス資格情報」を選択します。すると右ペインにサービス資格情報として、JSON フォーマットのテキストが表示されます:
2016051705


おそらく以下のようなフォーマットのテキスト情報になっているはずです。このうち青字で記述した auth_url, userId, password の内容が後で必要になるのでメモしておきます:
{
  "credentials": {
    "auth_url": "https://identity.open.softlayer.com",
    "project": "object_storage_XXXXXXXX_XXXX_XXXX_XXXX_XXXXXXXXXXXX",
    "projectId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "region": "dallas",
    "userId": "(userId)",
    "username": "Admin_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "password": "(password)",
    "domainId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "domainName": "NNNNNN"
  }
}


Object Storage のインスタンスは用意できました。ではこれを Linux のファイルシステムとして(リモート)マウントしてみましょう。

マウント元になる Linux システムを用意します。今回は CentOS 6(64bit) で試しました。また Object Storage をマウントするためのツールとして CloudFuse を用いました。CentOS 上に CloudFuse を導入する手順は以前のブログで紹介したことがあるのでこちらを参照ください:
SoftLayer の Object Storage をサーバーインスタンスにマウントする

CloudFuse が準備できたら、ログインユーザーのホームディレクトリ直下に以下の3行の内容で .cloudfuse というテキストファイルを作成します(赤字はコメント):
username=(userId)  # 上記の userId の値
api_key=(password) # 上記の password の値
authurl=https://identity.open.softlayer.com/v3/  # 上記の auth_url の値に '/v3/' を追加

これで準備完了です。実際に Object Storage をマウントする前に、df コマンドで現在のファイルシステム状況を確認しておきましょう:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot

では以下のコマンドを実行して、Bluemix の Object Storage を(この例では /mnt 以下に)マウントしてみます:
# cloudfuse /mnt

正しくマウントできているか、再度 df コマンドで確認します。ちゃんと /mnt 以下にマウントできているようです。この状態になれば Object Storage の中身を /mnt ディレクトリ以下と見なして直接読み書きすることが可能になります:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot
cloudfuse             8.0T  7.5M  8.0T   1% /mnt

マウント状態を解除するには umount コマンドを実行します:
# umount /mnt

Bluemix の Object Storage の有用な使いみちが実現できそうです。なお、Object Storage サービスに関してはこちらのドキュメントも参照ください:
https://console.ng.bluemix.net/docs/services/ObjectStorage/index.html



2013 年を最後に SoftLayer の記事を書いていませんでした。久しぶりで緊張します。。

2年以上 SoftLayer から離れていましたが、その間に大きな変化を遂げていました。もちろん知ってはいたのですが、自分が使う立場ではなかったため、変化を具体的に実感する機会がありませんでした。

最近、業務にかこつけて仕事で SoftLayer インスタンスを利用してシステムを構築する、という機会がありました。普段 PaaS (と個人環境の仮想 Linux)ばかり触っていたので、久しぶりの IaaS でした。その業務の中で SoftLayer 上の Linux サーバーインスタンスのファイルシステム上に Object Storage のフォルダをマウントする、という環境を構築する機会があったので、作業内容をまとめておきました。

ちなみに今回の作業の参考にしたのはこちらのサイトです:
https://www.change-makers.jp/post/10362

ただ、この作業そのままでは自分の環境では動かなかったので、あくまで自分の環境で動かした時の作業内容を記載しておきます。自分の環境は CentOS 6.7 64bit です。


まず、Swift 互換の Object Storage を Linux のファイルシステムにマウントするには CloudFuse というオープンソースのライブラリ/ツールを使います。

というわけで CloudFuse を導入します。CloudFuse はソースからビルドして導入するので、まずはビルドをするために必要な前提ライブラリを導入します:
# yum install gcc make fuse fuse-devel curl-devel libxml2-devel openssl-devel git

※上記の Change Makers のサイトではこれで前提ライブラリが導入されることになっていましたが、自分の環境ではビルドに失敗してしまいました。結果として以下のこの処理が足りませんでした:
# yum install json-c-devel

前提ライブラリが準備できたら CloudFuse (のコマンドラインツール)をダウンロードしてビルドします。ダウンロードは GitHub から最新ソースをクローンします:
# cd /usr/local/src
# git clone https://github.com/redbo/cloudfuse

そして configure して、make して、make install します。これで cloudfuse コマンドが使えるようになります:
# cd cloudfuse
# ./configure
# make
# make install

cloudfuse コマンドを使って Object Storage を利用するには、目的の Object Storage にアクセスするための情報(url, username, password)が必要です。SoftLayer の場合は次の方法で取得します。 SoftLayer のコントロール画面のメニューから Storage - Object Storage を選び、利用中の Object Storage を選択し、その画面内の "View Credentials" と書かれた箇所をクリックします:
2016040201


すると以下のようなアカウントクレデンシャル情報が表示されます。この値を後で使うのでメモしておきます:
2016040202


SoftLayer のインスタンス画面に戻り、ホームディレクトリ上に ~/.cloudfuse というファイルを新規に作成します。その内容は先程確認したクレデンシャル情報を使って、以下の内容にして保存します:
# vi ~/.cloudfuse

username=(Username の値)
api_key=(API Key の値)
authurl=(Authentication Endpoint の値。SoftLayer 以外から使う場合は Public 、SoftLayer のサーバーから使う場合は Private の値にする)

なお authurl に指定する値ですが、この Object Storage のマウント自体は SoftLayer ではないクラウドサーバーやオンプレミスサーバーから行うことができます。その場合は Public と指定されていた方の URL を記載してください。一方 SoftLayer のサーバーからマウントする場合は Private と指定されていた方の URL を記載すると、プライベートネットワークを使った高速接続が出来、かつ SoftLayer 内のインバウンド転送なので追加料金がかかりません。

ここまでできたらマウントします。cloudfuse コマンドを使って、Object Storage のフォルダを SoftLayer インスタンスの /mnt ディレクトリにマウントしてみます:
# cloudfuse /mnt

これでマウントは完了しているはずです。df コマンドで確認してみます:
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2       25G  7.4G   16G  32% /
tmpfs           935M     0  935M   0% /dev/shm
/dev/xvda1      248M   94M  142M  40% /boot
cloudfuse       8.0T  4.2G  8.0T   1% /mnt
↑Object Storage って最大 8TB も使えるのね。。


ちゃんとマウントできています。これで Object Storage が SoftLayer インスタンス上のファイルシステムとして読み書き可能になりました!

画像などメディアファイルを多く扱うようなシステムを構築する場合、パフォーマンスのためにメディアデータはデータベースではなくファイルシステムに格納することも珍しくありません(WordPress とかもそうです)。この場合、アプリケーションサーバーをスケールさせてもメディアを保存するファイルシステムがバラバラになってしまっては意味ないので、メディアを保存する先は Object Storage をマウントした先に指定する方法が一般的です(そうするとマウント情報ごとスケールするので、メディアも共有できるようになる)。 そんなシステム構築ではこんな手法を使う、というサンプルでした。特に SoftLayer + Object Storage 環境であれば、ネットワークも高速で、かつマウントした Object Storage への転送時の追加料金もかからずに構築できるというメリットがあります。


先週、IBM BluemixObject Storage サービスがベータを卒業して正式サービスになりました:
2015022101


SoftLayer 上に用意された Swift と呼ばれる標準的なオブジェクトストレージ機能を Bluemix を通じて提供するものです。5GB であれば無料サービスとして利用できます:
2015022102


では、この Bluemix 上の Object Storage サービスをクライアントから使う方法を紹介します。


1. Swift ツールの導入

このサービスを Linux(CentOS) から実際に利用するまでの手順を紹介します。このサービスを使うには swift と呼ばれるツール(swiftclient)が必要です。まずはこのツールを導入しましょう。

swift の導入は pip を使って行います。最初にこの pip を導入する必要がありますが、pip の導入に必要なライブラリをあらかじめまとめて導入しておきます:
# yum install fuse fuse-libs fuse-devel libattr-devel gcc gcc-c++ kernel-devel libxslt-devel

ここで導入した fuse ライブラリを読み込んでおきます:
# modprobe fuse

次に pip の導入に必要な Python 3 を導入します。Python 3 は yum ではインストールできないため、PUIAS から導入します。まずはそのための GPG Key をインストールします:
# cd /etc/pki/rpm-gpg/
# wget -q http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
# rpm --import RPM-GPG-KEY-puias

次に /etc/yum.repos.d/puias-computational.repo ファイルを以下の内容で作成します:
# vi /etc/yum.repos.d/puias-computational.repo

(以下を作成して保存)
[PUIAS_6_computational] name=PUIAS Computational Base mirrorlist=http://puias.math.ias.edu/data/puias/computational/$releasever/$basearch/mirrorlist gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias

作成したリポジトリファイルを使って yum で Python 3 一式をインストールします:
# yum install python3 python3-devel python3-libs python3-setuptools

Python 3 がインストールできていれば pip がインストールできます:
# wget -O - https://bootstrap.pypa.io/get-pip.py | python3

これでやっと pip の導入ができました。ではこの pip を使って keystoneclient と swiftclient をインストールします:
# pip install python-swiftclient
# pip install python-keystoneclient

ここまでの手順で swift コマンドが使えるようになっているはずです。


2. Object Storage サービスの追加と、環境変数の設定

Bluemix 上で Object Storage サービスを追加し、その資格情報を確認します:
2015022103


環境変数 VCAP_SERVICES の内容は以下の様な JSON 形式のテキストになっているはずです。これらのうち、赤字部分をメモしておきます(後で使います):
{
  "Object-Storage": [
    {
      "name": "Object Storage-7d",
      "label": "Object-Storage",
      "plan": "Free",
      "credentials": {
        "auth_url": "https://identity.open.softlayer.com",
        "project": "object_storage_(project)",
        "projectId": "(projectId)",
        "region": "dallas",
        "userId": "(userId)",
        "username": "Admin_(username)",
        "password": "(password)",
        "domainId": "(domainId)",
        "domainName": "(domainName)"
      }
    }
  ]
}

ここで取得した接続情報を Swift クライアント(Linux)の環境変数に(例えば /etc/bashrc などに)設定します:
export OS_USER_ID=(userId)
export OS_PASSWORD=(password)
export OS_PROJECT_ID=(projectId)
export OS_AUTH_URL=https://identity.open.softlayer.com/v3
export OS_REGION_NAME=dallas
export OS_IDENTITY_API_VERSION=3
export OS_AUTH_VERSION=3

↑上の赤字部分は接続情報のものを使い、青字部分は接続情報には含まれていないのですが、上記のように書き足してください。/etc/bashrc に書いた場合は再ログインするなどして、この環境変数が有効になった状態にしてください。これで swift を使う準備が整いました。


3. swift コマンドを実際に使ってみる

Object Storage はコンテナと呼ばれるフォルダ単位で利用します。現在のコンテナ一覧を確認してみましょう。以下のコマンドを実行します:
# swift list

初めて実行した時には(コンテナが存在していないので)何も表示されないはずです。コンテナを作成するにはコンテナ名を指定して post コマンドを実行します。以下の例では dotnsf-container というコンテナを作成しています:
# swift post dotnsf-container

このコマンド実行後に再度コンテナ一覧を確認すると、作成した dotnsf-container が表示されるはずです(緑字が出力結果):
# swift list
dotnsf-container

次にコンテナの中身を確認します:
# swift list dotnsf-container

これもコンテナ作成直後に実行した段階では(中身がないので)何も表示されないはずです。 ではこのコンテナにローカルファイル(以下の例ではカレントディレクトリの abc.txt を指定してアップロードしてみます:
# swift upload dotnsf-container abc.txt

この後に再度コンテナの中身を確認すると、アップロードしたファイルが追加されていることが確認できます:
# swift list dotnsf-container
abc.txt

コンテナ内のファイルは以下のコマンドでカレントディレクトリにダウンロードできます:
# swift download dotnsf-container abc.txt

コンテナ内のファイルが不要になった場合、以下のコマンドでコンテナから削除できます:
# swift delete dotnsf-container abc.txt
abc.txt

一通りのコンテナ/ファイル操作コマンドが利用できそうです。



(参考)
https://www.ng.bluemix.net/docs/services/ObjectStorage/index.html





このページのトップヘ