投稿者:熊谷

クラウドネイティブ開発チームの熊谷です。 いかがお過ごしでしょうか。寒い時期になってコーヒーが美味しい季節です。

さて今回は、モダンなアーキテクチャのキーワードとして出てくるサーバレスアーキテクチャについて簡単に説明し、5分でそのサーバレスアーキテクチャをGoogle Cloud Platform(GCP)上に構築する記事となります。

サーバレスアーキテクチャとは

サーバレスだからといって、"サーバがない"と解釈するのは半分正しくて半分正しくありません。
サーバレスは、"なにかしらのリクエスト(要求)が発生したときのみ、サーバ(アプリケーション)が起動する"仕組みになります。
そのため、サーバが全く無いわけではなく、必要なときだけサーバの区画が用意され、アプリケーションが実行される仕組みになります。

つまりは、リクエストがない時間はコンピュートリソース(サーバ)が必要なく、リクエストを処理している間だけリソースが必要になります。 ここで、登場するのが、パブリッククラウドの従量課金の考えです。レガシーアキテクチャでは例え1日の中で稼働している時間が一瞬だったとしても、"ピークを想定した"リソースがオンプレミスに用意されています。
サーバレスは、パブリッククラウド環境に必要な時に必要な分だけのリソースを確保することができ、ランニングコストを非常に抑えることができます。

01

サーバレスアーキテクチャはコンテナにより仮想されているため、リクエストを受けてからのサーバ起動はかなり早いです。とはいえ、リクエストを受けてからウォームアップの時間が必要なことは押させておく必要があります。

そのサーバスペックは本当に必要なのか

また、一説によると、オンプレミスに用意されたリソースはたった30%しか活用されていないという調査もあります。特に日本人の思想から考えると"何かあったときのため"という心理や、"調達や構築にコストがかかるなら、ある程度多く見積もっておく"という心理が働いているのだと思います。
また、アプリケーションベンダが要求するスペックも"パフォーマンスが出ない"とクレームを受けかねないため、リソースは多く見積もられている可能性もあります。
このように、従来のオンプレミス環境では様々な思惑が重なり合い、最適なシステム環境とは言えません。

そこで目を向けるのが再びクラウドです。

クラウド環境であれば、--特にクラウドネイティブを意識して作られたアプリケーションやアーキテクチャは、水平垂直のスケールが数分で実施することができます。(更には自動的に拡張できるオートスケールも組み込めます)

02.png

GCPでサーバレスを体験

ここから5分でGCP上にサーバレス環境する手順になります。

※ 本ハンズオンは料金が発生する可能性があります。
※ 最新のgclooud コマンドを導入済み且つ作業プロジェクトを設定していることを想定しています。
※ 操作ユーザはCloud Functionsを作成できるIAM権限を持っている想定です。
※ windows環境での実施です。
※ 本ハンズオンを実施したあとはかならず"クリーンナップ"を実施してください。

まずコマンドプロンプトを起動し、以下のコマンドを実施してください。

mkdir faas-5min
cd faas-faas
echo #nothing instal packege >  requirements.txt
notepad main.py

上記コマンドを実行するとメモ帳が起動するので、下記pythonプログラムをコピー&ペーストしてファイルを保存してください。

def hello_world(request):
    """Responds to any HTTP request.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text or any set of values that can be turned into a
        Response object using
        `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
    """
    request_json = request.get_json()
    if request.args and 'message' in request.args:
        return request.args.get('message')
    elif request_json and 'message' in request_json:
        return request_json['message']
    else:
        return f'Hello World!'

ここまで、コマンドプロンプトで、Cloud Functionsで稼働するプログラムのディレクトリを作成し、Pythonプログラムの配置を行っています。 次のコマンドで、実際にGCP上にビルドしていきます。

gcloud functions deploy faas-5min --memory=128MB --runtime=python38 --trigger-http --source=%CD% --entry-point=hello_world

このコマンドを実行すると、ソースコードがGCPにアップロードされ、コンテナがデプロイされます。これは2分ほどかかります。
実施したコマンドの内容は下記になります。

コマンド 概要
gcloud functions deploy [インスタンス名] インスタンスをデプロイするコマンドになります。
--memory=128MB メモリサイズの指定です。今回はデモなので最小の128MB
--runtime=python38 Cloud Functionsで実行するプログラム言語の指定。今回はPython3.8です。
--trigger-http Cloud Functionsを起動するトリガーになります。今回はインターネットに公開するため、httpとしています。その他ファイル更新でキックするものもあります。
--source=%CD% ローカルPCで作成した、実行するアプリケーションのソースファイルのPathの指定です。%CD%はcmdでカレントパスを格納している変数になります。ここに格納されいているファイルはクラウドにアップロードされます。
--entry-point=hello_world トリガーにより起動されるPythonプログラムの関数名になります。 今回で言うと、main.pyのhello_world関数になります。

さて、そろそろCloud Functionsが起動しているはずです。 先ほど実施した、gcloudコマンドの戻り値のサンプルです。

For Cloud Build Stackdriver Logs, visit: https://console.cloud.google.com/logs/viewer?project=[your PJ name ]&advancedFilter=resource.type%3Dbuild%0Aresource.labels.build_id%3Df484a385-b9fb-4ef7-ac4f-c17d2cd5834f%0AlogName%3Dprojects%2F[I like coffe]%2Flogs%2Fcloudbuild
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 128
buildId: f484a385-b9fb-4ef7-ac4f-c17d2cd5834f
entryPoint: hello_world
httpsTrigger:
  url: https://us-central1-[yourPJname].cloudfunctions.net/faas-5min
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/[yourPJname]/locations/us-central1/functions/faas-5min
runtime: python38
serviceAccountEmail:[yourPJname]@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-random.zip?xxx
status: ACTIVE
timeout: 60s
updateTime: '2020-11-xxT08:11:31.317Z'
versionId: '1'

このcmdの戻り値から、以下の文字列を探し、URL: から後をコピーして、ブラウザでアクセスしてください。

「Hello World!」という文字列が表示されます。

クリーンナップ

コマンドプロンプトで、以下のコマンドを実施してください。

gcloud functions delete faas-5min

上記コマンドを実施した後、対話形式で以下の質問を聞かれるため、"Y"を入力しエンターを押します。

Do you want to continue (Y/n)?

削除まで時間が少々かかります。きちんと消えているか再度先ほど表示したWEBページを更新してみてください。"Error: Forbidden"と表示されると確実に削除されています。

まとめ

03.png

いかがでしたでしょうか? 5分でサーバレス環境を作ることができましたでしょうか。
今回はPythonで"Hello World!"をしました。あとはソースコードを書き換えてサーバレス環境を活用することができます。
コンテナ技術もあいまって、オンプレミスサーバと比べてサービスの公開速度の違いを体験でいましたでしょうか。

さらに詳しい内容や、NI+Cにサポートしてほしい!という方や、「一緒にクラウドネイティブアプリを作りたい!」というかたは下記リンクからお気軽にお問い合わせください。