Edited at

Scalaによるtype-safeなCloudFormation DSL

More than 1 year has passed since last update.


自己紹介

渋谷 充宏 @m4buya


  • 株式会社オプト テクノロジー開発部 チームマネージャー

  • Ruby / Scala / インフラ

  • https://github.com/mshibuya

  • RailsAdmin/CarrierWave committer

  • ADPLAN SREチームリーダー(New!)



SREチームを立ち上げました

が、人が足りてません…

株式会社オプトではSREを含めエンジニアを積極採用中です!



アジェンダ


  • 前提知識

  • ScalaMatsuriへの応募内容

  • cloudformal


    • 特長

    • 実際のコード



  • 今後の展望

  • まとめ



前提知識


  • CloudFormationとは

JSON(やYAML)でAWSインフラが作れるやつです!



LoadBalancerを作る

"Resources" : {

"ApplicationLoadBalancer" : {
"Type" : "AWS::ElasticLoadBalancingV2::LoadBalancer",
"Properties" : {
"Subnets" : {
"Ref" : "Subnets"
}
}
}
}



条件分岐

"Size" : {

"Fn::If" : [
"CreateLargeSize",
"100",
"10"
]},



これ、つらくない…?

生で書くと死ぬやつなので、いろんなDSLがあります


  • kumogata

  • troposphere

  • cloudformation-template-generator

  • cloudform



ScalaMatsuriへの応募内容



cloudformal

https://github.com/mshibuya/cloudformal



特長


  • CloudFormationの更新に簡単に追従

  • 静的な型チェック

  • Object-Orientedなモデリング



CloudFormationの更新に簡単に追従

Cloudformalのコードの大半はAWSが公開しているCloudFormation Resource Specificationより自動生成されており、コマンド一発で追従できます。



静的な型チェック

def blockDeviceMappings: Property[Seq[BlockDeviceMapping]] = Empty

def creditSpecification: Property[CreditSpecification] = Empty
def disableApiTermination: Property[Boolean] = Empty
def ebsOptimized: Property[Boolean] = Empty
def elasticGpuSpecifications: Property[Seq[ElasticGpuSpecification]] = Empty



Object-Orientedなモデリング

trait ServerInstance extends aws.ec2.Instance {

def image: AMIImage
def imageId: String = image.id
}

case class BatchServerInstance(
image: BatchServerImage
) extends ServerInstance

case class WebServerInstance(
image: WebServerImage
) extends ServerInstance



今後の展望


  • CLIが全然しょぼいので整備したい

  • テストコード書きたい

  • ドキュメント整備したい



まとめ


  • インフラ×型安全、意外といけるのでは

  • とはいえ実用はこれから

  • 可能性を感じていただけたら、ぜひ使ってみてください!



最後に

Starお待ちしてます★

https://github.com/mshibuya/cloudformal