AWS再入門2018 AWS Lambda編

2018.01.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。池田です。札幌市内小学校から「インフルエンザによる学級閉鎖や学年閉鎖となった。」という話題を耳にする季節になってきました。手洗いうがいと自宅の適度な換気を心がけようと思います。

はじめに

AWS再入門2018シリーズ第七弾です。今回はAWS Lambdaについて公式サイトの豊富な情報から基本事項などを整理していきます。

もくじ

概要

  • 対応言語で記述したコードを保存し、リクエスト(トリガーイベント発生)の都度自動実行するサーバーレスコンピューティングサービス
  • 高可用性を発揮するよう設計されており、定期的なダウンタイムはない
  • リクエスト受信の回数に合わせて自動的にスケール
  • 1日あたり数個のリクエストから1秒あたり数千のリクエストまで自動的にスケーリング
  • リクエストとコードを実行するために要した処理時間の分のみ料金が発生

対応言語

言語 コードを作成するためのツールとオプション 詳細
Node.js AWS Lambda コンソール IDE プラグインを使用する Visual Studio (Visual Studio の AWS Lambda サポートを参照) 独自の作成環境 選択した言語でコンパイルが不要な場合はコンソールを使用できます。コードは単一ファイルに保存され、ライブラリに依存しません。
Java AWS Toolkit for Eclipse を使用する Eclipse (AWS Toolkit for Eclipse で AWS Lambda を使用するを参照) 独自の作成環境 AWS Toolkit は、「コードをデプロイして Lambda 関数を作成する」で説明されているデプロイパッケージも作成します。
C# IDE プラグインを使用する Visual Studio (Visual Studio の AWS Lambda サポートを参照) .NET Core (.NET Core インストールガイド を参照してください ) 独自の作成環境 AWS Toolkit は、「コードをデプロイして Lambda 関数を作成する」で説明されているデプロイパッケージも作成します。
Python AWS Lambda コンソール 独自の作成環境 選択した言語でコンパイルが不要な場合はコンソールを使用できます。コードは単一ファイルに保存され、ライブラリに依存しません。
Golang AWS Lambda コンソール 独自の作成環境 詳細情報は、「Deploying Code and Creating a Lambda Function」をご覧ください。

他のAWSサービスとの連携例

  • Amazon S3
  • オブジェクトがバケット内に作成されたときなどに呼び出す
  • Amazon Kinesis
  • ストリームからレコードのバッチを自動的に読み取り、ストリームでレコードを検出した場合に処理を実行
  • Amazon DynamoDB
  • Amazon DynamoDB Streamsをポーリングし、規定された条件にマッチした場合に処理を実行
  • AWS CloudTrail
  • API呼び出しと関連イベントの履歴のログを取得

AWS Lambda関数を使用する際のベストプラクティス

  • Lambdaハンドラ(エントリポイント)をコアロジックから分離する
  • コンテナの再利用を駆使することでパフォーマンスを向上
  • Amazon S3に書き込む場合、書き込み先バケット名はハードコーディングせず環境変数として設定
  • デプロイパッケージの依存関係をパッケージで制御
  • デプロイパッケージのサイズをランタイムに必要な最小限のサイズにする
  • 依存する.jarファイルを別個の/libディレクトリに収納することで高速化
  • DaggerGuiceなどの単純なJava依存関係インジェクション(IoC)フレームワークを使用する
  • 関数のパフォーマンステストを実施して適切なメモリサイズを選択する
  • 関数のロードテストを実施して実施して最適なタイムアウト値を決定する
  • IAMポリシーにより最小限のアクセスを許可する
  • AWS Lambdaの制限を理解する
  • ペイロードサイズ、ファイル記述子、/tmpスペースに注意
  • 使用しないLambda関数を削除する
  • Lambda関数コード内からはメトリクスを作成または更新しないよう、AWS Lambda メトリクスやCloudWatch アラームを使用する
  • ログやAWS Lambda メトリクスやディメンションを活用してエラーを見つけ修正する
  • バッチおよびレコードの各種サイズのテストを実施してポーリング間隔を調整する
  • Kinesis ストリームのシャードを利用してスループットの向上を図る
  • デッドレターキューを作成、使用して関数の非同期エラーに対処する
  • VPCを利用するかどうか
  • RDSやElastiCacheといったパブリックに公開できないリソースにアクセスする必要がなければVPCは不要
  • Elastic Network Interface(ENI)を作成して内部リソースへアクセスする
  • Lambda専用のサブネットをVPC内に作成して利用する

制限事項

  • 呼び出しごとのリソース
  • リージョンごとの同時実行数
  • デプロイメントにおけるファイルサイズ等
  • 上記制限を超過した場合はexceeded limitsの例外でエラーとなる

AWS Lambda@Edge

  • CloudFront EventsによりLambda関数を呼び出す
  • リージョンとAmazon CloudFront エッジロケーションでLambda関数を実行
  • CloudFront リクエストとレスポンスを変更できる
  • CloudFront がビューワーからリクエストを受信した後 (ビューワーリクエスト)
  • CloudFront がリクエストをオリジンサーバーに転送する前 (オリジンリクエスト)
  • CloudFront がオリジンからレスポンスを受信した後 (オリジンレスポンス)
  • CloudFront がビューワーにレスポンスを転送する前 (ビューワーレスポンス) AWS Lambda開発者ガイド
  • 利用例
  • A/Bテストなど異なるサイトURLへ書き換えるためのCookie検査
  • User-Agentに基づいた応答
  • ヘッダーや認証トークンを検査し、対応したヘッダーを挿入することで行うアクセス制御
  • 認証情報を検査し、未認証ユーザーならログインページへリダイレクトする
  • ヘッダーの変更とURLパスの書き換えによる、キャッシュの異なるオブジェクトへ誘導

まとめ

個人用途として考えたときは活用シーンがパッと思いつかなかったのですが、Alexaのスキルなどでも利用されていることから実際に利用してみるきっかけができました。 利用料金についてもオンデマンドかつ手頃な価格で提供されていますので、Alexaスキル開発トレーニングで予習しておき、Alexaハンズオントレーニングで体験したことを(Echo購入の招待メールが届いたら)自宅でも試したいと思っています。