aws sdk for haskell開発
Post on 27-Jun-2015
1.968 Views
Preview:
DESCRIPTION
TRANSCRIPT
AWS SDK for Haskell野村裕佑
今日の結論
AWS(Amazon Web Services)を操作するためのAPIライブラリを作りました
スクラッチから自作
仕事でAWSを使うので仕事だと言い張って
実際に仕事で使っている
2
Amazon Web Services(AWS)
プログラマブルデータセンター(と誰かが言ってた)
EC2:サーバ(仮想マシン)、ディスク、NIC、サブネット、IPアドレス等の資源を時間課金で利用
他にもサービスは色々:Storage, LB, RDB, DNS, CDN, Cache, KVS, E-Mail, Queue, Notify, MR, ...
Instance
Volume
Attach
Router
3
プログラマブル
全てのリソースをHTTPベースのAPIで操作可能
WebのコンソールよりAPIの方が多機能
様々な言語でAPIライブラリが開発されている
Instance
Volume
Attach
Router
InternetCreate/Delete
Attach/Detach
Modify
4
AWS APIライブラリAWSが提供
Java:全機能に即座に対応するPHP:更新停滞気味(停止してるかも)CLI:便利だけど遅い(sh→Ruby→Javaと呼び出してたり)野良(?)
Python:ほぼ全機能を網羅(一部テキトウだけど)Ruby:2~3種あり、それぞれ対応してないプロダクトが.NET, Android, iOS:(わかりません)Haskellは無い(………ことはないんだけどEC2未対応)
5
ある日の出来事~AWSを使う開発案件を前に~
なんでJavaなんですか
今回はJavaで行こうと思います
AWSライブラリが充実してるのがJavaとPythonだからです
なんでHaskellじゃないんですか
ライブラリがあればHaskellにしてました
ライブラリ書けばいいじゃないですか
hai
seizans yunomu
6
作りました
hackageDB: aws-sdk初リリース:2012年9月29日
実装状況
EC2: 85/141(私がよく使うAPIはだいたいできた)
他プロダクト{ELB, RDS, CloudWatch}: 少々
7
AWS APIの構造
HTTPParameterはGETのQuery String形式(一部POST/XML)AWS AccessKey/SecretAccessKeyから生成したSignatureで認証ResponseはXML
Request: (Parameter+Signature)
Response: XML or HTTP Status Code
8
aws-sdk開発方針
レスポンスパーサを簡単に書けるようにするAPI数が多いので(EC2だけで141個)
できるだけAPIマニュアル通りに実装するAWSの更新が多いので、凝ると変更への追随がつらくなる機能よりAPI数(ドキュメント流用できないかなぁ)
リソース数が膨大すぎる時の事も考える社内事情(気休め)
9
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
XMLパーサ(xml-conduit)
XMLは要素がネストしている
要素の中に子要素、子要素の中に孫要素
パーサもネストしている
パーサの引数に子要素のパーサを渡す
タグの外側の改行も空白も除去してくれない
Attributeの有無、子要素の有無、タグの有無...
書くのがとても面倒くさい
11
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
パーサライブラリ
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
今後の展開
予定無しひと通り自分が欲しい機能は作ってしまったので…(仕事したくない時用の仕事)
問題テストをあまり書いていない現在は課金が発生しない範囲だけ書いているAPI変更に追随するために本当は書かないといけない
awsパッケージの存在ver.1.0.0.0はいつにしよう格好わるいところが色々ある……
14
awsパッケージとの関係
実は先行例があった:AWS library for Haskell
ただしEC2未対応
SES, SQS, S3, SimpleDBには対応
aws-sdkをHackageに登録直後に向こうの作者から連絡
「いっしょにやろうぜ」「ごめんちょっと待って」←イマココ
統合したいような面倒くさいような
15
今やってること
自己紹介野村裕佑(github: yunomu)
得意分野:OS, Network, サーバ管理など株式会社ワークスアプリケーションズATE本部クラウド運用研究グループ運用管理業務のことを考えて実行する仕事
システム運用管理ツール開発AWSを利用するシステムを管理する基盤にyesodを採用(チーム全員がHaskell使えたので)私はJava書いてます 16
派生物いろいろ
お勉強・実験Conduit勉強会http-conduitソースコード読みパーサライブラリの整備TemplateHaskellで遊ぶ
aws-sdk Author希望者向けチュートリアル@daimatz さんがやりました
開発者を集める@seizans さんがやってます
17
AWS SDK for Haskell
作ってますHackageDB: aws-sdk
EC2をHaskellから操作できるようになりました
ELB, RDS, CloudWatchも対応予定
利用者, Author, Requestなど歓迎
18
top related