CGI Perlでわかる!サーバレス
-
Upload
tatsuro-hisamori -
Category
Technology
-
view
291 -
download
0
Transcript of CGI Perlでわかる!サーバレス
CGI/Perl でわかる! サーバレス
Tatsuro Hisamoriid:myfindergithub.com/myfindertwitter.com/myfinder
YAPC::Kansai 2017 のテーマ
温故知新昔の事をたずね求め(=温)そこから新しい知識・見解を導くこと
今日お話しすること
•前半•“ 温故” = CGI / Perl
•後半•“ 知新” = Serverless
今日の想定対象
•サーバレス的なものに触ったことがない人•サーバレスがいまいちわからない人•サーバレス的なものにこれから取組みたい人
Server = サーバ , less = ???
•サーバなきゃサービスできない•あたりまえ•サーバレス ≠ サーバ無し
•よりサーバを意識しない•もっとコードに集中する•そのための環境
サーバレスって盛り上がってるの?
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 の事例や、その他クラウドの対応が本格化。
温故知新 の “温故”
CGI で Perl
CGI ?
•Common Gateway Interface•Web サーバでプログラムを動かす仕組み•環境変数と標準入出力が扱える言語なら OK
•RFC 3875
CGI プログラムの動作
Client
- Browser- Program
Server
- HTTPd- inetd
CGI
- perl- etc
サーバ側環境変数
標準入出力リクエスト
例 ) 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
裏側は何が起こっているのか
• 環境変数• クライアントからわたってくる情報や、サーバ自身がどのように動
いているかの情報が入っている• $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>";}
CGI がやってくれないこと
•認証 (API Key)•スケールアウト•デプロイ環境の整備•実行管理•モニタリング環境の整備
CGI が出てきていた時代
•ずっと起動しているとサーバリソースが mottainai
•利用頻度が不定な業務上必要なプログラムがある•それらはいつ叩かれるか不定•レイテンシの重要度は低かった
温故知新 の “知新”
CGI/Perl で学ぶサーバレス
Perl がちゃんと活躍できそうな基盤と理由
•Microsoft Azure Functions•Bash(MINGW64) 環境•ランタイムがオープンソース= どのようにメッセージが渡ってくるかが公開されている
•Openwhisk•こちらも実装がオープンソース•Docker が使える
Perl+Azure でサーバレスをやる動機
•連携できるサービスが多い•NoSQL, Search, API, Storage, Queue, http(Webhook), Twillio, etc
•面倒なことを面倒見てくれる•スケール•認証•デプロイ環境
Azure Functions の動作 (HTTP トリガの場合 )
Client
- Browser- Program
Trigger
- HTTP- etc
Function
- perl- etc
Function App
環境変数
ファイル- $req- $res
リクエスト
例 ) Azure Functions + Perl でサーバレス• function.json
• bindings -> 連携サービスの記述
• type -> イベントの発火や処理後の出力の記述
• run.sh• 現状エントリポイントの対応が bash で、これは残念ながら決め打ち
• func.pl• 処理本体
裏側は何が起こっているのか
• 環境変数• クライアントからわたってくる情報や、サーバ自身がどのように動
いているかの情報が入っている• REQ_QUERY_*
• クエリパラメタ• REQ_HEADERS_*
• リクエストヘッダ
• ファイル• リクエストファイルからは POST リクエストや、連携するサービス
からのデータを受け取る• 環境変数 $REQ で指定されるファイルパス
• レスポンスファイルへはレスポンスを出力する ( 前述の CGI)• 環境変数 $RES で指定されるファイルパス
https://github.com/Azure/azure-webjobs-sdk-script/wiki/function.json
その他やってくれていること
•認証 (API Key)•スケールアウト•デプロイ環境の整備•実行管理•モニタリング環境の整備
もうちょっとまっとうにデプロイする例
•Sisimai
サーバレスで我々が手に入れるもの
•スケール•真の従量課金•単機能に分離されたシンプルなコード•コーディングレスでの多サービス連携
•必要なコードだけに集中する環境
サーバレスを考えるべき時
•利用頻度が不定な業務上必要なAPI( プログラム ) がある•それらはいつ叩かれるか不定•レイテンシの重要度は低い
•CGI 同様、それでなんでもかんでも解決するわけではない
今日お話ししたこと
•“ 温故知新”•サーバレスは CGI/Perl から紐解く“再発見 +α”と考えると理解しやすいと思う
•古の知識は新しいことを理解するのに役立つ ( こともある )
サーバレスとは21 世紀の CGI/Perlと考えるとわかりやすい