CGI Perlでわかる!サーバレス

25
CGI/Perl でででで ででででで Tatsuro Hisamori id:myfinder github.com/myfinder twitter.com/myfinder

Transcript of CGI Perlでわかる!サーバレス

Page 1: CGI Perlでわかる!サーバレス

CGI/Perl でわかる! サーバレス

Tatsuro Hisamoriid:myfindergithub.com/myfindertwitter.com/myfinder

Page 2: CGI Perlでわかる!サーバレス

YAPC::Kansai 2017 のテーマ

温故知新昔の事をたずね求め(=温)そこから新しい知識・見解を導くこと

Page 3: CGI Perlでわかる!サーバレス

今日お話しすること

•前半•“ 温故” = CGI / Perl

•後半•“ 知新” = Serverless

Page 4: CGI Perlでわかる!サーバレス

今日の想定対象

•サーバレス的なものに触ったことがない人•サーバレスがいまいちわからない人•サーバレス的なものにこれから取組みたい人

Page 5: CGI Perlでわかる!サーバレス

Server = サーバ , less = ???

•サーバなきゃサービスできない•あたりまえ•サーバレス ≠ サーバ無し

•よりサーバを意識しない•もっとコードに集中する•そのための環境

Page 6: CGI Perlでわかる!サーバレス

サーバレスって盛り上がってるの?

2015/10

2015/11

2015/12

2016/01

2016/02

2016/03

2016/04

2016/05

2016/06

2016/07

2016/08

2016/09

2016/10

2016/11

2016/12

2017/010

2

4

6

Serverless にマッチしたイベント数

イベント数

出典: https://www.dropbox.com/s/3975vp9kmkxg9l1/azure を使った開発でわかったこと .pptx?dl=0

2016 年 8 月 9 月から急に盛り上がり始めた。この頃ちょうど Serverless Meetup が国内でも始まったタイミング。先行した AWS Lambda の事例や、その他クラウドの対応が本格化。

Page 7: CGI Perlでわかる!サーバレス

温故知新 の “温故”

CGI で Perl

Page 8: CGI Perlでわかる!サーバレス

CGI ?

•Common Gateway Interface•Web サーバでプログラムを動かす仕組み•環境変数と標準入出力が扱える言語なら OK

•RFC 3875

Page 9: CGI Perlでわかる!サーバレス

CGI プログラムの動作

Client

- Browser- Program

Server

- HTTPd- inetd

CGI

- perl- etc

サーバ側環境変数

標準入出力リクエスト

Page 10: CGI Perlでわかる!サーバレス

例 ) Apache + Perl で CGI• httpd.conf( から読み込まれているもの )

• Directory• どのディレクトリにあるファイルを対象とするか

• Options +ExecCGI• 対象ディレクトリ内のファイルを CGI として実行できるようにする• あと必要なら AddHandler でどの拡張子のファイルが CGI かも指定する

• CGI プログラム• レスポンスヘッダ

• 典型的には Content-type や Content-length など• レスポンスボディ

• Content-type で指定しているデータ本体、典型的には HTML や画像、 JSON等

http://httpd.apache.org/docs/2.0/ja/howto/cgi.html

Page 11: CGI Perlでわかる!サーバレス

裏側は何が起こっているのか

• 環境変数• クライアントからわたってくる情報や、サーバ自身がどのように動

いているかの情報が入っている• $ENV{'HTTP_USER_AGENT'};• $ENV{‘REQUEST_URI’};

• 標準入出力• 標準入力からは POST リクエストのデータを受け取る

• read(STDIN,$in,$ENV{'CONTENT_LENGTH'});

• 標準出力へはレスポンスを出力する ( 前述の CGI)• #!/usr/bin/perl

print "Content-type: text/html\n\n";foreach $key (keys %ENV) { print "$key --> $ENV{$key}<br>";}

Page 12: CGI Perlでわかる!サーバレス

CGI がやってくれないこと

•認証 (API Key)•スケールアウト•デプロイ環境の整備•実行管理•モニタリング環境の整備

Page 13: CGI Perlでわかる!サーバレス

CGI が出てきていた時代

•ずっと起動しているとサーバリソースが mottainai

•利用頻度が不定な業務上必要なプログラムがある•それらはいつ叩かれるか不定•レイテンシの重要度は低かった

Page 14: CGI Perlでわかる!サーバレス

温故知新 の “知新”

CGI/Perl で学ぶサーバレス

Page 15: CGI Perlでわかる!サーバレス

Perl がちゃんと活躍できそうな基盤と理由

•Microsoft Azure Functions•Bash(MINGW64) 環境•ランタイムがオープンソース= どのようにメッセージが渡ってくるかが公開されている

•Openwhisk•こちらも実装がオープンソース•Docker が使える

Page 16: CGI Perlでわかる!サーバレス

Perl+Azure でサーバレスをやる動機

•連携できるサービスが多い•NoSQL, Search, API, Storage, Queue, http(Webhook), Twillio, etc

•面倒なことを面倒見てくれる•スケール•認証•デプロイ環境

Page 17: CGI Perlでわかる!サーバレス

Azure Functions の動作 (HTTP トリガの場合 )

Client

- Browser- Program

Trigger

- HTTP- etc

Function

- perl- etc

Function App

環境変数

ファイル- $req- $res

リクエスト

Page 18: CGI Perlでわかる!サーバレス

例 ) Azure Functions + Perl でサーバレス• function.json

• bindings -> 連携サービスの記述

• type -> イベントの発火や処理後の出力の記述

• run.sh• 現状エントリポイントの対応が bash で、これは残念ながら決め打ち

• func.pl• 処理本体

Page 19: CGI Perlでわかる!サーバレス

裏側は何が起こっているのか

• 環境変数• クライアントからわたってくる情報や、サーバ自身がどのように動

いているかの情報が入っている• REQ_QUERY_*

• クエリパラメタ• REQ_HEADERS_*

• リクエストヘッダ

• ファイル• リクエストファイルからは POST リクエストや、連携するサービス

からのデータを受け取る• 環境変数 $REQ で指定されるファイルパス

• レスポンスファイルへはレスポンスを出力する ( 前述の CGI)• 環境変数 $RES で指定されるファイルパス

https://github.com/Azure/azure-webjobs-sdk-script/wiki/function.json

Page 20: CGI Perlでわかる!サーバレス

その他やってくれていること

•認証 (API Key)•スケールアウト•デプロイ環境の整備•実行管理•モニタリング環境の整備

Page 21: CGI Perlでわかる!サーバレス

もうちょっとまっとうにデプロイする例

•Sisimai

Page 22: CGI Perlでわかる!サーバレス

サーバレスで我々が手に入れるもの

•スケール•真の従量課金•単機能に分離されたシンプルなコード•コーディングレスでの多サービス連携

•必要なコードだけに集中する環境

Page 23: CGI Perlでわかる!サーバレス

サーバレスを考えるべき時

•利用頻度が不定な業務上必要なAPI( プログラム ) がある•それらはいつ叩かれるか不定•レイテンシの重要度は低い

•CGI 同様、それでなんでもかんでも解決するわけではない

Page 24: CGI Perlでわかる!サーバレス

今日お話ししたこと

•“ 温故知新”•サーバレスは CGI/Perl から紐解く“再発見 +α”と考えると理解しやすいと思う

•古の知識は新しいことを理解するのに役立つ ( こともある )

Page 25: CGI Perlでわかる!サーバレス

サーバレスとは21 世紀の CGI/Perlと考えるとわかりやすい