47. 47
#seccamp2021b3
Function as a Service
• 自分の書いたプログラムを動かす実行環境の抽象化
• プログラムをクラウドに展開
• 決められたハンドラ関数が直接呼び出される
• 実際の動作マシン台数などはクラウドが管理
• 需要に応じて増減してくれる
• ステートレスなどの制約が課される
47
59. 59
#seccamp2021b3
Function as a Service
• 関数と呼ばれる小さなコードを動かすクラウドサービス
• 各社「サーバーレス」の中心人物
• AWS Lambda
• Azure Functions
• Google Cloud Functions
• アプリのプロセス起動・終了をクラウドに任せる
• ⇒ プロセス内にデータを保存することができない(Stateless)
• 「Stateless」という制約を受け入れることで、
「フルマネージド」というメリットが得られる
60. 60
#seccamp2021b3
Function as a Service
• 「フルマネージドなPaaS」の発展系
• 利用者にとって「サーバ」という管理単位をなくしたい
• その筋のプロである「クラウド事業者」が、それぞれの方法で適切
に管理してくれる=フルマネージド
• 使う量(確保量)から使った量(使用量)へのシフト
• 事前に「台数」の確保が不要
• 短時間で起動し、必要なだけ拡張
• 実際の実行時間(たとえば100ms単位)で課金される
61. 61
#seccamp2021b3
Function as a Service
• AWS Lambda
61
exports.handler = async event => {
return {
statusCode: 200,
body: ”Hello from Lambda!”,
}
};
62. 62
#seccamp2021b3
Function as a Service
• AWS Lambda
62
exports.handler = async event => {
return {
statusCode: 200,
body: ”Hello from Lambda!”,
}
};
入力は引数eventとして渡ってくる。
eventの中身は、例えばHTTPリクエスト
の場合、Amazon API Gatewayという
別サービス側の設定に依存
63. 63
#seccamp2021b3
Function as a Service
• Azure Functions
63
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.’);
if (req.query.name || (req.body && req.body.name)) {
context.res = {
// status: 200, /* Defaults to 200 */
body: "Hello " + (req.query.name || req.body.name)
};
} else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
};
64. 64
#seccamp2021b3
Function as a Service
• Azure Functions
64
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.’);
if (req.query.name || (req.body && req.body.name)) {
context.res = {
// status: 200, /* Defaults to 200 */
body: "Hello " + (req.query.name || req.body.name)
};
} else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
};
HTTPリクエストであればreqに中身が入ってくる
ログは
context.log
65. 65
#seccamp2021b3
Function as a Service
• このように少しずつ関数のインターフェースが異なる
• けど、受け渡す内容はだいたい一緒
• 自前で抽象化レイヤーを挟んでおくのがよい
• 対応言語の壁もあるものの、標準化されて欲しい
• FaaSに関してベンダーロックインを怖がる必要はあまりない
65
66. 66
#seccamp2021b3
Function as a Service
• Azure Functionsの入出力バインディング
• 関数を実行する「トリガー」と別に入出力を行う
• 例:
• トリガーの値を元にDBクエリ
• 関数の返り値を別のキューやDBに保存
• 単純な処理をより単純に実装可能
• 副作用の無い素直な「関数」として書ける
• そもそも保存処理やエラーハンドリングを自分で書かなくて良い
66