2017年3月16日

ブロードバンドタワー緒方です。今回は、統計解析向け言語/開発実行環境の R から、AWS S3 の API 経由にて操作するための環境構築と、利用法について紹介させて頂きます。

どうして R で S3 操作をやるの ?

R から直接 S3 にファイルをアップロード/ダウンロードできるメリットとして、R オブジェクトを R から直接 S3 にアップロード/ダウンロードできることにあります。

もちろん、R オブジェクトを一度ローカルに保存して、それを S3 にアップロードする事で同じ事が実現できますが、手間がかかります。

後ほど説明します、aws.s3::s3save() と aws.s3::s3load() を利用する事により、簡単に S3 に R オブジェクトのアップロード/ダウンロードが実現できるようになります。

R パッケージの選定

R で S3 操作を実現できるパッケージは調べてみると色々とありました。

この中で、cloudyr/aws.s3 を選んでみました。cloudyr/aws.s3 を選んだ理由ですが、実行環境に AWS コマンドラインツールなどのインストール/設定が不要で、本ツールだけで完結できる点にあります。

そもそも、 R で S3 操作を実現しようとしたきっかけに、Mac や Ubuntu, Windows にインストールしている R 環境で R オブジェクトの共有をしたかった理由があります。

Mac/Ubuntu/Windows それぞれの環境に AWS コマンドラインツールのインストールや設定をするのが大変というのもあり、cloudyr/aws.s3 を選んでみました。

インストール

for MacOS

Mac OS X 環境

Mac の環境は下記のようになっています。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1217

R 環境: Microsoft R Open 3.3.2 / RStudio ( Server ) 1.0.136

インストール方法

> devtools::install_github("hadley/xml2")
> install.packages("aws.s3", repos = c("cloudyr" = "http://cloudyr.github.io/drat"))

aws.s3 をインストールする前に、hadley/xml2 をインストールするところがポイントです。hadley/xml2 がインストールされていない状態で aws.s3 をインストールしようとするとエラーになりました。

for Ubuntu

Ubuntu 環境

Ubuntu 環境は下記のようになっています。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

R 環境: Microsoft R Open 3.3.2 / RStudio ( Server ) 1.0.136

インストール方法

> devtools::install_github("hadley/xml2")
> install.packages("aws.s3", repos = c("cloudyr" = "http://cloudyr.github.io/drat"))

こちらも、先ほどの Mac の環境と同じように、hadley/xml を先にインストールするところがポイントです。

for Windows

Windows 環境

Windows 環境は下記のようになっています。

C:\> ver

Microsoft Windows [Version 6.1.7601]

R 環境: Microsoft R Open 3.3.2 / RStudio ( Server ) 1.0.136

インストール方法

> install.packages("base64enc")
> install.packages("aws.s3", repos = c("cloudyr" = "http://cloudyr.github.io/drat"), INSTALL_opts = "--no-multiarch")

Mac/Ubunt と異なり、事前に base64enc を先にインストールするところがポイントです。

使い方

はじめに

まず最初に必要なパケッケージを読み込みます。

> require(aws.signature)
> require(aws.s3)

次に AWS のアクセス/シークレットキー、および、Default のリージョンの設定をします。

> Sys.setenv("AWS_ACCESS_KEY_ID" = "< AWS アクセスキー文字列 >",
           "AWS_SECRET_ACCESS_KEY" = "< AWS シークレットキー文字列 >",
           "AWS_DEFAULT_REGION" = "us-east-1")

AWS_DEFAULT_REGIONus-east-1 を指定するところがポイントです。ここを、例えば通常利用している東京リージョン ( ap-northeast-1 ) などを指定した場合、下記で実行します新規バケット作成の時などにエラーを吐いて失敗してしまいます。

新規バケットの作成

次に、新しいバケットを作成してみます。aws.s3::put_bucket() コマンドを利用します。
引数には、バケット名とリージョンを指定します。

バケット名を toe-robject、リージョンを東京リージョンである ap-northeast-1 を指定してみます。

> aws.s3::put_bucket("toe-robject", region = "ap-northeast-1")
[1] TRUE

戻り値に TRUE とあれば、作成成功です。

バケット一覧の取得

バケット一覧を取得して、先ほど作成したバケットが存在しているか確認してみましょう。

aws.s3::bucketlist() コマンド実行します。引数は特に必要ありません

> aws.s3::bucketlist()
                                               Bucket             CreationDate
1                                        toe-robject 2017-02-06T06:20:18.000Z

先ほど作成しました、バケット名: toe-robject が作成されている事が確認できました。

メモリ上のデータを S3 に保存

バケットの準備も整いましたので、今度は R オブジェクトを S3 上に保存してみます。

aws.s3::s3save() コマンドを実行します。

第 1 引数に R 上に作成されたオブジェクト名 ( この例でいくと fit.nnet )、bucket オプションにバケット名である toe-robjectobject オプションに保存するオブジェクト名に .Rdata を付加した文字列 ( この例でいくと fit.nnet.Rdata) を指定します。

object オプションに指定する文字列ですが、この文字列が S3 上で保存されるファイル名になります。

> aws.s3::s3save(fit.nnet, bucket = "toe-robject", object = "fit.nnet.Rdata")

バケットの内容一覧の取得

先ほど、aws.s3::s3save() コマンドでアップロードした R オブジェクトが指定したバケットに作成されているかバケットの内容の一覧を取得してみます。

aws.s3::get_bucket() コマンドを実行します。

引数にバケット名である toe-robject を指定します。

> aws.s3::get_bucket("toe-robject") 
Bucket: toe-robject 

$Contents
Key:            fit.nnet.Rdata 
LastModified:   2017-02-06T06:29:53.000Z 
ETag:           "125c10daceb87aaa21ab5df660cfa00c" 
Size (B):       23676469 
Owner:          tsg_aws 
Storage class:  STANDARD 

fit.nnet.Rdata として保存されている事が確認できました。

S3 上の R オブジェクトを取得

今度は aws.s3::s3load() コマンドを利用して、先ほど保存した R オブジェクトを取得してみます。

第 1 引数に S3 上に保存されたファイルのファイル名である fit.nnet.Rdataを指定し、bucket オプションにバケット名である toe-robject を指定します。

> s3load("fit.nnet.Rdata", bucket = "toe-robject")
> ls()
[1] "fit.nnet"

aws.s3::s3load() コマンドの戻り値が何も表示されないので不安になりますが、ls() コマンドを実行する事で、正常に fit.nnet として R オブジェクトがダウンロードできた事が確認できます。

S3 上のファイルを削除

最後に、S3 上のファイルを削除してみましょう。
aws.s3::delete_object() コマンドを利用します。

第 1 引数に S3 上に保存されたファイルのファイル名である fit.nnet.Rdataを指定し、bucket オプションにバケット名である toe-robject を指定します。

> aws.s3::delete_object("fit.nnet.Rdata", bucket = "toe-robject")
[1] TRUE

aws.s3::get_bucket() コマンドを実行して、ファイルが削除されたか確認してみましょう。

> aws.s3::get_bucket("toe-robject") 
Bucket: toe-robject 

named list()

ちゃんと消えている事が確認できました。

最後に

今回、Mac, Ubuntu, Windows にインストールを実行してみました。

3 プラットフォームにまたがっているのは、ノート PC は Windows、社内/自宅利用で Mac、比較的スペックの高いサーバの Ubuntu と R を利用する環境が色々とあるためです。

R で機械学習をやっているのですが、処理に時間がかかるものを Ubuntu で実行して、移動中には Windows のノート PC を利用し、会社や自宅では Mac を使ってせっせとモデルを作成したりしています。

作成するのにすごい時間がかかったモデルなどを S3 に保存しています。

 

 

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