AWS SDK for Haskell開発

  • 1,756 views
Uploaded on

Haskell忘年会2012で喋った

Haskell忘年会2012で喋った

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,756
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
7
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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