AWS Lambda
AWS Lambda概要
インフラストラクチャの運用管理が不要です。つまりは、サーバーの環境構築や保守運用が不要です。LambdaはLambda関数と呼ばれる小さいアプリケーションコードを実行する基盤を提供します。また、必要に応じたスケールアウトなどスケーラビリティやキャパシティの管理もAWSによって行われます。これがサーバレスアーキテクチャです。
別の特徴としてイベントドリブンであることが挙げられます。イベントドリブンとは、例えばS3のバケットへのオブジェクトの保存、またはDynamoDBへのテーブルの項目変更といった何らかのイベントに対応して、Lambdaに登録されたコードが実行されることなどを言います。各サービスとのインテグレーションが行われています。(もちろん、イベントドリブンだけではなく普通にPOSTなどのメソッドも可能)AWSサービス以外にもカスタムイベントとして追加することも可能。
EC2は常時起動なのに対して、Lambdaは実行回数に対して料金が発生するのでコスト効率が良いです。
AWS Lamdbaの使い方
イベントソースとイベント
サポートされるイベントソース。
- S3
- DynamoDB
- Amazon Kinesis Stremas
- SNS
- SES
- Cognito
- CloudFormation
- CloudWatch Logs
- CloudWatch Events
- CodeCommit
- Config
- Echo
- Lex
- API Gateway
呼び出しタイプが予め決められています。
- 同期呼び出し
- 非同期呼び出し
モニタリングとロギング
LambdaはLambda関数の実行を監視しており、リクエスト数、遅延、エラー数といったメトリクスをCloudWatchを通じて報告します。アラームの設定をすることも可能。同じくログに関してもCloudWatchで確認できます。
Lambda関数のテスト
ユニットテストはローカルで実行し、それ以外のすべてはクラウド上で実行がおすすめです。Lambda関数をローカルで実行する場合は3点が必要です。
- ローカルで呼び出すためのエントリポイント: 関数
- イベント: JSON形式
- contextオブジェクト: ランタイム情報
バージョンを利用することで、ある関数において開発と本番で異なるバージョンを利用するといったことが可能になります。バージョンはARNを用いて一意に特定されるものであり、一度バージョンを発行するとコードや設定の変更はできなくなります。作成直後は自動的に$LATESTというバージョンが付与されます。
バージョンの発行はPublish Version APIを利用します。create FunctionとUpdateFunctionCode実行時に発行できます。
デッドレターキュー
デッドレターキューとは関数を非同期で呼び出す場合において、2回のリトライ、つまり合計3回の試行にも関わらず処理が正常終了しなかった場合にそのイベントを指定されたAmazon SQSのキューもしくは、Amazon SNSのトピックへと送信する仕組みです。
同時実行数
同時実行数とはあるタイミングで関数が同時に実行されている件数のこと。ストリームベースの場合: 同時実行数の単位はストリームのシャード数と等しくなります。
それ以外の場合: 同時実行数 = 1秒あたりのイベント数(もしくは1秒あたりのリクエスト数) * 関数の実行時間
利用料金が莫大にならないように標準では1000が制限があります。
課金対象は以下の2つ。
- Lambda関数のリクエスト数(呼び出し回数)
- Lambda関数の実行時間
プログラミングモデル
Lambda関数作成時のポイント。
- 各言語のベストプラクティスに従う
- ステート(状態)は外部に保存し、Lambda関数はステートレスに保つ: そのため冗長になる場合がある。
- なるべく非同期呼び出しを利用する: 同期呼び出しは同時実行数の制限にかかることが多い。
- コールドスタートとウォームスタート: 関数が作成されてから初めての実行時や、コードや設定の更新後の初回実行時は新たにコンテナが作成され、関数にアップロードされたコードがコンテナ内にロード・展開される。これをコールドスタート。一度作成されたコンテナを再利用おすることをウォームスタートという。
コールドスタートを早くするには以下のような対策がある。
- Lambda関数に対してボーリングする: 定期的に対象のLambda関数を実行する
- コンピューティングリソースを増やす
- ランタイムを変える
- VPC内のリソースにアクセスしない
- パッケージサイズを小さくする
- 不要なコードを減らす
- 依存関係を減らす
- 不要なモジュールは含めない
- コード最適化や難読化といったツールを使う
- グローバル変数の遅延ロード: 初期化処理をグローバルスコープでやってしまうと終わるまでコンテナが起動完了にならない
- POJOではなくバイトストリームを使う(JAVAのみ)
- 冪等性はアプリケーションで担保する
ユースケース
- データプロセッシング: データの変更、システム状態の遷移もしくはユーザによるアクションといったものに対応したコードの実行
- バックエンド: Web、モバイル、IoTや外部APIへのリクエストを扱うバックエンドロジックの実行
- システムの自動化・自律化: システムの状態やデータの変更に対するワークフローのレスポンス
サーバレスアプリケーションのデプロイ
大きく3つの方法があります。
- APIやCLI、マネージメントコンソールを利用したデプロイ
- AWS CloudFormationを利用したデプロイ
- AWS Lambda用のツール・フレームワークを利用したデプロイ