Geeks)企業システムの企画・開発に携わる技術者集団のブログです。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。この広告は、90日以上更新していないブログに表示しています。AWSが提供するイベントドリブンなプログラム実行環境であり、昨今ではサーバーレスアーキテクチャの実現手段として注目を集めている。関数はステートレスな実装にする必要がある。一方でステートレスな実装を追求すると、外部サーバからのデータ取得処理が増え、結果として処理パフォーマンスが悪化することが多い。状態保持(キャッシュ利用)の可否について考察し、キャッシュに関する実装や運用の一例を示す。Lambdaの関数は、ステートレスな実装にする必要がある。コードは必ず「ステートレス」なスタイルで書く必要があります。必要なだけ関数を迅速に実行し、イベント受信の回数にスケールすることができます。他のウェブサービスを呼び出すことでステートフルなデータにアクセスできます。AWSより一方で、コンテナ(Lambda関数インスタンス)が再利用された場合、前回実行時に生成したデータを引き継げるとされている。再利用されるかどうかは不定であり、確実に再利用されるようにする方法は、この記事の執筆時点では提供されていない。新しく関数のインスタンスを作成するのではなく、関数のインスタンスを保持してその後のリクエストに対応することがあります。常にインスタンスを再利用するわけではありません。ディレクトリに多少のディスク領域があります。ディレクトリのコンテンツはコンテナが停止された際に維持され、複数の呼び出しに使用できる一時的なキャッシュを提供します。AWSより以上から、AWSの公式ドキュメンテーションが求める「ステートレス」な実装とは、言葉通り「Lambda関数はあらゆる状態を持たない実装にすべき」ことを示すのではなく、「外部にマスタがある静的なデータはLambda関数上のキャッシュとして保持し、次回リクエスト時に再利用して良い」と言える。例として、S3に格納されるHTMLテンプレートにAPIサーバから取得した情報を適用して返却するLambda関数を考える。動的レスポンスを返すAPIのため、結果のキャッシュ対応はすべきでない。レスポンスは静的であり、マスタはS3側にあるため、以下のようなキャッシュの実装が可能である。Lambda関数のデプロイ、またはコンテナ破棄の後の、当該テンプレートへの初回アクセスの時は、S3から取得するそれ以外の場合は、当該テンプレートをLambda関数側に保持したキャッシュから取得するこのような仕組を構築することで、毎回S3アクセスすることによる応答速度の低下と課金発生の抑制を実現できる。図2:キャッシュ実装後の処理フロー(キャッシュにヒットした場合)以下は、キャッシュを実現するLabmda関数のPythonコードの例である。HTMLテンプレートのキャッシュ。インスタンスをまたがって保持・利用する実装にしている。恐れがあるため、/tmpディレクトリを利用する方が望ましい。上述のコードを運用する場合、S3側のテンプレートを更新した時にキャッシュ側も更新する仕組が必要になる。CLIやAWSコンソール操作によるコンテナの破棄・再作成をすることになる。執筆時点のAWSの公式ドキュメンテーションでは、純粋にコンテナ破棄だけを指示する手段の記述は見当たらなかった。Lambda関数のコードエントリを更新すればコンテナは破棄・再作成されるが、例え更新前と同じコードエントリによる更新であっても、システム運用の現場では極力避けたいオペレーションと言えるだろう。抵抗感の少ないオペレーションとして、Lambda関数の「説明」や「環境変数」の更新により、コンテナを破棄・再作成できることを、実際の動作により確認した。これらに「直近のLambda関数再作成時刻」を設定することによるキャッシュ更新は、採用しやすい運用手段のひとつと言えるだろう。図3:「説明」の更新例なお、S3上のリソース更新からコンテナ再作成操作の間、Lambda関数全体として、新旧どちらのリソースも返却し得る状態になる。これは、既存コンテナはキャッシュ上の変更前リソースを、新規コンテナではS3上の変更後リソースを利用するためである。それが許容されないシステム要件の場合、別途何らかの考慮が必要となる。最後に参考として、「コンテナの自動破棄までの時間」など、コンテナのライフサイクルに関する詳細を動作検証から考察した記事を紹介しておく。(英語)※この記事にも記載があるが、AWSの仕様として保証されるものではない点に注意が必要である。アクターモデルとAkkaの概要XP祭り2016でエンタープライズへのアジャイル開発の導入事例を講演Cloud9の概要プロフィールid:enterprisegeeks企業システムの企画・開発に携わる技術者集団です。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。月別アーカイブはてなブログをはじめよう!enterprisegeeksさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。