Summary: AWSラムダの学習ノート
AWS Lambda
1.定義
AWS Lambda(ラムダ)はサーバーレスでプログラムのコードを実行できるフルマネージドサービスです。サーバーレスとは、EC2インスタンスなどのサーバーを必要とせずリクエスト発生時にだけプログラムが実行されるアーキテクチャのことです。サーバーレスアーキテクチャでは、インフラストラクチャの管理は完全にAWSによって行われます。
Lambdaを利用すると次のようなメリットがあります。 ・プログラム実行環境の構築や運用が不要になる ・プログラムはリージョン内の複数のAZに分散して配置される(耐障害性・可用性の向上) ・プログラムへのリクエスト数に応じたスケーリングが自動的に行われる(拡張性の向上)
2.Lambda関数の特徴
- 開発言語:Java、Node.js、Pythonなど様々
- 実行時間:最長15分
- 課金方式:リクエストに基づいく課金と実行時間(単価はメモリ量依存)に基づく課金の合計
- 実行タイミング:特定のイベントがトリガーとして発生したときに実行
ユーザーはLambda関数を実行するため
- Lambda関数の作成と更新、環境変数設定、IAMロールの設定などアプリケーションに関する設定
- Lambda関数を実行するメモリサイズや最大実行時間の指定等、リソースに関する設定
など行います。
3.Lambda関数のトリガー
Lambda関数実行の起点となるイベントを「トリガー」という、以下はトリガーとして設定できるイベントの一例です。
- Amazon S3 バケットにオブジェクトが作成された時。
- Amazon DynamoDBのテーブルに変更があった時
- Amazon SQSキューにメッセージが追加された時
- Amazon SNSからトピックが通知された時
- Amazon API Gateway経由で直接Lambda関数が呼び出された時
例えば:ユーザーがUploadされた画像ファイルがS3に保存されたときに、Lambda関数が実行されて画像ファイルの情報をDynamoDBに書き込むという利用方法があります。
4.Lambda関数のアクセス権限
- 実行ログの保存のため → CloudWatch Logsへのアクセス権限(Default)
- 他のAWSサービスへのアクセス権限を持つIAMロールによって付与します。
イメージ
5.Lambda関数のVPCアクセス
作成したLambda関数はLambda専用セキュリティVPCに配置されます。このLambda専用VPCからは、インターネットやPublicサブネット内のAWSリソースにはアクセスできますが、Privateサブネット内のAWSリソースへはアクセスできません。
Lambda関数からPrivateサブネット内のAWSリソースへアクセスさせたい場合は「VPCアクセス」の設定をします。VPCアクセスではアクセスしたいAWSリソースのあるVPCやサブネットの選択と、Lambda関数のセキュリティグループを設定します。VPCアクセスを設定するとLambda関数がサブネット毎に接続用のENI(Elastic Network Interface)を作成して、Privateサブネット内のAWSリソースへアクセスします。 VPCアクセスを設定したLambda関数は、ENIを作成したサブネットへアクセスできるようになる代わりに、インターネットへアクセスできなくなります。
VPCアクセスを設定したLambda関数からインターネットへアクセスしたい場合は、プライベートサブネットからインターネットへアクセスする方法と同様に、NATゲートウェイまたはNATインスタンスを経由します。また、インターネットを経由せずにパブリックなAWSリソースへアクセスしたい場合は、VPCエンドポイントを経由します。
6.Lambda関数の同時実行
Lambda関数は、発生したイベントの数だけ同時実行されます。ある特定の時点で、実行中のLambda関数の個数を「同時実行数」といいます。同時実行数には上限値が設定されており、東京リージョンでのデフォルトの上限値は1000です。
この上限値はアカウント全体のすべてのLambda関数に対して適応されます。そのため、ある特定のLambda関数で多数の同時実行が進行している場合、別のLambda関数の実行が制限される可能性があります。このような状況を避けるため、事前に特定のLambda関数に対して「同時実行」の数を予約できます。たとえば200を予約しておくと、その関数は200まで同時実行ができ、他の関数は合計して800までの同時実行が可能となります。
Lambda関数が初めて実行される場合や一定期間実行されていない場合は、Lambda関数の実行環境であるランタイム環境の準備に時間がかかるため、Lambda関数の処理が開始されるまで時間がかかります。(コールドスタート) 一方、同じLambda関数に対するリクエストが継続的に発生する場合は、ランタイム環境が再利用されるため準備処理が省略され、Lambda関数の開始までの時間が短くなります。(ウォームスタート)
Lambda関数のランタイム環境を事前に準備しておくことを「プロビジョニング」といい、「プロビジョニングされた同時実行」を予約することで、Lambda関数の起動時間を短縮し、レスポンス時間を改善できます。これは、Lambda関数の処理でレイテンシーの低減が重要な場合に特に有効です。(ただし「プロビジョニングされた同時実行」を予約する場合、別途料金がかかります)
7.暗号化ヘルパー
Lambda関数の環境変数には、APIキー、データベースの認証情報、アクセスキーなどの機密情報が含まれることがあります。これらの情報を暗号化することは、機密情報のセキュリティを強化し、コンプライアンスを遵守し、意図しない情報の流出を防ぐために非常に重要です。 Lambda関数の設定画面だけでなく、ログやエラーメッセージでも平文で表示されないようにする必要があります。
暗号化ヘルパーは、Lambda関数で使用する環境変数をAWS KMSを使用して暗号化し、実行時に復号して利用するためのツールです。 AWS Key Management Service(KMS)は、暗号化に使用する鍵(キー)を作成・管理するサービスです。暗号化ヘルパーはKMSを利用してデータを暗号化し、安全に管理することができます。
8.Amazon API Gateway
API Gatewayはマネージドサービスなので、Lambdaと組み合わせることで完全にサーバーレスでWebアプリケーションを実行できます。 例えばクライアントからのHTTPリクエストをAPI Gatewayで受信し、それをトリガーとしてLambda関数を実行させ、レスポンスをAPI Gateway経由で返すことができます。
API Gatewayで作成できるAPIは、クライアントとサーバー間の接続方法や機能によって以下の3種類があります。
- REST API
- HTTP API
- Socket API
9.Canaryリリース
Canaryリリースは、新しいバージョンのAPIを段階的にリリースする方法です。まず、既存本番ステージ新しいAPIバージョンをデプロイし、一部トラフィックを新しいバージョンに向けます。新しいバージョンが安定して動作確認することが確認されたら、トラフィックの割合を徐々に増やしていき、最終的にすべてトラフィック新しいバージョンに移行します。もし問題発生する場合はすぐ元のバージョンに戻すことができます。