KEMBAR78
AWS SDK for Haskell開発 | PDF
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
                                     Attach

                Router                 Volume


                                                3
プログラマブル
全てのリソースをHTTPベースのAPIで操作可能

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

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




      Internet
         Create/Delete
                                  Instance
                                             Attach
      Attach/Detach
                         Router                Volume
    Modify

                                                        4
AWS APIライブラリ
AWSが提供
 Java:全機能に即座に対応する
 PHP:更新停滞気味(停止してるかも)
 CLI:便利だけど遅い(sh→Ruby→Javaと呼び出してた
 り)
野良(?)
 Python:ほぼ全機能を網羅(一部テキトウだけど)
 Ruby:2∼3種あり、それぞれ対応してないプロダクトが
 .NET, Android, iOS:(わかりません)
 Haskellは無い(………ことはないんだけどEC2未対応)
                                   5
ある日の出来事
          ∼AWSを使う開発案件を前に∼
seizans       今回はJavaで行こうと思います        yunomu

          なんでJavaなんですか

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

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

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

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

                                hai

                                           6
作りました


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

実装状況

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

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



                                     7
AWS APIの構造

HTTP
Parameterは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>                                           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"
                                                     12
パーサライブラリ
<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
今後の展開
予定無し
 ひと通り自分が欲しい機能は作ってしまったので…
 (仕事したくない時用の仕事)
問題
 テストをあまり書いていない
     現在は課金が発生しない範囲だけ書いている
     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使えたので)
                               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

AWS SDK for Haskell開発