AWS Lambda のキソ

AWS Lambda の基本的な使いかた等を紹介します。

AWS Lambda は FaaS で関数を AWS 上にデプロイできる FaaS のサービスです。 AWS 環境上に 配置したコードを任意のタイミングでスケーラブルに実行することができます。

Lambda の特徴

  • 管理不要のインフラ環境
  • オートスケールの実行環境
  • AWS リソースとの連携

イベントトリガ

AWS 環境上に展開された 各種リソースからイベントを実行することが可能です。

Amazon S3

S3 の特定のバケット上でのオブジェクト作成や削除などに反応して Lambda 関数を呼び出すことができます。

Amazon Simple Notification Service

SNS の特定のトピック上でのメッセージ受信に反応して Lambda 関数を呼び出すことができます。

Amazon Simple Email Service

SES を利用したメッセージ受信に対して Lambda 関数を呼び出すことができます。

Amazon Simple Queue Service

SQS の特定のキューをポーリングしながら Lambda 関数を呼び出すことができます。

Amazon CloudWatch Events

Amazon CloudWatch イベントを利用して、AWS 内のリソース状態の変化や、カスタムのスケジュールで Lambda 関数を呼び出すことができます。

Amazon API Gateway

API Gateway 上で作成された 任意の REST API エンドポイントから、 Lambda 関数を呼び出すことができます。

Lamdba 関数の記述

Web 上で簡単に作成可能です。

https://console.aws.amazon.com/lambda/home?region=us-east-1#/create

Lambda には、任意のロールが付与されるため、 Lambda 関数上で任意の AWS 上のリソースを操作する際に、環境変数上で IAM を管理する、などといった手間は発生しません。

Lambda の Runtime には Java や Go, Python などが利用可能で、Node も v6 系と v8 系が選択可能です。

Node8 系を を使用する場合、 index.js を作成して async/await を用いて、 以下のような形で Lambda 関数を記述することができます。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

イベントのトリガーによって 第一引数の event のフォーマットが異なり、 また関数の完了イベントとして投げるオブジェクトの形式も、ハンドルするトリガーによって様々となっています。

イベントのリソース例に関しては下記に一覧でまとめられたサンプルのメッセージ例があるため確認してみてください。

イベントソースによって公開されたサンプルイベント - AWS Lambda

REST API を作成する場合

多くのイベントトリガーが非同期に Lambda 関数をコールするのに対して、 API Gateway からの Lambda コールは 同期的な呼び出しとなります。

そのため、Lambda 関数内でレスポンスのオブジェクトともに完了を通知することで、 REST API のレスポンスを定義することができます。

Node 8 系の runtime では async/await が利用可能なため、 async 関数を利用して、関数内の return で完了を通知できます。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Promise を用いる async / await の形式では、statusCodebody からなる レスポンスオブジェクトを return します。 headers を用いてレスポンスヘッダを定義することも可能です。 エラーを通知には単純にコード内で例外を throw します。

古い形式のフォーマットでは、以下のような形で第三引数経由で受け取る callback 関数をコールして完了を通知します。

exports.handler = function(event, context, callback) {
  callback(null, "Success");
};

通常の処理では第一引数は null で、第二引数に文字列のメッセージ、またはレスポンスオブジェクトを通知します。 エラーを通知する際には、第一引数にエラーオブジェクトを渡します。

Lambda の Deploy

Lambda の deploy ツールとして知られるものとしては以下のようなツールがよく知られています。

  • Serveless
  • Apex

一般的には REST API の デプロイには Serverless 、 単純な Lambda のデプロイには Apex が用いられるケースが多いようです。

Github のリポジトリ等とLinkさせて自動デプロイ環境を構築するには Circle CI などのツールを利用するか、CodeShip などの外部ツールを利用する方法もあるようです。

Continuous Integration, Deployment & Delivery with Codeship


投稿一覧へ