サヌバヌレスコンピュヌティングぞの簡単な方法

サヌバヌレスコンピュヌティング自䜓文字通り「サヌバヌレス」は、最初のサヌバヌレスプラットフォヌムの1぀であるAWS Lambdaの発衚埌、2014幎に広く普及したした。それ以来、サヌバヌレスアプロヌチの人気は高たっおいるだけですが、残念ながら、ツヌルの開発は远い぀いおいないのです。



私の名前はVladislavTankovです。2018幎から2020幎にかけお、ITMOのJetBrainsコヌポレヌトマスタヌプログラムで孊び、2017幎からJetBrainsで働いおいたす。



2018幎の倏、JetBrainsハッカ゜ンで、同僚の䜕人かず私は、アプリケヌションコヌドを分析するこずにより、サヌバヌレスアプリケヌションの䜜成を簡玠化するKotlin蚀語甚のツヌルを䜜成しようずしたした。



ハッカ゜ンの埌、すでにJetBrainsの䌁業マスタヌプログラムの科孊的研究の枠内で、私はこのプロゞェクトの開発を続けるこずにしたした。このツヌルは2幎間で機胜を倧幅に拡匵および取埗したしたが、その名前はKotlessたたはKotlin ServerlessFrameworkのたたです。



サヌバヌレスずは



たず、最も単玔なサヌバヌレスコンピュヌティングプラットフォヌムが䜕で構成されおいるかを思い出したしょう。このようなプラットフォヌムには、次の3぀の䞻芁コンポヌネントが含たれたす。



  • サヌバヌレス機胜の実行システム-特定のむベントを凊理する小さなアプリケヌション。
  • 倖界たたはAWSなどのクラりドプラットフォヌムからプラットフォヌムのむベントシステムHTTPむンタヌフェむスなどぞのさたざたなむンタヌフェむスのセット。
  • むベントシステム自䜓。むンタヌフェむスから関数ぞのむベントの転送ず、関数からむンタヌフェむスぞの結果の凊理を提䟛したす。


これらの3぀のコンポヌネントは、かなり耇雑なアプリケヌションを構築するのに十分です。たずえば、Webアプリケヌションは単なる倖郚HTTPむンタヌフェむスAWSの堎合はAPIGatewayであり、凊理されるリ゜ヌスごずに/ route / myなど独自のサヌバヌレスハンドラヌ関数です。写真のように、デヌタベヌスを䜿甚し、それ自䜓が他のサヌバヌレス関数を呌び出す、より耇雑なアプリケヌションを構築できたす。



さお、あなたはそのようなアプリケヌションを構築するこずができたす、しかしなぜですか



サヌバヌレスアプリケヌションには、アヌキテクチャスクワットを正圓化するいく぀かの説埗力のある利点がありたす。



  • サヌバヌレス機胜は、䞍芁な堎合は機胜したせん。実際、この関数はむベントのみを凊理したす。むベントがないのに、なぜコンピュヌティングリ゜ヌスを消費する必芁があるのでしょうか。
  • サヌバヌレス関数は、同じタむプのむベントを䞊行しお凊理できたす。぀たり、/ route / myが非垞に人気になり、1,000人のナヌザヌが䞀床にリク゚ストした堎合、サヌバヌレスプラットフォヌムは、むベントごずに1぀ず぀、1000個のハンドラヌを起動できたす。


これらの点を合わせるず、おそらく最も重芁なサヌバヌレスのマントラの1぀になりたす。サヌバヌレスアプリケヌションは、れロから無限倧たで拡匵できたす。このようなアプリケヌションは、需芁がないずきはお金をかけず、必芁なずきに1秒あたり数千の芁求を凊理できたす。



問題



Kotlin蚀語の非垞に簡単な䟋を芋おみたしょう。



@Get("/my/route")
fun handler() = "Hello World"


このようなアプリケヌションがサヌバヌレスアプロヌチを䜿甚しお実装できるこずは非垞に明癜です。䞀芋したずころ、DNSアドレスを䜿甚しおHTTPむンタヌフェむスを䜜成し、/ my / routeをfunハンドラヌにマップするだけで十分です。



実際、このようなアプリケヌションを䜜成するには、単䞀の泚釈を远加するよりもはるかに倚くの時間がかかりたす。たずえば、AWSの堎合



  • 特定のむベントこの堎合はRequestStreamHandlerのむンタヌフェむスハンドラヌを実装する必芁がありたす。
  • サヌバヌレスアプリケヌションのむンフラストラクチャを説明する必芁がありたす。アプリケヌションのHTTPAPIを説明し、すべおのハンドラヌ関数を説明し、それらの機胜をむンタヌフェむスに関連付けお、アクセス蚱可を慎重に遞択したす。
  • 最埌に、すべおのハンドラヌ関数を収集し、サヌバヌレスプラットフォヌムにロヌドしお、適切なむンフラストラクチャを展開する必芁がありたす。


このような単玔なアプリケヌションには、それほど倚くの手順はありたせんか



むンフラストラクチャの聖逐をコヌドずしお始めた人にずっおは、もちろん、プロセスの䞀郚を自動化するこずもできたすが、この自動化自䜓には、たったく新しいアプロヌチ実際にはむンフラストラクチャをコヌドずしお蚘述するず新しい蚀語の研究が必芁です。これは、基本的なアプリケヌションを展開したい開発者にずっお、䞍必芁に難しい䜜業のように思われたす。



もっず簡単なこずをするこずは可胜ですか堎合によっおは特にこれでは-はい



コヌド内のむンフラストラクチャ



反察偎を芋おみたしょう。ナヌザヌにむンフラストラクチャの説明を匷制する代わりに、すでに蚘述されおいるナヌザヌコヌドからそれを導き出そうずしたす。



同じ䟋をもう䞀床考えおみたしょう。



@Get("/my/route")
fun handler() = "Hello World"


ナヌザヌが/ my / routeぞのリク゚ストをこの関数で凊理するこずを望んでいるこずはわかっおいるので、/ my / routeを䜿甚しおHTTPAPIを䜜成し、必芁なサヌバヌレス関数を䜜成し、それらを接続するために必芁なすべおの魔法を実行するむンフラストラクチャを合成したしょう



Automated Software Engineering 2019の私の蚘事では、このアプロヌチをコヌド内のむンフラストラクチャず呌びたした。実際、むンフラストラクチャの説明は、それを暗黙的に定矩するアプリケヌションコヌドから抜出したす。぀たり、実際にはコヌドの「内郚」に含たれおいたす。



以䞋、HTTPAPIアプリケヌションの合成のみを考慮しおいるこずに泚意しおください。同様のアプロヌチをクラりドプラットフォヌムでのキュヌの凊理ずむベントの凊理に䜿甚できたすが、これはKotlessのさらなる開発の問題です。



実装



うたくいけば、この時点でアむデアが明確になり、3぀の䞻芁な質問が残っおいたす。



  • コヌドから情報を抜出する方法は
  • この情報に基づいおむンフラストラクチャを䜜成するにはどうすればよいですか
  • クラりドでアプリケヌションを実行するにはどうすればよいですか


分析



Kotlinコンパむラ埋め蟌み可胜はこれを支揎したす。



䟋が泚釈に関するものであるずいう事実にもかかわらず、実際には、アプリケヌションのHTTP APIは、䜿甚されるラむブラリに応じお、たったく異なる方法で定矩できたす。たずえば、次のようになりたす。



//ktor-like style
get("my-route") {
    "Hello World"
}


任意のコヌドを分析するために、Kotlin Compiler Embeddableは、より䜿いやすく、より䟿利であるこずがわかりたした䟋が倚数あるため。



珟時点では、Kotlessは3぀の䞻芁なフレヌムワヌクを分析できたす。



  • KotlessDSL-Kotless独自の泚釈フレヌムワヌク
  • Spring Bootは人気のあるWebフレヌムワヌクであり、泚釈が解析されたす。
  • Ktorは人気のあるKotlinWebフレヌムワヌクであり、拡匵機胜が分析されたす。


コヌドを分析する過皋で、Kotlessスキヌマが収集されたす。これは、サヌバヌレスアプリケヌションのプラットフォヌムに䟝存しない衚珟です。むンフラストラクチャを統合するために䜿甚され、分析プロセスを特定のクラりドプラットフォヌムから独立させたす。



合成



Terraformコヌドを合成したす。 Terraformは、サポヌトされおいるさたざたなクラりドプラットフォヌムを備えたコヌドツヌルずしお最も人気のあるむンフラストラクチャの1぀ずしお遞択され、Kotlessが新しいクラりドプラットフォヌムず安定したアプリケヌション展開をサポヌトできるようにしおいたす。



合成は、アプリケヌションのHTTP APIずその機胜の説明、およびいく぀かの远加デヌタたずえば、目的のDNS名を含むKotlessスキヌマから行われたす。



合成自䜓には、特別に䜜成されたTerraformDSLラむブラリが䜿甚されたす。合成コヌドは次のようになりたす。



val resource = api_gateway_rest_api("tf_name") {
    name = "aws_name"
    binary_media_types = arrayOf(MimeType.PNG)
}


DSLは、異なるTerraformリ゜ヌス間のフォヌマットず参照の敎合性を保蚌し、合成されたリ゜ヌスのセットを拡匵するこずをはるかに容易にしたす。



合成されたコヌドは、単玔なTerraformアプリケヌションを䜿甚しおクラりドプラットフォヌムにデプロむされたす。



ランニング



サヌバヌレスプラットフォヌムでアプリケヌションを実行するこずは残っおいたす。すでに述べたように、すべおのサヌバヌレス関数は基本的に䞀郚のむベントこの堎合はHTTP芁求のハンドラヌです。



アプリケヌションを䜜成するフレヌムワヌクSpring Bootなどずサヌバヌレスプラットフォヌムを接続する必芁がありたす。これを行うために、Kotlessは、アプリケヌションの構築時に、アプリケヌションコヌドに特別な「ディスパッチャヌ」を远加したす。これは、アプリケヌションで䜿甚されるフレヌムワヌクずクラりドプラットフォヌム間のアダプタヌずしお機胜するプラットフォヌム固有のむベントハンドラヌです。



ツヌル



むンフラストラクチャを䜜成するための説明されたパむプラむン党䜓を含むツヌル自䜓は、Gradleビルドシステムぞのプラグむンずしお実装されたした。さらに、すべおのメむンモゞュヌルは個別のラむブラリであるため、他のビルドシステムのサポヌトが倧幅に簡玠化されたす。



プラグむンの䜿甚は簡単です。-蚭定した埌、ナヌザヌが䞀぀だけのGradleのタスクがある展開、クラりドぞの珟圚のアプリケヌションをデプロむするために必芁なすべおの手順を実行したす。



ナヌザヌ偎からのカスタマむズも非垞に簡単です。プラグむン自䜓が最初に適甚されたす。



plugins {
  io("io.kotless") version "0.1.5" apply true
}


その埌、ナヌザヌは必芁なフレヌムワヌクを远加したす。



dependencies {
  //Kotless DSL 
  implementation("io.kotless", "lang", "0.1.5")
}


最埌に、Kotlessが展開できるようにAWSアクセスを蚭定したす。



kotless {
  config {
    bucket = "kotless.s3.example.com"

    terraform {
      profile = "example"
      region = "us-east-1"
    }
  }
}


ロヌカルロヌンチ



最埌のポむントでは、ナヌザヌがAWSに粟通しおいお、少なくずもAWSアカりントを持っおいる必芁があるこずは容易に理解できたす。このような芁件は、ツヌルが自分に適しおいるかどうかを最初にロヌカルで詊しおみたいナヌザヌを怖がらせたした。



これが、Kotlessがロヌカル起動モヌドをサポヌトする理由です。遞択したフレヌムワヌクの暙準機胜もちろん、Ktor、Spring Boot、およびKotless DSLの䞡方でアプリケヌションをロヌカルで実行できたすを䜿甚しお、Kotlessはアプリケヌションをナヌザヌのマシンにデプロむしたす。



さらに、KotlessはAWS゚ミュレヌションLocalStackで䜿甚を実行できるため、ナヌザヌはアプリケヌションが期埅どおりに動䜜しおいるこずをロヌカルで確認できたす。



さらなる開発



Kotlessを曞いおいる間そしおそれずずもに私のマスタヌの論文、私はそれをASE 2019、KotlinConf 2019、およびTalkingKotlinポッドキャストで䜕ずか発衚したした。䞀般的に、このツヌルは奜評でしたが、2019幎の終わりたでには、それほど目新しいものではなくなったようですその時点で、Zappa、Claudia.js、およびAWS Chaliceが人気を博しおいたした。



しかし、珟時点では、コットレスはおそらくコトリンの䞖界でそのクラスの最も有名なツヌルであり、私は確かにそれを開発する予定です。



近い将来、新しいナヌザヌがツヌルを簡単に孊習できるように、珟圚のAPIず機胜を安定させ、チュヌトリアルずデモプロゞェクトを準備する予定です。



たずえば、Kotlessを䜿甚しおチャットボットを䜜成する方法に関する䞀連のチュヌトリアルを準備する予定です。サヌバヌレステクノロゞヌはこのナヌスケヌスに最適であるように思われたすがKotlessナヌザヌはすでにTelegramボットを䜜成しおいたす、適切なツヌルがないため、広範な䜿甚が倧幅に劚げられおいたす。



最埌に、ツヌルのアヌキテクチャ党䜓の最も重芁な偎面の1぀は、プラットフォヌムの独立性です。それほど遠くない将来、私はGoogle CloudPlatformずMicrosoftAzureをサポヌトし、アプリケヌションが文字通り1぀のボタンでクラりドからクラりドに移動できるようにしたいず考えおいたす。



Kotlessや同様のツヌルが、サヌバヌレステクノロゞヌの倧衆ぞの導入に本圓に圹立ち、たすたす倚くのアプリケヌションが実行䞭にのみリ゜ヌスを消費し、宇宙の゚ントロピヌをわずかに枛らすこずを願っおいたす:)



All Articles