0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS Lambda の使用時に推奨される関数コードのベストプラクティス

Posted at

 はじめに

 Lambdaの関数コードをコーディングする際に、ベストプラクティスに準拠することが必要であり本日はLambdaの使用時に推奨される関数コードのベストプラクティスについてまとめてみました。

 Lambdaハンドラーをコアロジックから分離します

 これをすることにより関数の単体テストが実行しやすくなります。
 Node.jsでは以下のようになる。

exports.myHandler = function(event, context, callback) {
	var foo = event.foo;
	var bar = event.bar;
	var result = MyLambdaFunction (foo, bar);

	callback(null, result);
}

function MyLambdaFunction (foo, bar) {
	// MyLambdaFunction logic here
}

 実行環境の再利用を活用して関数のパフォーマンスを向上させます

  関数ハンドラー外で SDK クライアントとデータベース接続を初期化し、静的なアセットを /tmp ディレクトリにローカルにキャッシュします。関数の同じインスタンスで処理された後続の呼び出しは、これらのリソースを再利用できます。これにより、関数の実行時間が短縮され、コストが節約されます。

呼び出し間でデータが漏れるのを防ぐため、実行環境を使用してセキュリティ上の懸念があるユーザーデータ、イベント、またはその他の情報を保存しないでください。関数がハンドラー内のメモリに保存できない変更可能な状態に依存している場合は、ユーザーごとに個別の関数または個別のバージョンの関数を作成することを検討してください。

 永続的な接続を維持するには、keep-aliveディレクトリを使用します

 Lambda は長期間アイドル状態の接続を削除します。関数を呼び出すときにアイドル状態の接続を再利用しようとすると、接続エラーが発生します。永続的な接続を維持するには、ランタイムに関連付けられている keep-alive ディレクティブを使用します。

 関数のデプロイパッケージの依存関係を制御します。

 AWS Lambda実行環境には、Node.jsおよびPythonランタイムのAWSSDKなどのライブラリがいくつか含まれている。最新の機能やセキュリティ更新プログラムを有効にするためにLambdaではこれらのライブラリを定期的に更新します。この更新に伴って、Lambda関数の動作が微妙に変わる場合があります。関数で使用する依存関係を完全に制御するには、すべての依存関係をデプロイパッケージにパッケージんぐします。

 環境変数を使用してオペレーショナルパラメーターを関数に渡します

 例えばS3に書き込む場合、書き込み先のバケットの名前はハードコーディングせず環境変数として設定します。

 環境変数とは
  環境変数は関数のバージョン固有の設定に保存される文字列のペア、環境変数を使用するとコードを更新せずに関数の動作を調整できる。
 Lambdaランタイムは環境変数をコードで使用できるようにし、関数と呼び出しリクエストに関する情報を含む追加の環境変数を設定します。

 デプロイパッケージのサイズをランタイムに必要な最小限のサイズにします

 呼び出しに先立ってデプロイパッケージをダウンロードして解凍する所要時間が短縮されます。Java または .NET Core で作成した関数の場合は、デプロイパッケージの一環として AWS SDK ライブラリ全体をアップロードしないようにします。
 代わりに必要なSDKのコンポーネントを抽出するモジュールを選択的に使用します。

 Javaで記述されたデプロイパッケージをLambdaで回答する所要時間を短縮します

 依存する .jar ファイルを別個の /lib ディレクトリに収納します。これで関数のすべてのコードを多数の .class ファイルと一緒に単一の Jar に収納するよりも高速化されます。

 依存関係の複雑さを最小限に抑えます

 フレームワークを単純化して、実行環境起動時のロードを高速化します。たとえば、Spring Framework などの複雑なフレームワークよりも、Dagger や Guice などの単純な Java 依存関係インジェクション (IoC) フレームワークを使用します。

 再帰的なコードを使用しない

 これを行うと意図しないボリュームで関数が呼び出され、料金が急増する可能性があります。誤ってこのようなコードを使用した場合は、すぐに関数の予約された同時実行数を 0 に設定して、コードを更新している間のすべての関数の呼び出しをスロットリングします。

 おわりに

 DVAを学習してる際にLambdaの使用時に推奨される関数コードのベストプラクティスをよく知らなかったので今回まとめてみました。
 (。・ω・)ノ゙バイバイ

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?