フォーム読み込み中
2022年9月28日掲載
AWS Lambdaはサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。
・参考記事
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
本記事では、AWS Lambdaのデプロイ方法のひとつである、コンソールでNode.jsおよびPythonそれぞれをデプロイする方法を説明します。
AWS Lambdaはコンソール上にて関数のコードを入力するだけで実行もできますが、より大きなソースコード、およびAWS Lambdaコンソール上でデフォルトでは含まれていないライブラリがある場合でも、ZIPファイルを使うことでデプロイすることができます。
※本記事は 2022年9月時点の情報をもとにしております。実際のご利用にあたっては、必ず各社の最新情報をご確認ください。
Node.jsおよびPythonそれぞれのコードをZIPファイルとしてAWS Lambdaへデプロイする際の流れ、構成図としては次の通りになります。
最初にAWS LambdaでデプロイしたいNode.jsソースコードを準備します。本記事では、node_test_zipというソースコードフォルダを作成し、Lambdaのハンドラーが含まれるindex.jsを作成します。
ハンドラー(handler)はサーバレスとして利用する言語の関数の開始位置となるもので、HTTPトリガー、イベントトリガーなど様々なトリガーによって実行される際に呼び出すエントリポイントです。このハンドラーは必須項目であり、ハンドラーを呼び出すことで、サーバレスとしての関数コード(以降スクリプト)が実行開始されます。ここでは、event handlerを例とします。
上記のソースコードは次の通りです。
'use strict';
const moment = require('moment');
exports.handler = (event, context, callback) => {
console.log('hello world');
callback(null, moment().utcOffset(9).format('YYYY-MM-DD HH:mm:ss'));
}
LambdaのNode.jsランタイム環境は、一般的なNode.jsモジュールと、使用可能な共通モジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係を必要とする場合があります。 上記のソースコードでは、日付を操作するためのmomentと呼ばれるパッケージが必要であり、デプロイ前に準備する必要があります。これらのパッケージはnpmでローカルに管理します。
`npm i<package name>--save` コマンドを実行して必要なパッケージをローカルにインストールした後、node_modulesフォルダ(関連するパッケージコードを含む)とpackage.json (必要なパッケージ情報を含む) が index.jsと同じフォルダの下にあります。
最後に、これらが含まれているソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はLambda上でデプロイする際に使用します。
デプロイしたいNode.jsソースコードの準備が出来たら、AWSコンソール画面からLambdaを開き、ウィザードでNode.jsをデプロイする専用のFunctionリソースを新規で作成します。
流れとして、①「Create Function」で新規Functionを立ち上げ、②Function名を入力。ランタイムを「Nodejs」として選定します。ランタイムはコードを実行するために必要な言語設定等環境のことを指します。③Function立ち上げに必要な情報の入力が完了すれば「Create Function」ボタンを押すと、Functionが作成されます。
以降はこのFunctionという名のリソースで様々な関数のコードをデプロイすることができます。
新しいlambda関数はデフォルトのサンプルコードで生成されます。
コンソールのウィザードを使用して先ほど準備したZIPファイルをアップロードします。新しいZIPファイル・パッケージをアップロードすると、既存のコードが上書きされます。
アップロード操作が完了すると、必要な依存パッケージと関連するソースコードが表示されます。
テストプロセスとして、スクリプトを実行する前に、AWS Lambdaからテストイベントのモーダルウィンドウが表示されます。このウィザードに従って、設定します。
必要なテストイベントの準備が完了すると、画面上にて成功メッセージが表示されます。
もう一度「Test」ボタンをクリックしてスクリプトをテストします。スクリプトに基づいて、現在の日付情報が特定の形式で表示されます。
以上が、Zipファイルを使ってNode.jsソースコードをLambda上にてデプロイする方法になります。
PythonソースコードをLambdaでデプロイする方法をご紹介します。python_test_zip_awsというソースコードフォルダを作成し、lambda_handler関数を含めたindex.pyを作成します。ここでは、Event Handlerを例とします。
上記のソースコードは次の通りです。
import requests
def handler(event, context):
response = requests.get('http://google.com/')
print(response.text)
return response.status_code
LambdaのPythonランタイム環境は、一般的なPythonモジュールに加えて、AWS SDKライブラリを含むビルドインモジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係が必要な場合があります。
今回のスクリプトでは、HTTP通信用ライブラリのrequestsという名前のサードパーティパッケージが必要であり、デプロイ前にローカルで準備する必要があります。これらのパッケージはpipを使用してローカルで管理します。
`pip3 install <パッケージ名> -t .` コマンドを実行して必要なパッケージをローカルにインストールすると、index.pyに関連するパッケージフォルダができます。
次に、ソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はLambda上でデプロイする際に使用します。
デプロイしたいPythonソースコードの準備が出来たら、AWS Lambdaコンソールのウィザードで新しいLambda関数を作成し、ランタイムをPythonとして選定しながら関数リソースを追加で作成します。この作成方法は上記Node.jsと同じになります。
新しいlambda関数はデフォルトのサンプルコードで生成されます。
コンソールのウィザードから、事前に準備したZIPファイルを選択してアップロードします。新しい.zipファイル・パッケージをアップロードすると、既存のコードが上書きされます。
アップロード操作が完了すると、必要な依存パッケージと関連するソースコードが表示されます。
テストプロセスとして、スクリプトを実行する前に、AWS Lambdaからテストイベントのモーダルウィンドウが表示されます。このウィザードに従って、設定します。
デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。上記のデプロイする関数コードの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。
テストの結果、HTTP 200が無事返却されたので、成功です。以上が、Zipファイルを使ってPythonソースコードをLambda上にてデプロイする方法になります。
ここでいくつかの補足事項を記載します。
Lambda関数ハンドラは、イベントを処理する関数コード内のメソッドです。関数が呼び出されると、Lambdaはハンドラメソッドを実行します。
Nodejsランタイム環境では、コンソールとこのガイドの例でのデフォルトはindex.handlerです。Python 1では、デフォルト設定はlambda_function.lambda_handlerです。
Lambdaコンソールで関数ハンドラ名を変更するには、Runtime settingsペインでEditを選択します。
ハンドラの設定がソースコードの構造と一致していることを確認してください。一致していない場合、`Handler'lambda_handler1'missing on module'lambda_function'`のようなエラーが発生します。
新しいZIPパッケージをアップロードしてコードを上書きすると、Lambdaは新しいコードを自動的にデプロイします。しかし、エディタでコードを手動で変更すると、デプロイのためのリマインダメッセージが表示されます。
Function ZIP Configurationの関連ドキュメントによると、.zipファイルアーカイブが50MBより小さい場合は、ローカルマシンから.zipファイルアーカイブをアップロードできます。ファイルが50MBより大きい場合は、Amazon S3バケットから関数にファイルをアップロードします。
しかし、.zipアップロードウィンドウでは、10MB以上のファイルをS3バケットでアップロードすることを推奨しています。
テスト後、50MBを超えるZIPパッケージをアップロードしようとするとエラーが発生します。10MBを超えるZIPファイルはローカルからアップロードできますが、コードでインラインコード編集を有効にできませんでした。
Node.jsおよびPythonそれぞれのコードをZIPファイルとしてAWS Lambdaにデプロイする方法をご紹介しました。
本記事では、AWS Lambdaに含まれていないパッケージなどをローカルで準備し、それをAWS Lambdaとしてデプロイする際はZIPファイルを使ったアプローチが非常に役立つと思いますので、AWS Lambdaを使ったサーバレスアプリケーションを構築する際はご参考になれば幸いです。
条件に該当するページがございません