技術情報 - はじめてのAWS Lambda
はじめに
AWS Lambdaは、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができる。(https://aws.amazon.com/jp/lambda/ より抜粋)
クラウド上でプログラム(関数)を作成し、インターネットを通じて実行できるサービスが提供されている。
具体例
- 企業サイトでユーザ登録時にAWS SES(Simple Email Service)でウェルカムメールを自動送信するように、Lambda関数を作成する。
- Webアプリ経由でアップロードした画像をLambda関数で受け取り、リサイズや圧縮などの画像処理を行ってS3に保存する。
- IoTデバイスなどから送信された気温などのセンサデータをAmazon Dynamo DBに格納する。
トリガー
Amazon Lambdaでは複数のイベントをトリガーとして関数が実行される。以下に代表的なトリガーを示す。
- HTTP リクエスト
- Amazon S3バケット内の変更
- Amazon DynamoDB 内のテーブル更新
- AWS Step Functions 内の状態遷移
- Event Bridge(CloudWatch Events)によるスケジュール実行
構成例
引用元:https://aws.amazon.com/jp/lambda/ より抜粋
開発言語
AWS Lambda では、ランタイム環境として主要なプログラミング言語とそのバージョンがサポートされている。Node.js または、Python が主流になっている。
ランタイム | バージョン | 備考 |
---|---|---|
Java | 8 / 11 / 17 | |
Go | 1.x | |
Node.js | 14.x / 16.x / 18.x | TypeScript |
Python | 3.7 / 3.8 / 3.9 / 3.10 | |
Ruby | 2.7 / 3.2 | |
.NET | 6 | C# / PowerShell |
環境構築
本書では、ローカルでの開発を前提とした環境構築例を示す。
- 開発マシン:Windows10 (64bit)
- 開発環境:Visual Studio Code
- ランタイム:Node.js 18.16.1
- 開発言語:TypeScript
開発マシン
開発マシンは、Windows, Linux, Macをはじめとする主流のPCを使用することができる。なお、OSは、比較的新しいバージョンを推奨する。
開発環境
開発環境は、ローカルでの開発とリモート(クラウド上)での開発を選択することができる。ローカルでの開発は、AWS Toolkit との組み合わせて行う必要がある。
- Visual Studio Code:ローカル開発
- 任意のエディタ:ローカル開発
- ポータルでの開発:リモート開発
クラウド
AWS Lambda による開発を始める際、開発ユーザへのアクセス権の付与およびアクセスキーの発行が必要となる。
- アクセス権:ユーザが各サービスにアクセス・操作するための権限
- アクセスキー:AWS API にプログラムからアクセスするための認証情報
アクセス権
ユーザ権限として、Lambda 関数の登録・実行権限用に AWSLambda_FullAccess を付与する。
また、Lambda 関数には実行用のロールを適用することで実行を確認できる。通常、アプリケーション作成時は、自動でロールが作成される。
アクセスキー
AWSクラウドでは、後述のVisual Studio CodeからAWSに接続する際の認証として、アクセスキーを発行する必要がある。以下にその手順を示す。
- AWSのIAMダッシュボードに遷移し、クイックリンクの項目の「自分の認証情報」に移動する。
- アクセスキーの項目からアクセスキーを作成し、ユースケースに"ローカルコード"を選択する。
- 生成されたアクセスキーとシークレットアクセスキーを記録しておく。
なお、シークレットアクセスキーは発行時のみ表示されるため、忘れてしまうと再取得する必要がある。また、ルートユーザのアクセスキーを発行することは非推奨となっており、長期的にアクセスキーによる認証をする場合においては、キーを定期的に更新することが推奨されている。
ローカル
開発マシンのローカルでは、以下のインストールを行う必要がある。
- CLI:AWS CLI、AWS SAM CLI
- SDK:Node.js、npm
- TOOL:Visual Studio Code、Git、Docker
CLI
AWSのコマンドラインインタフェースは、AWS CLI と AWS SAM CLI をインストールする。
- AWS CLI: AWSサービスをコマンドラインで操作するために必要
# バージョンが表示されることを確認する。
$ aws --version
aws-cli/2.11.26 Python/3.11.3 Windows/10 exe/AMD64 prompt/off
- AWS SAM CLI:開発マシンでアプリケーションの新規作成やデバッグをするために必要
# バージョンが表示されることを確認する。
$ sam --version
SAM CLI, version 1.87.0
また、sam init などのコマンドが失敗するときは、以下のレジストリ値を 1 にし、ロングパスを有効にする必要がある。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem/LongPathsEnabled
SDK
開発で使用する言語に合わせてランタイムおよびパッケージマネージャをインストールする。今回は Node.js および npm を選択するが、Node.js をインストールすると npm も自動的に使用できるようになる。
SDK | パッケージマネージャ | 備考 |
---|---|---|
Java | Gradle または Maven | TypeScript |
Go | Go Modules | |
Node.js | npm | |
Python | pip | |
Ruby | gem | |
.NET | NuGet | C# / PowerShell |
TOOL
開発ツールとして、統合開発環境、ソースコード管理、仮想環境をインストールする。
名称 | 本体 | プラグイン |
---|---|---|
統合開発環境 | Visual Studio Code | AWS Toolkit |
ソースコード管理 | Git | 不要 |
仮想環境 | Docker Desktop | 不要 |
実装例
実装例として、簡単なサンプルアプリケーションの作成を行う。
新規作成
まず、AWSのクラウドと開発マシンのローカルから、AWSアプリケーションを新規に作成する。
- クラウド:AWS Lambdaサービスのページから新規作成する。
- ローカル:Visual Studio Codeからアプリケーションを作成する。
クラウド
AWSからLambdaサービスのページへ移動し、アプリケーションを新規作成する。
ローカル
Visual Studio Codeのプラグイン AWS Toolkit の機能を使用し、開発マシンにAWSアプリケーションを作成する。
- アクセスキーの入力
コマンドで AWS: Create Credentials Profile を実行し、発行済みのアクセスキーとシークレットアクセスキーを入力する。AWSでアクセスキーを変更した場合は、Visual Studio Code 側も AWS: Edit Credentials で接続情報を変更する必要がある。
- アプリケーションの作成
AWS接続後にVisual Studio CodeのAWSアイコンをクリックすると、AWS上に登録しているアプリケーションが一覧表示される。その後、EXPLORERツリーから Create Lambda SAM Application を選択する。
- ランタイムの設定
ランタイムおよびアーキテクチャの設定を行った後に、ローカルアプリケーションの保存場所とアプリケーション名を入力すると、ローカル側にアプリケーションのソースコードが作成される。
コーディング
次に、Visual Studio Codeで作成したローカルアプリケーションに対してコードを実装し、動作を確認する。
コード編集
AWS Toolkitでサンプルアプリケーションを生成すると、'hello world'とメッセージを返すサンプルコードが書かれている。 今回はこのソースコードを変更する。
- コード表示
Visual Studio Codeのエクスプローラーアイコンを選択(またはCtrl+Shift+E)すると、ローカルに作成されたアプリケーションが表示される。README.md には、ビルド方法およびローカルでの実行手順が書かれている。
- コード編集
今回は、'hello world'のメッセージに現在時刻を追加するようにコードを編集する。
動作確認
ローカルで編集したコードを確認する。
ローカルアプリケーションの実行環境はDockerイメージで生成されるため、あらかじめDocker Desktop を起動しておく。
- ビルド
Visual Studio Codeのターミナルからアプリケーションディレクトリ(template.yamlと同階層)に移動する。
ディレクトリの移動後に"sam build"とコマンドを入力するとビルドが開始される。
- 実行
ビルド完了後、"sam local invoke"とコマンドを入力する。 ターミナルにアプリケーションの実行結果が表示される。
デプロイ
最後に、ローカルで作成・編集したコードをAWS上にデプロイする。デプロイしたアプリケーションをHTTPリクエストで実行するためのトリガー設定も併せて解説する。
アップロード
ローカルで作成した関数をAWS上にアップロードする。
- ワークスペースを右クリックし、「Upload Lambda...」を選択する。
- リージョン一覧からアプリケーションを作成したリージョンを選択(例:Asia Pacific(Tokyo))する。
- 登録されているアプリケーション一覧が表示されるので、デプロイ先のアプリケーションを選択する。
- アップロードが完了するとVisual Studio Codeの右下に"Uploaded..."のメッセージが表示される。
- 編集したコードがAWS上に反映されていることが確認できる。
トリガー追加
作成したアプリケーションにトリガーを追加することで、HTTPリクエストやAWSの他のサービスによる実行が可能になる。今回はREST APIのトリガーを設定し、HTTPリクエストの結果としてメッセージを返すことを確認する。
- トリガの設定
アプリケーションを実行するためのトリガーとして、REST APIトリガーを設定する。
- エンドポイント
トリガー追加すると、APIエンドポイントが作成される。
- 実行結果
このエンドポイントに対してHTTPリクエストを送ると、Lambda 関数の実行結果が返ってくる。
以下の通り、"message" と "date" が返されている。
注意点
ローカルで開発を行う際の注意点を以下に示す。
- Internal Server Error
ローカルデバッグで動作したソースをデプロイして実行すると、"Internal Server Error"のメッセージを返すことがある。
これは、AWS関数のハンドラ設定と実際にコードに記述したハンドラの名前と異なるため、ハンドラを参照できずエラーとなっている。AWSのランタイム設定を実際のソース上のハンドラに合わせると、正常にレスポンスを返すようになる。
- ローカル設定
ローカル側のAws Toolkitで作成したソースを確認すると、"hello-world/app.mjs"でハンドラ"lambdaHandler"を定義している。
- クラウド設定
クラウド側のハンドラ設定を"index.handler"から、"hello-world/app.lambdaHandler"に変更する。
ハンドラは、"パス/ファイル名(拡張子除く).ハンドラ名"で設定する。
開発支援ソリューションページも是非ご確認ください。