OIKE[ENGINEER]カレー好き。来世は印度に生まれたい。Tweet初めにIT関係の仕事をしていると、サーバーレスもしくはサーバーレスアーキテクチャって単語を耳にする事が増えてきたかと思います。レス」って言葉、よく聞きますね。ダイエット流行りの昨今、「シュガーレス(砂糖なし)」とか、日本は遅れていますが「キャッシュレス化社会(現金使用しない)」など。枚挙に暇がないですね。Lessなので、サーバーのないシステム?どうやって動くの?ともやもやしてる人が多いでしょう。私も疑問に思っていたので、今更ながら、実際にサーバーレスを触ってみました。触ってみたところ、今までのWebシステムの考え方をひっくり返すくらい、システム構成が異なるのものでした。この記事を読んでもらうことで、ひとまず「サーバーレスって何?」、サーバーレスとは「何を目的としているか?」のもやもやが解消されればいいなと考えています。対象は、社内の企画や制作の人向けです。Webやサーバーの技術屋には向けてませんのでご容赦下さい。いうわけで、サーバーレスに関して以下の順で説明します。今までの仕組み現在、ホームページを見たり、インターネットのサービスを利用する為の仕組みとして、フロントエンドと言われるWebブラウザやアプリ、バックエンドと言われるWebサーバーやデーターベースなどが挙げられます。それらを使用した一般的な仕組みとして以下のような流れとなっています。ユーザーがブラウザやアプリなどのフロントエンドからHTTPリクエストを行い、Webサーバーがリクエストを処理します。次に、バックエンドのWebサーバーやアプリケーションサーバーでは、フロントから送られてきたデータをデータベースに保存し、HTMLやJSONなどの形式でWebブラウザなどのフロントにレスポンスを返します。多くのシステムで、ロードバランサー、キャッシュ機能、データの冗長化などの仕組みが用いられています。この仕組みは、自前、データーセンターなどにかかわらず、必ずOSや各種アプリケーションを実行するための、サーバー、ネットワーク、その他の機器を必要とします。システムを稼働・運用する為の作業が発生します。ネットワークの管理、サーバーの用意、OSのインストール、メンテナンス、バックアップなどです。その作業には専任の技術者が必要とされます。システムの目的はクライアントが要求することの実現ですが、それ以外のところで問題が発生することもしばしばとなります。)を割く必要があるので、プログラム開発に全力を注げない●管理する範囲が増えると問題も増えるこの頭の痛い問題を解決するために、幾つかのサービスが登場しました。次にそのサービスを紹介します。マネージドサービス(IaaS、PaaS、SaaSなど)さて、IaaS、PaaS、SaaSって言葉は聞いたことありますか?前述の問題を解決するため、自前サーバーや、ハウジング、ホスティング等と異なる形態で、類似機能やそれまでに無い機能を提供するサービスが登場しました。それがIaaS、PaaS、SaaSです。IaaS、PaaS、SaaSは、クラウドのサービスであり、インターネットを通じて以下を提供します。システム管理を全て提供してくれるので、マネージドサービスやクラウドマネージドサービス等と呼ばれています。クラウドサービスの形態によってカバーする範囲は異なります。※クラウドサービスインターネットを通じて提供されるコンピュータのハードウェアとソフトウェアの機能くらいに考えておいて下さい。自前でPCやサーバーにインストールしてたものが必要無くなるところが、単なるインターネットを使用する場合との違いです。以下、IaaS、PaaS、SaaSの説明です。Service」の頭文字の略で「イァース」と読みます。OSやその上のソフトウエアを動かすための、インフラをインターネット上で提供するサービスです。EC2に見られるようにOSまで提供しているケースが一般的です。Azureが相当します。●サーバーをすぐ立てられる、サーバーの数を簡単に増やせる(スケールアウト)、メモリや保存容量などスペックをすぐ上げられる(スケールアップ)点がメリットです。Service」の頭文字の略で「パース」と読みます。ソフトウエアを可動させるためのOSとミドルウエアの載ったサーバーをインターネット上で提供するサービスです。Engine、Heroku、Cloud9など、が相当します。●プログラムの実行環境、例えばPHP、MySQLなどが実装されていて、インストールが不必要なのがメリットです。立ち上げたいなどと考えたときも、必要な実行環境がそろっているPaaSさえあればすぐ立ち上げられます。Service」の頭文字の略で「サース」と読みます。ソフトウエアのみインターネット上で提供するサービスです。CloudやGMAIL、cacooなど、が相当します。●導入コストが低い、専用のハードウェアが必要ない、場所を選ばず使用出来るなどのメリットがあります。利用停止も簡単にできます。以下に比較の図を示します。ベンダーが提供する範囲が以下画像の△の部分です。ここまでは、まだサーバーレスとは呼ばれていません。FaaSIaaS、PaaS、SaaSをざっと紹介しましたが、これらを更に進めたテクノロジーの一つがサーバーレスと呼ばれるものです。サーバーレスの一つの形態に、FaaSがあります。Service」の略で、実行したいこと(プログラムの機能=関数)のみを、クラウドに置いてそれを実行させるサービスです。サーバーやプラットフォーム、ソフトウエアを用意する必要はありません。動くコードを置けばそれが実行出来ます。(同義ではありませんが、サーバーレスと言うと毎回説明が必要となるので、FaaSという言葉を好んで使う人も多いようです。)以下に比較の図を示します。クラウドベンダーが提供する範囲が以下画像の△の部分です。実行したいこと(プログラムの機能=関数)と言われても、イメージが付きにくいと思いますので、少し乱暴になりますが「OKOS」を例に補足したいと思います。※OKOSについて弊社で開発・リリースしているモーニングコールアプリです。OKOSはフロントエンドにiPhone/Androidのネイティブアプリ、バックエンドにサーバーアプリケーションの構成をとっています。アプリケーションは処理の集まりです。処理を小分けにしたものを関数と呼びます。OKOSのサーバー側アプリケーションで言えば、「キャンペーンを予約する関数」、「コールする関数」「コール予約一覧」を表示する関数などがあります。そのような小分けにされた関数が統合されて一つのサーバーアプリケーションが出来ています。自前サーバーでも、PaaSでも、一つのアプリケーション全体をサーバー側に置かないと動きません。特定の言語で書かれたアプリケーションを動かすための実行環境が必要です。アプリケーションがPHPで出来ているならばPHPの実行環境、Pythonで出来ていればPythonの実行環境などが必要となります。FaaSの実行イメージ一方、FaaSですが、関数をクラウドに置くだけで動きます。特定の言語の実行環境を用意する必要もありません。下の図のようにサーバーと言う概念がありません。FaaSで実行される機能は「マイクロサービス」とも呼ばれており、それが連携してシステムを作ることとなります。サーバーレスって何?さて、ここで「サーバーレスって何?」サーバーレスとは「何を目的としているか?」まとめます。サーバーレスって何?●関数を置けば、クラウドサービスが関数を実行してくれる●各関数がマネージドサービスによって連携して動く仕組みです。何を目的とするか?●サーバーやインフラを気にせずに、開発者がプログラミングに全力を注げるようにすることを目的としていると言えるでしょう。説明してきたように、関数を動かすクラウド環境を利用しているので、サーバーがない、必要ないと言うわけではありません。自分でサーバーを管理しないということです。すれば、今までのようにOSやミドルウエアをインストールしたり、メモリ使い切ってないかとか、ダウンしてないか等を気にしたりすることが少なくて済みます。因みにサーバーレスという言葉が初めて使われたのは2012年と言われます。Functionsなど各社が提供しています。目的が素晴らしいので、ホントにそう出来ればなと思います、しかし、サーバーレスはどんな強敵も撃退出来るの?という疑問も湧きますよね。いうわけで、次にサーバーレスアーキテクチャのメリット、デメリットを見ていきます。システム管理を全て提供してくれるので、そこにリソースを割く必要が無くなります。常駐プロセスを持たず、実行時にのみ課金するというモデルなので、例えば、EC2のように起動している限り課金され続けるわけではありません。コストダウンに繋がります。●高い可用性(継続して稼働できる能力が高い)と高いスケーラビリティ(拡張性が高い)リクエスト数が増えた場合、一定程度までならマネージドサービスが自動でスケールしてくれます。24時365日稼働などミッションクリティカルなシステムでない限り大丈夫です。●マネージドサービス間での連携が簡単AWS、GCP、Azureなどに見られるように、他にもサービスを提供しており、それとの連携が容易です●ソースコード量の削減ができます。既存のシステムの問題の一部のみ解決するために使うことも出来ます。デメリット●ベンダーロックイン特定のサードパーティが用意したAPIやサービスを使うので、乗り換えたいと考えた時に容易に出来ない場合があります。Lambdaには同時実行数の制限があります。ベンダーによって申し込めば制限は変更できるようです。●ステートレス状態を保存する場合は他のサービスを利用する必要があります。●実行時間に制約バッチ処理など処理時間がかかる仕組みには向きません。●サーバーが触れないことが逆にデメリットになる場合もあります。マネージドサービス自体が落ちたり、不具合があると手の出しようがありません。●全てのシステムに向いているわけではありませんミッションクリティカルなアプリケーションには向きません。このようにメリットだけではなくデメリットもあるので、構築するシステムによって向き不向きが考えられます。サーバーレスのメリットとデメリットを考慮して利用するかどうかを決定する必要があります。4.サーバーレスアーキテクチャの導入事例さて「サーバーは放っといて、コードに注力!」なんて良いことばっかり言って、デメリットもあるし、ホントに使われてるのって思いませんか?事例を調べてみたら、今ではかなり使われています。Firebaseの事例Firebaseの事例この様に、有名な会社が大規模システムで使っている事例も沢山あります。スクエニや、日経新聞の画像処理のように直ぐに威力を発揮するようです。Lambdaを使った、すぐ出来るFaaSのサンプルを示します。LambdaはAWS(Amazonのクラウドサービス)で利用できるサーバーレス環境です。関数を置く(デプロイ)と、実行できます。使える言語は、Node.js、Java、C#、Python、Goです。今回はPyhtonを使用します。電話をかけるプログラムを書いて、Lambdaに実行させる流れとなります。●他のAWSのサービスの状態が変わった時のイベントで実行方法などあります。関数の作成1.AWSコンソールにサインイン。Lambda]を選択します。2.関数一覧画面が表示されます。右上の「関数の作成」ボタンをクリックします。一から作成1.以下のように入力し・選択し、画面下部の「関数の作成」ボタンをクリックします。画面を下にスクロールし、関数コードを表示します。以下のようにZIPファイルを選択します。コードエントリタイプ:.ZIPファイルをアップロードPythonの関数をZIPで固めたものをアップロードします。PythonファイルのZIPの方法は後述。以下のように入力し、右上の保存ボタンをクリックします。ハンドラ:lambda_functions.call_handlerlambda_functions.pyがファイル名、call_handlerが関数名としてPythonで作成しています。関数の保存に成功すると、以下のように関数名のところに「保存されました」と表示されます。上記でアップロードしたプログラムの作成手順を説明します。開発マシンにPythonはインストールされている前提です。Python自体はLambdaで実行出来るのですが、今回はPythonに含まれないTwilioを使うので、Python用のTwilioライブラリを取得します。関数を書くスクリプトを置いているフォルダで、以下実行します。DLされるものから必要なもの以外を省くと以下のようになります。lambda_functions.pyを作成し、call_handler関数を実装する相手先の電話番号と、伝えたいメッセージを入れれば電話がかかる簡単なプログラムです。Webの画面から呼び出します。lambda_functions.pyという名前で、ファイルを作成してください。今回TwiMLは別サーバーに用意しています。本来はAWSのLambdaでTwiMLを返すことが出来るので、AWS内で全て完結できます。作成したPythonスクリプトをZIPにする。間違いやすのですが、カレントディレクトリは含めません。Lambdaで実行するファイルを置いているディレクトリ直下以降のファイルとディレクトリのみ含めます。このcall.zipが上記でアップロードしたものとなります。Lambda関数のテストそれでは、再びAWSコンソールに戻り、アップロードした関数に問題がないかテストします。画面の右上の「保存」ボタンの左隣の「テスト」ボタンをクリックします。「テストイベントの設定」画面が開きます。以下のように選択・入力して画面下部の作成ボタンをクリックして下さい。右上の「テスト」ボタンの左隣でテストが選択出来るようになりました。作成した「APIGatewayTwCall」を実行します。「テスト」ボタンをクリックして下さい。成功すると以下のような表示がされます。GatewayLambda関数は直接呼び出せません。Gatewayをインターフェイスにして呼び出します。Gatewayがインターフェイスになることで、統一的なインターフェイスが設計、構築できます。セキュリティ的に問題があってもLambdaを呼び出したり出来ません。GatewayはHTTPSリクエストを受け取り、Lambda関数を呼び出すことが出来ます。Gatewayを選択します。Gatewayをクリックして下さい。「トリガーの設定」画面が下部に表示されます。以下のように設定して下さい。画面下部の「追加」ボタンをクリックして下さい。以下の画面のようになります。画面右上の「保存」ボタンをクリックして下さい。APIのエンドポイントが作成されます。API名「twilio-test-python-API」をクリックして下さい。Gatewayの設定画面が表示されます。実際はこの画面から、リクエスト⇒API⇒Lambda関数へ渡すGETパラメータ等を設定しますが、ここでは割愛します。「アクション」ボタンをクリックし「メソッドの削除」クリックでANYを削除します。再度「アクション」ボタンをクリックし「メソッドの作成」をクリックします。GETを選択し、右のチェックをクリックします。GETメソッドの設定を行います。以下のように設定して下さい。「保存」ボタンをクリック。権限追加の確認が表示されるので「OK」ボタンをクリックして下さい。GETメソッドのテストを行います。テストの下の稲妻マークをクリックして下さい。テスト画面が表示されますでの、画面下部のテストボタンをクリックして下さい。今回はしませんが、ヘッダーパラメータやクエリーストリングを渡す場合のテストもここで出来ます。テスト結果が画面に表示されます。ステータス200の場合は成功です。作成したAPIをデプロイします。デプロイして初めてURLからのアクセスが可能となります。「アクション」ボタンをクリックしAPIをデプロイを選択します。デプロイステージの選択が表示されるので、「デプロイ」ボタンをクリックして下さい。以下のように設定して下さい。デプロイ後、URLが表示されます。1.URLの末尾に作成したLambda関数名「/twilio-test-python」をつけると、Lambda関数が呼び出せます。いたずらされないように関数を削除しておきます。「twilio-test-python」をチェック後、「アクション」ボタンをクリックし削除を選択します。電話をかけるサンプルを試したい人Lambdaの説明は終わりです。上記の関数は削除しましたが、Lambdaで電話をかける関数と、呼び出し画面を用意しているので、興味のある方は私までご連絡下さい(「株式会社コンテンツでは随時エンジニアを募集してますので、興味のある方は一緒に働きましょう」)。Functionsというサーバーレス環境があります。Lambdaを利用したもので、node.jsしか使えません。やってみたところ、Lambdaより簡単に出来ました。6.サーバーレスの疑問これまで取り上げませんでしたが、以下のような疑問を持った人がいると思います。Gatewayなどのデプロイを毎回マニュアルでやるのは大変過ぎる!?少しだけ紹介しておきます。認証、認可、DBなどサーバーがないのならログイン情報などどうするのか?、データの登録や保持はどうするのか!って気になります。それに関しては、それぞれのクラウドサービスから提供されているサービスを利用することで解決できます。別のクラウドサービスと組み合わせることでも解決できます。Cognito、データーベースにRDSや、DynamoDBが用意されています。Cognitoよりは、統合認証プラットフォームAuth0が良いという話もありますし。データーベースもFirebaseを使う場合もあります。組み合わせは色々ですが、クラウドで既に用意されているサービスを使用できます。関数の配置(デプロイ)前述のLambdaは手動でアップロードしました。Gatewayも手動で作成しデプロイしていました。数が増えたり、関数のメンテナンスが必要となったら、いちいち手動ではやってらんないですよね。SAMを利用することで、マニュアルでのデプロイではなく、継続的にCLIでのデプロイが可能となります。その他、セキュリテイや料金なども気になると思いますが、ここでは触れません。●自前でサーバーの用意、管理が要らない●関数を置くだけでシステムを実現する●複雑な場合は、各マネージドサービスを連携させてシステムを実現するクラウドのサービスです。開発者としては、今までのWebシステムの構成と大きく異なるので、新鮮で覚えることも多いです。実際にサーバーレスでシステムを構築する機会はないかもしれませんが、やる機会があれば挑戦したいものです。Co.,Ltd.MEMBERABOUTCONTACT。