サーバーレスとは? 簡単な事例をまじえてわかりやすく解説!

WEB・デジタルのお仕事,思わずシェアしたくなる話
2019.05.21

 サーバーレスとは、サーバーの構築や保守などの面倒な管理をすることなく、サーバー上でプログラムを実行できる仕組みです。サーバーレスコンピューティングやサーバーレスアーキテクチャとも呼ばれています。

 当たり前の話ですが、これまではちょっとしたプログラムでも、サーバーで動かすにはサーバーを構築しなければなりませんでした。しかし、このサーバーレスの仕組みを使うと、プログラムさえ作成してしまえばすぐにサーバーで実行することができます。そこで今回は、サーバーレスについて簡単な事例をまじえてわかりやすく解説してみましょう。

サーバーレスとは?

 サーバー“レス”とは言っても、冒頭の絵のようにサーバーがない(レス)ということではなく、実際にサーバーは存在します。ただ、そのサーバーの構築や保守はサーバーレスの提供会社がすべてやってくれるうえに、負荷対策まで面倒を見てくれるのです。そのため利用者はサーバーの管理が一切不要(サーバー管理レス)になるので、「サーバーレス」と呼ばれているわけです。

 たとえばプログラム開発者がサーバーレスを利用する場合、サーバーのことを一切考えなくてよくなるため、いいプログラムを書くことにのみ集中できます。これがサーバーレスの一番の利点です。

Function as a Service

 サーバーレスにはいくつかの種類があるのですが、今回はそのなかでも代表的な Function as a Service(ファンクション・アズ・ア・サービス)を使った事例をご紹介します。

 なにやら見なれない長い横文字が出てきましたが、安心してください。プログラムの関数(例えばエクセルの関数のことです)を英語で Function(ファンクション)と言うのですが、この Function を実行できるサービスのことを、「Function as a Service」と呼んでいるだけのことです。(長いのでよく「FaaS」と略されます)

 開発者は、便利なプログラム関数(Function)を作ったら、この Function as a Service にアップロードするだけで、プログラム関数を実行することができます。

サーバーレスの利用方法

 サーバーレス(Function as a Service)は、大手クラウド各社から以下のサービスが提供されています。

提供会社 サービス名
AWS(アマゾンウェブサービス) AWS Lambda(ラムダ)
マイクロソフト Azure Functions
グーグル Google Cloud Functions
IBM IBM Cloud Functions

 各社のサービス名に、関数「Functions」がついているのが特徴ですね。AWS の Lambda(ラムダ)のサービス名の確かな由来はわかりませんが、ラムダ計算(関数を使った計算方法)から、なんとなく関数「Functions」が思い浮かびます。

 それでは、今回はこの AWS Lambda(ラムダ) 使って、簡単なプログラムを作ってみましょう。

AWS Lambda(ラムダ)の使い方

事例

 簡単な事例として、当社キュービストのコーポレートサイトのHTMLファイルを、毎日決まった時間に保存するためのプラグラムを、AWS Lambda(ラムダ)で作成してみます。

 Lambda 以外にも CloudWatch Events(スケジューリングなど)、Amazon S3(ストレージ)という AWS のサービスも使います。サーバーレスは、プログラム関数の実行だけでなく、色々なサービスと連携できるので、実現したい機能をすばやく作ることができるのも魅力のひとつです。

S3 バケットの作成

 下準備として、HTMLファイルの保存先の S3 バケットを作成しておきます。

 AWSのマネジメントコンソールにログインして「サービス」→「S3」をクリックします。

 「+バケットを作成する」をクリックします。

 適当なバケット名を入力して、左下の「作成」をクリックします。(リージョンはそのままで構いません)

 以上で S3 バケットが作成されました。アクセスが「バケットとオブジェクトは非公開」になっていることを確認しておきましょう。

Lambda関数の作成

 続いて本題の Lambda関数を作成します。「サービス」→「Lambda」をクリックします。

 「関数の作成」をクリックします。

 適当な関数名を入力し、お好みのランタイム(プログラム言語)を選択したら「関数の作成」をクリックします。(アクセス権限の実行ロールは自動で作成してくれます)

 以上で Lambda関数が作成されました。下のような画面が表示されていると思います。

 下にスクロールして、メモリとタイムアウト(関数を実行できる時間)設定し、「保存」をクリックします。(メモリとタイムアウトは、実行するプログラム処理の大きさにあわせて調整してください)

実行ロールの設定

 Lambda関数から先ほど作成した S3 バケットにアクセスできるように設定します。

 実行ロールの「(関数名)〜ロールを表示」をクリックします。(これが自動で作成された実行ロールです)

 ロールの設定画面が表示されたら「ポリシーをアタッチします」をクリックします。

 「AmazonS3FullAccess」にチェックをいれて「ポリシーのアタッチ」をクリックします。

 ポリシーがアタッチされたらロールの設定画面を閉じて、Lambda関数の設定画面に戻ってください。

関数コードの作成

 Lambda関数のメイン部分となる、関数コードを作成します。今回の関数コードは次のようになります。

import urllib.request
import boto3
from datetime import datetime
s3 = boto3.resource('s3') 

def main(event, context):

    # コーポレートサイトのHTMLファイルをダウンロード
    url = 'https://www.qbist.co.jp/'
    html = urllib.request.urlopen(url).read()
    
    # 保存先のS3のバケット名とファイル名の指定
    bucket = 'sample-qbist'
    key = 'www-qbist-co-jp-' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.html'
    
    # S3への保存実行
    obj = s3.Object(bucket, key) 
    obj.put(Body=html)
    
    return

 関数コードの「File」メニューから「New File」を選択します。

 新ファイルが作成されますので、関数コードを入力し、「File」→「Save」を選択します。

 適当なファイル名を入力して「Save」をクリックします。

 「ハンドラ」に「<拡張子なしのファイル名>.<関数名>」(今回の例では「sample.main」になります)を入力して「保存」をクリックすれば、関数コードの作成完了です。

Lambda関数のテスト

 以上で Lambda関数が完成しました。動作チェックのためテストしてみましょう。

 画面上部にあるメニューから「テストイベントの設定」を選択します。

 イベント名に適当な名前を入力して、画面下にある「作成」をクリックします。

 作成したテストイベントを選択したら「テスト」クリックして Lambda関数を実行します。

 Lambda関数が実行され、実行結果が表示されます。

 S3のバケットに、HTMLファイルが保存されていることも確認しておきましょう。

トリガーの追加(Lambda関数の自動実行)

 最後に、トリガーを追加して、Lambda関数が定時に実行されるように設定します。

 トリガーの追加に表示されている「CloudWatch Events」をクリックします。

 「CloudWatch Events」を選択した状態で、トリガーの設定から「新規ルールの作成」を選択します。

 「ルール名」と「スケジュール式」を入力して「追加」をクリックします。スケジュールの時間は、UTC(協定世界時)で設定する必要がありますので、例えば日本時間の23時に実行したい場合は、時差の9時間を引いて14時を設定します。

 スケジュール式の書式は次の通りです。詳しくは以下の公式ドキュメントをご参照ください。
cron(分 時間 日 月 曜日 年)

ルールのスケジュール式 – Amazon CloudWatch Events

 画面右上の「保存」をクリックすれば、トリガーが追加され Lambda関数が定時実行されるようになります。

おしまいに

 AWS Lambda などの Function as a Service のサーバーレスは、ウェブサイトのように常にアクセスされるようなサーバーには向きませんが、サーバーレスは、使った時間とメモリに応じて課金されるため、今回の事例のように1日1回だけ実行されるような関数コードであれば、ほとんど料金はかかりません。

 適材適所でサーバーレスをうまく使えば、サーバー管理から解放されるだけでなく、費用も節約することができますね。

関連記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です