tanacasinoのメモ

what are you waiting for ?

Eucalyptus meets Scala !? Scala meets Eucalytpus!?

この記事は Eucalyptus Advent Calendar 2014 3日目の記事です。

昨日は、@giraffeforestg さんの「Eucalyptus 4を楽しんでみる」でした。私もちゃんと読んでインストールしなおします。。。

Eucalyptus 4 を 楽しんでみる (Eucalyptus Advent Calendar 2014) - きりんメモ@GIFU


本題

EucalyptusScalaから操作する。

Midonetで話題のそうScala

全人類にとってまるで夢のような組み合わせ。

誰もが憧れる迷品。

そう、eucalyptuscala だよ!

tanacasino/eucalyptuscala · GitHub

使い方

事前にJRE 1.7 or laterを準備してください。OpenJDKでも大丈夫です。(多分ね!)

# Eucalyptusでおなじみの eucarc を source して環境変数をセットしましょう!
$ source eucarc

# eucalyptuscala をクローンしてきましょう!
$ git clone https://github.com/tanacasino/eucalyptuscala.git
$ cd eucalyptuscala

# REPL 開始
$ ./bin/sbt console
# 以下をimportするだけで使えます!
scala> import com.github.tanacasino.eucalyptuscala._
import com.github.tanacasino.eucalyptuscala._

# クライアント用インスタンスを生成するのもこんなに簡単!
scala> implicit val euca = Eucalyptus()
euca: awscala.ec2.EC2 = com.github.tanacasino.eucalyptuscala.Eucalyptus@36240cb7

# インスタンスの一覧をサクッと取得!
scala> euca.instances
res0: Seq[awscala.ec2.Instance] = ArrayBuffer()

# Scalaのコレクション操作による流れるような処理も可能!
scala> euca.instances.filter(_.name.startsWith("euca-")).map(_.instanceId)
res1: Seq[String] = ArrayBuffer()

# Walrus(S3 API)にも対応!
scala> implicit val walrus = Walrus()
walrus: awscala.s3.S3 = com.github.tanacasino.eucalyptuscala.Walrus@542d8f6d

scala> val mybucket = walrus.createBucket("mybucket")
mybucket: awscala.s3.Bucket = S3Bucket [name=mybucket, creationDate=null, owner=null]

scala> mybucket.keys
res3: Seq[String] = Stream()

# TAB で保管も効きます!
scala> mybucket.put
put   putAsPublicRead   putAsPublicReadWrite   putObject   putObjectAsPublicRead   putObjectAsPublicReadWrite

scala> mybucket.putObject

def putObject(key: String, bytes: Array[Byte], metadata: com.amazonaws.services.s3.model.ObjectMetadata)(implicit s3: S3): PutObjectResult
def putObject(key: String, file: java.io.File)(implicit s3: S3): PutObjectResult

# もちろんその場でアップロードもできる!
scala> val obj = mybucket.putObject("hoge.txt", new java.io.File("/home/tanacasino/hoge.txt"))
obj: awscala.s3.PutObjectResult = PutObjectResult(S3Bucket [name=mybucket, creationDate=null, owner=null],hoge.txt,null,4a3b564e9d8e78ac0cca5e6e0c0b3258,SjtWTp2OeKwMyl5uDAsyWA==,2014-11-24T21:35:23.180+09:00,null,null)

scala> walrus.buckets.foreach(println)
S3Bucket [name=loadbalancer-v1, creationDate=Mon Nov 24 15:44:02 JST 2014, owner=S3Owner [name=eucalyptus,id=351c014a473cb1b3c3d10364c35c3d3e39241e1f41535a2639391c5b20552c19]]
S3Bucket [name=mybucket, creationDate=Mon Nov 24 21:18:41 JST 2014, owner=S3Owner [name=eucalyptus,id=351c014a473cb1b3c3d10364c35c3d3e39241e1f41535a2639391c5b20552c19]]
S3Bucket [name=test001, creationDate=Mon Nov 24 20:57:32 JST 2014, owner=S3Owner [name=eucalyptus,id=351c014a473cb1b3c3d10364c35c3d3e39241e1f41535a2639391c5b20552c19]]

f:id:tanacasino:20141203003441p:plain

実体はScala + sbt + AWScala + aws-sdk-javaなので、本体コードとしては・・・ 環境変数からちょっと読みこむのとEucalyptus用のEndpointに設定しているだけです。

あと残念ながらEucalyptusの環境がなかった(インストールに失敗した)ので、インスタンス起動は試してません笑

keypairだけ作れたよ!まあ認証通ってるのであとはEucalyptusちゃんのAPI互換性を信じるだけです。

Eucalyptus環境をお持ちの方々動かしてね!人柱デバッグ報告お待ちしてますー!

Read Or Die !!! See you next Eucalyptus!!!