技術情報 - はじめての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 が主流になっている。

ランタイムバージョン備考
Java8 / 11 / 17
Go1.x
Node.js14.x / 16.x / 18.xTypeScript
Python3.7 / 3.8 / 3.9 / 3.10
Ruby2.7 / 3.2
.NET6C# / 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に接続する際の認証として、アクセスキーを発行する必要がある。以下にその手順を示す。

  1. AWSのIAMダッシュボードに遷移し、クイックリンクの項目の「自分の認証情報」に移動する。
  2. アクセスキーの項目からアクセスキーを作成し、ユースケースに"ローカルコード"を選択する。
  3. 生成されたアクセスキーとシークレットアクセスキーを記録しておく。

なお、シークレットアクセスキーは発行時のみ表示されるため、忘れてしまうと再取得する必要がある。また、ルートユーザのアクセスキーを発行することは非推奨となっており、長期的にアクセスキーによる認証をする場合においては、キーを定期的に更新することが推奨されている。

ローカル

開発マシンのローカルでは、以下のインストールを行う必要がある。

  • 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パッケージマネージャ備考
JavaGradle または MavenTypeScript
GoGo Modules
Node.jsnpm
Pythonpip
Rubygem
.NETNuGetC# / PowerShell

TOOL

開発ツールとして、統合開発環境、ソースコード管理、仮想環境をインストールする。

名称本体プラグイン
統合開発環境Visual Studio CodeAWS 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上にアップロードする。

  1. ワークスペースを右クリックし、「Upload Lambda...」を選択する。
  2. リージョン一覧からアプリケーションを作成したリージョンを選択(例:Asia Pacific(Tokyo))する。
  3. 登録されているアプリケーション一覧が表示されるので、デプロイ先のアプリケーションを選択する。
  1. アップロードが完了するとVisual Studio Codeの右下に"Uploaded..."のメッセージが表示される。
  1. 編集したコードが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"に変更する。
ハンドラは、"パス/ファイル名(拡張子除く).ハンドラ名"で設定する。

開発支援ソリューションページも是非ご確認ください。