【苦しみながら理解するハードウェア】実践 AWS Lambdaを読んだ

AWS Lambdaとは

AWS Lambda概要

インフラストラクチャの運用管理が不要。
つまりは、サーバーの環境構築や保守運用が不要になった。
LambdaはLambda関数と呼ばれる小さいアプリケーションコードを実行する基盤を提供する。
また、必要に応じたスケールアウトなどスケーラビリティやキャパシティの管理もAWSによって行われる。
これがサーバレスアーキテクチャ。

イベントドリブンである。
イベントドリブンとは、例えばS3のバケットへのオブジェクトの保存、またはDynamoDBへのテーブルの項目変更といった何らかのイベントに対応して、Lambdaに登録されたコードが実行される。
各サービスとのインテグレーションが行われている。(もちろん、イベントドリブンだけではなく普通にPOSTなどのメソッドも可能)
AWSサービス以外にもカスタムイベントとして追加することも可能。

コスト効率の高い。
EC2は常時起動なのに対して、Lambdaは実行回数に対して料金が発生する。
これは、もう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というバージョンが付与される。
$LATESTに対してエイリアスを指定できる。

バージョンの発行はPublish Version APIを利用する。
create FunctionUpdateFunctionCode実行時に発行できる。

サーボパーティーのライブラリをアップロードできるらしいが、serverless frameworkだとどうなるんだろうか…

デッドレターキューとは関数を非同期で呼び出す場合において、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用のツール・フレームワークを利用したデプロイ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です