Help us understand the problem. What is going on with this article?

S3ProxyをScalaで使ってみる

More than 3 years have passed since last update.

背景

前回の記事で、S3Proxyについて、Microsoft Azure Blob Storageで実行できるかどうか検証してみました。
今回は、その記事の中にUsage with Javaというのがありましたので、試してみることにしました。また、せっかくなので、今後Sparkでも使いたいので、Scalaで書いてみました。

実装

ポイント

実装はS3ProxyのMain.javaを参考にしました。
実装してわかったのは、ほとんどはjcluodsのコンポーネントを使っていることです。
注意すべき点は、
build.sbtのlibraryDependenciesで以下のjetty-util9.2を使っているのですが、
jettyは9.4が最新なので、jetty9.2を使おうとすると、エラーになってしまいます。
S3Proxy内でコールしているjetty Serverが9.2を使っているためですね。

"org.eclipse.jetty" % "jetty-util" % "9.2.22.v20170606"

実コード抜粋

hello.scala
    val path = FileSystems.getDefault().getPath("conf", "s3proxy.conf")
    val inputStream = Files.newInputStream(path, StandardOpenOption.READ)
    val properties = new Properties

    properties.load(inputStream)
    Option(properties.getProperty(Constants.PROPERTY_PROVIDER)) match {
      case Some(provider) => Option(properties.getProperty(Constants.PROPERTY_IDENTITY)) match {
        case Some(identity) => Option(properties.getProperty(Constants.PROPERTY_CREDENTIAL)) match {
          case Some(credential) => {

            val context = ContextBuilder.newBuilder(provider).
            credentials(identity, credential).
            overrides(properties).build(classOf[BlobStoreContext])

            val s3Proxy = S3Proxy.builder().blobStore(context.getBlobStore()).
            endpoint(URI.create("http://127.0.0.1:8080")).build()

              s3Proxy.start()

              while (!s3Proxy.getState().equals(AbstractLifeCycle.STARTED)) {
                Thread.sleep(1)
                println("Not Start!")
              }
              println("Start!")
          }
          case None => println("$Constants.PROPERTY_CREDENTIAL is not exists.")
        }
        case None => println("Constants.PROPERTY_IDENTITY is not exists.")
      }
      case None => println("$Constants.PROPERTY_PROVIDER is not exists")
    }

上記ソースを解説すると、

val context = ContextBuilder.newBuilder(provider).
credentials(identity, credential).
overrides(properties).build(classOf[BlobStoreContext])

ContextBuilder.newBuilderをコールしコンテキストを作ります。
providerはAzure Blob Storageの場合、jclouds.provider=azureblobを指定します。
jcloudsを使っているのがpropertieファイルから見ても読み取れますね。

Azure Blob Storageの場合のidentitycredential前回の記事にも記載しましたが、
ストレージ アカウント名アクセスキーになります。

設定ファイル(s3proxy.conf)

設定ファイル名はこの場合任意です。
ソースはハードコードしておりますが、
サンプルソースですのでご愛嬌ということでお願いいたします。

image.png

上記のようになります。

コンパイル

ScalaはJava互換のJarファイルを作ることができます。
ここではJarファイルの作り方の説明は割愛しますが、
sbt-assemblyのモジュールを使っています。

sbt assembly

image.png

\s3proxy-scala-project\target\scala-2.12\Hello-assembly-0.1.0-SNAPSHOT.jar
上記のようにjarファイルが出力されました。

\s3proxy-scala-project\target\scala-2.12\Hello-assembly-0.1.0-SNAPSHOT.jar

>java -jar target\scala-2.12\Hello-assembly-0.1.0-SNAPSHOT.jar

image.png

Start !
問題なく実行されました。

実行

前回の記事と同様に、curlコマンドを使って新しいフォルダを作ってみます。

image.png

testfolderというコンテナを作ってみましょう。

curlを叩いて実行してみます。

$ curl -X PUT http://localhost:8080/testfolder

image.png
成功したようですね。

image.png

testfolderが作成されていることが確認できました!

まとめ

実際にS3Proxyライブラリを使ってS3Proxyを実装してみました。
Java互換の言語という意味でも簡単に実装することができました。

特に各クラウドサービス独特の設定はミドルウェア吸収されており、
インターフェースを変えることなくAzure Blob Storageへアクセスすることができ、
大変有用はミドルウェアであることが分かりました。

次の展開としてはAzure HDInsightSparkと連携して、Azure Blobへの読み書きの実装をためして、マルチクラウドへの実行可能性の検証をすすめようと考えております。

tsukashusan
日本マイクロソフト株式会社でパートナーさん向けのクラウドソリューションアーキテクトという仕事をしております!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away