AWSの主力サービスには「Lambda」っていうサーバレスで色々なことが出来るサービスがあります。

色々ってなんやねん。
本ページではLambdaの概要に始まり、Lambdaの利用例を紹介していくページです(AWS資格勉強や業務での経験を元にしています。)

では早速!
Lambda?
サーバレス(自前でEC2の準備不要)でお仕事をしてくれます。
感覚的には、
- お仕事をする時間(数秒~数分間)だけ、コンピュータリソースを使っていいよ!
- 料金は処理時間とメモリ時間で請求するからね!(状況に応じてストレージ分も!)
です。同時並行やリトライも可能です。余分なコンピュータリソースを稼働させないため、料金はEC2を使うよりもかなり安いです。EC2本体の管理も不要です(セキュリティパッチや稼働管理など)。

次のような制約があります。
- 実行時間:最大15分
- 取り扱いファイルサイズ(ストレージ):512MB~10240MB
- 取り扱いメモリサイズ:128MB~10240MB
- 同時実行数:1000
以前はサイズ制限が厳しかったのですが、拡張されて、使いやすくなりました。同時実行数は利用アカウントでのリージョン辺りの上限で緩和申請が可能です。
処理させるコードは自分でコーディングする必要があり、対応言語は「Java、Go、PowerShell、Node.js、C#、Python、Ruby」です。言語の対応バージョンについてはAWS上より最新情報を確認してください。
Lambdaの例
人によってはwindowsタスクスケジューラがイメージしやすいですね。
以下例です。
- 任意時間になったら「任意処理」を実行
- ユーザログイン等のイベント発生時に「任意処理」を実行
この「任意処理」の部分をLambdaでゴリゴリ書くことになります。トリガ元となるイベントについては、他サービス(Amazon EventBridgeなど)を組み合わせます。

続いて、イメージしやすい例を色々と書いていきます。
例:EC2変化時にSlack通知
EC2の開始・停止などをトリガとして、Slack(チャットツール)に通知することが出来ます。

トリガはEventBridgeで作成可能です。Lambdaではイベント内容を取り出してWebhookでSlackに通知するだけなので、10ステップ程度のコーディングでしょうか(色々な情報を通知するのであればその限りではない)。超単純処理で、処理時間や消費メモリも微々たるものであるため、Lambda無償枠で十分収まります。
今回は例でSlackにしましたが、TeamsやMattermostなどにも通知出来ます。
例:S3アップロード時に画像処理
S3にはアップロード契機で画像処理(例えば画像のサムネイルを生成や透かし処理)を行って、別のS3エリアに格納することが出来ます。

S3にはアップロード契機でLambdaをコールすることが出来ます(わざわざEventBridgeを使わなくてOK)。画像処理ライブラリの操作、S3アクセスなどはゴリゴリとコーディングが必要です。処理結果はこの例だとS3ですが、SQSなど別の選択肢もありです。
オンラインゲーム等でもこの手の構成は使われることがあるようです。(スクエアエニックスのドラクエ10で実際にLambdaが大活用されています。紹介記事はぐぐるとすぐに見つかります。)
例:API Gateway用のURLを叩いて情報取得
API Gatewayで作成したURLにアクセスすると、その引数に応じて結果(ランキング情報など)を返すようなことも出来ます。

例えばアプリ内に特定URLアクセス処理(API Gateway)があって、アクセス後はLambda関数経由で結果を取得できるような構成です。この辺りはAPI Gatewayも勉強することで、活用範囲がたくさんありそうです。
その他
Lambdaの実行について
Lambdaは「コンテナ」で動作します。コンテナな動作プラットフォームはAWS側で準備されたAmazon Linux等です。
コンテナであるため、初回実行時や低頻度で実行される場合は、Lambda関数が実行状態になるまでタイムラグが発生します。2回目以降及び高頻度で実行される場合は、環境の再利用が動くため、実行状態になるまでの時間は早いです。
また、Lambda関数のグローバルスコープの記述内容は再利用対象です。例えば、DynamoDBのクライアントオブジェクト生成等はグローバルスコープに書いておいたほうが良いでしょう。一方で、現在時刻を設定処理とかをグローバルスコープに書いてしまうと、2回目以降の実行で昔の時刻が設定されてしまうことがあるため注意が必要です。
Lambdaで通信
LambdaはVPC外に存在するサービスですが、VPCの任意サブネットに接続すれば(lambda設定より実施可)、VPC内の任意サービスに通信を投げることも出来ます。任意VPCがDirect Access等で社内接続されていれば、社内ネットワークにも通信可能です。
ただ、実行時はENI接続処理が動作する関係で、次の点を気を付けます。
- 実行時はサブネット内のIPアドレスを消費
- 起動速度が遅くなる。
まとめ
サーバレスで各種処理を実行できる「Lambda」について紹介しました。Lambdaはコスト的にも有利で非常に魅力的です。使いこなすにはLambda自体の活用テクニックも必要ですが、他のAWSサービスについてもよく知っている必要があります。

最後までご覧いただきありがとうございました。
コメント