AWS SDK for Haskell開発

18
AWS SDK for Haskell 野村裕佑

description

Haskell忘年会2012で喋った

Transcript of AWS SDK for Haskell開発

Page 1: AWS SDK for Haskell開発

AWS SDK for Haskell野村裕佑

Page 2: AWS SDK for Haskell開発

今日の結論

AWS(Amazon Web Services)を操作するためのAPIライブラリを作りました

スクラッチから自作

仕事でAWSを使うので仕事だと言い張って

実際に仕事で使っている

2

Page 3: AWS SDK for Haskell開発

Amazon Web Services(AWS)

プログラマブルデータセンター(と誰かが言ってた)

EC2:サーバ(仮想マシン)、ディスク、NIC、サブネット、IPアドレス等の資源を時間課金で利用

他にもサービスは色々:Storage, LB, RDB, DNS, CDN, Cache, KVS, E-Mail, Queue, Notify, MR, ...

Instance

Volume

Attach

Router

3

Page 4: AWS SDK for Haskell開発

プログラマブル

全てのリソースをHTTPベースのAPIで操作可能

WebのコンソールよりAPIの方が多機能

様々な言語でAPIライブラリが開発されている

Instance

Volume

Attach

Router

InternetCreate/Delete

Attach/Detach

Modify

4

Page 5: AWS SDK for Haskell開発

AWS APIライブラリAWSが提供

Java:全機能に即座に対応するPHP:更新停滞気味(停止してるかも)CLI:便利だけど遅い(sh→Ruby→Javaと呼び出してたり)野良(?)

Python:ほぼ全機能を網羅(一部テキトウだけど)Ruby:2~3種あり、それぞれ対応してないプロダクトが.NET, Android, iOS:(わかりません)Haskellは無い(………ことはないんだけどEC2未対応)

5

Page 6: AWS SDK for Haskell開発

ある日の出来事~AWSを使う開発案件を前に~

なんでJavaなんですか

今回はJavaで行こうと思います

AWSライブラリが充実してるのがJavaとPythonだからです

なんでHaskellじゃないんですか

ライブラリがあればHaskellにしてました

ライブラリ書けばいいじゃないですか

hai

seizans yunomu

6

Page 7: AWS SDK for Haskell開発

作りました

hackageDB: aws-sdk初リリース:2012年9月29日

実装状況

EC2: 85/141(私がよく使うAPIはだいたいできた)

他プロダクト{ELB, RDS, CloudWatch}: 少々

7

Page 8: AWS SDK for Haskell開発

AWS APIの構造

HTTPParameterはGETのQuery String形式(一部POST/XML)AWS AccessKey/SecretAccessKeyから生成したSignatureで認証ResponseはXML

Request: (Parameter+Signature)

Response: XML or HTTP Status Code

8

Page 9: AWS SDK for Haskell開発

aws-sdk開発方針

レスポンスパーサを簡単に書けるようにするAPI数が多いので(EC2だけで141個)

できるだけAPIマニュアル通りに実装するAWSの更新が多いので、凝ると変更への追随がつらくなる機能よりAPI数(ドキュメント流用できないかなぁ)

リソース数が膨大すぎる時の事も考える社内事情(気休め)

9

Page 10: AWS SDK for Haskell開発

Response例(DescribeInstances)<DescribeInstancesResponse xmlns='http://ec2.amazonaws.com/doc/2012-10-01/'> <requestId>fdcdcab1-ae5c-489e-9c33-4637c5dda355</requestId> <reservationSet> <item> <reservationId>r-0ece705a</reservationId> <ownerId>053230519467</ownerId> <groupSet/> <instancesSet> <item> <instanceId>i-7a00642e</instanceId> <imageId>ami-1cd4924e</imageId> <instanceState> <code>16</code> <name>running</name> </instanceState> <privateDnsName/> <dnsName/> <reason/> <keyName>VPCKey</keyName> <amiLaunchIndex>0</amiLaunchIndex> <productCodes/> <instanceType>c1.medium</instanceType> <launchTime>2012-06-28T17:41:48.000Z</launchTime> <placement> <availabilityZone>ap-southeast-1b</availabilityZone> <groupName/> <tenancy>default</tenancy> </placement> <platform>windows</platform> <monitoring> <state>disabled</state> </monitoring> <subnetId>subnet-c53c87ac</subnetId> <vpcId>vpc-cc3c87a5</vpcId> <privateIpAddress>10.0.0.12</privateIpAddress> <ipAddress>46.51.219.63</ipAddress> <sourceDestCheck>true</sourceDestCheck> <groupSet> <item> <groupId>sg-374b565b</groupId> <groupName>quick-start-3</groupName> </item> </groupSet> <architecture>x86_64</architecture> <rootDeviceType>ebs</rootDeviceType> <rootDeviceName>/dev/sda1</rootDeviceName> <blockDeviceMapping> <item> <deviceName>/dev/sda1</deviceName>

10

Page 11: AWS SDK for Haskell開発

XMLパーサ(xml-conduit)

XMLは要素がネストしている

要素の中に子要素、子要素の中に孫要素

パーサもネストしている

パーサの引数に子要素のパーサを渡す

タグの外側の改行も空白も除去してくれない

Attributeの有無、子要素の有無、タグの有無...

書くのがとても面倒くさい

11

Page 12: AWS SDK for Haskell開発

Responseパーサの例(DescribeInstances)describeInstances instances filters = ec2QuerySource "DescribeInstances" params $ itemConduit "reservationSet" $ Reservation <$> getT "reservationId" <*> getT "ownerId" <*> itemsSet "groupSet" (Group <$> getT "groupId" <*> getT "groupName" ) <*> itemsSet "instancesSet" (Instance <$> getT "instanceId" <*> getT "imageId" <*> element "instanceState" (codeToState <$> getT "code" <* getT "name" ) <*> getT "privateDnsName" <*> getT "dnsName" <*> getT "reason" <*> getT "keyName" <*> getT "amiLaunchIndex" <*> itemsSet "productCodes" (ProductCode <$> getT "productCode" <*> get "type" ) <*> getT "instanceType" <*> getT "launchTime" <*> element "placement" (Placement <$> getT "availabilityZone" <*> getT "groupName" <*> getT "tenancy" ) <*> getMT "kernelId"

12

Page 13: AWS SDK for Haskell開発

パーサライブラリ

13

<amiLaunchIndex>0</amiLaunchIndex><productCodes/><instanceType>c1.medium</instanceType><launchTime>2012-06-28T17:41:48.000Z</launchTime><placement> <availabilityZone>ap-southeast-1b</availabilityZone></placement>

<*> getT "amiLaunchIndex"<*> itemsSet "productCodes" (ProductCode <$> getT "productCode" <*> get "type" ) <*> getT "instanceType"<*> getT "launchTime"<*> element "placement" (Placement <$> getT "availabilityZone" <*> getT "groupName" <*> getT "tenancy" )

data Instance = Instance    { instanceId :: Text ...    , instanceAmiLaunchIndex :: Int    , instanceProductCodes :: [ProductCode]    , instanceType :: Text    , instanceLaunchTime :: UTCTime    , instancePlacement :: Placement

Page 14: AWS SDK for Haskell開発

今後の展開

予定無しひと通り自分が欲しい機能は作ってしまったので…(仕事したくない時用の仕事)

問題テストをあまり書いていない現在は課金が発生しない範囲だけ書いているAPI変更に追随するために本当は書かないといけない

awsパッケージの存在ver.1.0.0.0はいつにしよう格好わるいところが色々ある……

14

Page 15: AWS SDK for Haskell開発

awsパッケージとの関係

実は先行例があった:AWS library for Haskell

ただしEC2未対応

SES, SQS, S3, SimpleDBには対応

aws-sdkをHackageに登録直後に向こうの作者から連絡

「いっしょにやろうぜ」「ごめんちょっと待って」←イマココ

統合したいような面倒くさいような

15

Page 16: AWS SDK for Haskell開発

今やってること

自己紹介野村裕佑(github: yunomu)

得意分野:OS, Network, サーバ管理など株式会社ワークスアプリケーションズATE本部クラウド運用研究グループ運用管理業務のことを考えて実行する仕事

システム運用管理ツール開発AWSを利用するシステムを管理する基盤にyesodを採用(チーム全員がHaskell使えたので)私はJava書いてます 16

Page 17: AWS SDK for Haskell開発

派生物いろいろ

お勉強・実験Conduit勉強会http-conduitソースコード読みパーサライブラリの整備TemplateHaskellで遊ぶ

aws-sdk Author希望者向けチュートリアル@daimatz さんがやりました

開発者を集める@seizans さんがやってます

17

Page 18: AWS SDK for Haskell開発

AWS SDK for Haskell

作ってますHackageDB: aws-sdk

EC2をHaskellから操作できるようになりました

ELB, RDS, CloudWatchも対応予定

利用者, Author, Requestなど歓迎

18