AWS LambdaにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)

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へデプロイする際の流れ、構成図としては次の通りになります。

Nodejsスクリプトをデプロイ - 1.Node.jsソースコードの準備

最初に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上でデプロイする際に使用します。

Nodejsスクリプトをデプロイ - 2.ZIPファイルのアップロード

デプロイしたいNode.jsソースコードの準備が出来たら、AWSコンソール画面からLambdaを開き、ウィザードでNode.jsをデプロイする専用のFunctionリソースを新規で作成します。

流れとして、①「Create Function」で新規Functionを立ち上げ、②Function名を入力。ランタイムを「Nodejs」として選定します。ランタイムはコードを実行するために必要な言語設定等環境のことを指します。③Function立ち上げに必要な情報の入力が完了すれば「Create Function」ボタンを押すと、Functionが作成されます。

以降はこのFunctionという名のリソースで様々な関数のコードをデプロイすることができます。

新しいlambda関数はデフォルトのサンプルコードで生成されます。

コンソールのウィザードを使用して先ほど準備したZIPファイルをアップロードします。新しいZIPファイル・パッケージをアップロードすると、既存のコードが上書きされます。

アップロード操作が完了すると、必要な依存パッケージと関連するソースコードが表示されます。

Nodejsスクリプトをデプロイ - 3.デプロイ結果の確認及びテスト

テストプロセスとして、スクリプトを実行する前に、AWS Lambdaからテストイベントのモーダルウィンドウが表示されます。このウィザードに従って、設定します。

必要なテストイベントの準備が完了すると、画面上にて成功メッセージが表示されます。

もう一度「Test」ボタンをクリックしてスクリプトをテストします。スクリプトに基づいて、現在の日付情報が特定の形式で表示されます。

以上が、Zipファイルを使ってNode.jsソースコードをLambda上にてデプロイする方法になります。

Pythonスクリプトをデプロイ - 1.Pythonソースコードの準備

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スクリプトをデプロイ - 2.コンソールでLambda関数を作成

デプロイしたいPythonソースコードの準備が出来たら、AWS Lambdaコンソールのウィザードで新しいLambda関数を作成し、ランタイムをPythonとして選定しながら関数リソースを追加で作成します。この作成方法は上記Node.jsと同じになります。

新しいlambda関数はデフォルトのサンプルコードで生成されます。

Pythonスクリプトをデプロイ - 3.ZIPファイルのアップロード

コンソールのウィザードから、事前に準備したZIPファイルを選択してアップロードします。新しい.zipファイル・パッケージをアップロードすると、既存のコードが上書きされます。

アップロード操作が完了すると、必要な依存パッケージと関連するソースコードが表示されます。

Pythonスクリプトをデプロイ - 4.デプロイ結果の確認及びテスト

テストプロセスとして、スクリプトを実行する前に、AWS Lambdaからテストイベントのモーダルウィンドウが表示されます。このウィザードに従って、設定します。

デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。上記のデプロイする関数コードの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。

テストの結果、HTTP 200が無事返却されたので、成功です。以上が、Zipファイルを使ってPythonソースコードをLambda上にてデプロイする方法になります。

補足事項

ここでいくつかの補足事項を記載します。

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は新しいコードを自動的にデプロイします。しかし、エディタでコードを手動で変更すると、デプロイのためのリマインダメッセージが表示されます。

ZIPサイズの制限

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を使ったサーバレスアプリケーションを構築する際はご参考になれば幸いです。

関連サービス

Amazon Web Services (AWS)

ソフトバンクはAWS アドバンストティアサービスパートナーです

「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません