フォーム読み込み中
2022年9月29日掲載
Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみました。
Alibaba Cloud FunctionComputeはサーバレスコンピューティングプラットフォームであり、開発ユーザは小さな関数コードを作成するだけで、開発ユーザはサーバをプロビジョニングすることなく、その関数コードを実行することができます。
本記事では、Alibaba Cloud FunctionComputeのデプロイ方法の1つである、Serverless Devsを使ってNode.jsおよびPythonそれぞれをコンテナイメージにしながら、デプロイする方法を説明します。Serverless DevsはServerlessのInfrastructure as Code版であり、Serverless Devsを使うとAlibabaCloud FunctionCompute基盤に依存せず、クラウドベンダロックインなしにコードベースでさまざまなプラットフォーム上でサーバレスアプリケーションを構築することができます。例えば、AlibabaCloud FunctionComputeで構築したコードやサーバレス実行環境、依存関係など関連情報をServerless Devs経由でそのままAWS Lambdaへスライド、デプロイすることができます。Serverless Devsは元々Alibabaがオープンソースとして開発し、そのあとCNCF Landscape(Linux Foundation)に寄贈した経緯があります。
Serverless Devsを使ってNode.jsおよびPythonそれぞれのコードをコンテナイメージにしながら、Alibaba Cloud FunctionComputeへデプロイする際の流れ、構成図としては次の通りになります。
公式ドキュメントによれば、Severless Devを複数のOSでもインストールができるよう、npm経由でSeverless Devのインストールを推奨しています。
コマンド`npm install @serverless-devs/s -g`を使用してツールをインストールし、`s--version`を使用してバージョン情報を確認します。
`s config add`を実行してServerless Devsを設定します。ここではAlibaba Cloudを選択し、関連するアクセスキー情報を入力します。
ここで表示されている、プロファイルのaliasは以降の手順にて使用するため、メモに残しておきます。
コマンド `s init` を実行し、対話式コマンドラインで必要な設定をします。
対応する設定項目は以下の通りです。
対話型コマンドで設定を開始
Cloud vendors、ここでAlibaba Cloud Serverlessを選択
Code template、今回は「Quick Start」を選択
Runtime template、event handlerでNode.js 14を選択
コードフォルダ名としても使用されるプロジェクト名
リージョン名。日本リージョンなので、ap-northeast-1を選択します。
サービス名。既存のサービスを選択します。
関数コード名。ここではohara-bob-node-devsとして設定します。
クレデンシャルエイリアス。上記の設定手順の1つを使用します。
この手順は初期設定プロセスの全体像を示しています。
無事設定が終わり、インストールが無事完了すると、`node_test_devs_ali`というフォルダに以下のファイルが保存されます。
英語バージョンで生成されたyamlファイルには正しい設定が含まれていません。英語バージョンで動作しなかった場合は手動で以下の対応が必要です。
次のステップで使用される更新されたs.yamlは以下のようになります。
次のコードを`node_test_devs_ali/code/index.js`で生成されたindex.jsに更新します。
上記のソースコードは次の通りです。
'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')); }
FunctionComputeのNode.jsランタイム環境は、一般的なNode.jsモジュールと、使用可能な共通モジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係を必要とする場合があります。 上記のソースコードでは、日付を操作するためのmomentと呼ばれるパッケージが必要であり、デプロイ前に準備する必要があります。今回は`node_test_devs_ali/code/package.json` にて以下の内容のpackage.json (必要なパッケージ情報を含む)を作成し、管理します。
{ "dependencies": { "moment": "^2.29.4" } }
ファイル、およびコード構造は次のようになります。
. ├── s.yaml └── code ├── index.js └── package.json
`s build --use-docker`を実行してコード関数をデプロイします。コード自体に依存関係が含まれてない、あるいはpackage.jsonがない場合、以下のように処理がすぐに完了します。
この場合、コマンドはdockerと連携して、以下のように必要な依存パッケージを持つコード関数を準備します。イメージ構築プロセスを確認することもできます。
設定が完了すると、デプロイ結果の出力を含む `.s` フォルダがプロジェクトのルートディレクトリに作成されます。
コマンド `s local invoke` を実行して、デプロイする前にコード関数をローカルでテストします。上記のコードをデプロイすると、現在の日付情報が特定のフォーマットで返されます。
`s deploy -y` コマンドで、事前に準備したコード関数をServerless Devs経由でクラウドにデプロイします。既存のサーバレスサービスを使用していて、ローカルとリモートの設定が異なる場合は、デプロイ時にコマンドラインインターフェースにて確認のための質問メッセージが来ます。
`s info`を実行してコード関数の詳細を確認します。
FunctionCompute コンソール画面にて、対象のコード関数を確認します。
リモートでコード関数を呼び出すには、 `s invoke` コマンドを使用します。
その結果、現在の日付情報が特定の形式で返されます。
以上が、Serverless Devsを使ってNode.jsソースコードをコンテナイメージにしながらFunctionComputeへデプロイする方法になります。
Serverless Devsとしての設定は上記Node.js版と同じになります。
上記のように `s init` を実行し、初期設定を完了させます。
この手順は初期設定プロセスの全体像を示しています。
無事設定が終わり、インストールが無事完了すると、`python_test_devs_ali`というフォルダに以下のファイルが保存されます。
上記と同じように、生成されたs_en.yamlで内容を更新し、s.yamlへリネームします。
次のコードを`python_test_devs_ali/code/index.py`で生成されたindex.pyに更新します。
上記のソースコードは次の通りです。
# -*- coding: utf-8 -*- import requests def handler(event, context): response = requests.get('http://google.com/') print(response.text) return response.status_code
FunctionComputeのPythonランタイム環境は、一般的なPythonモジュールに加えて、Alibaba Cloud SDKパッケージや画像操作用のその他モジュールを含むビルドインモジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係が必要な場合があります。 デモでは、HTTP通信用ライブラリのrequestsという名前のサードパーティパッケージが必要であり、デプロイ前にローカルで準備する必要があります。今回は`python_test_devs_ali/code/requirements.txt` にて以下の内容のrequirements.txt (必要なパッケージ情報を含む)を作成し、管理します。
requests==2.28.1
ファイル、およびコード構造は次のようになります。
. ├── s.yaml └── code ├── index.py └── requirements.txt
`s build--use-docker` を実行してコード関数に必要な依存関係を構築します。
コマンド `s local invoke` を実行して、デプロイする前にコード関数をローカルでテストします。上記のコードをデプロイすると、Googleホームページにアクセスし、ページコンテンツをログに出力し、関連するHTTPステータスコードが返却されます。
`s deploy -y` コマンドで、事前に準備したコード関数をServerless Devs経由でクラウドにデプロイします。既存のサーバレスサービスを使用していて、ローカルとリモートの設定が異なる場合は、デプロイ時にコマンドラインインターフェースにて確認のための質問メッセージが来ます。
`s info`を実行してコード関数の詳細を確認します。
FunctionCompute コンソール画面にて、対象のコード関数を確認します。
リモートでコード関数を呼び出すには、 `s invoke` コマンドを使用します。
Serverless Devsは s.yaml/s.yml のみが構成情報として読み込まれるため、構成変更等情報更新後には s_en.yaml の名前をリネームしておきます。
コード関数をデプロイする際は、Dockerが起動されていることを確認しておく必要があります。もしDockerが起動されていない場合、関連するエラーが発生します。Windowsでは、Docker Desktopを使用することができます。
Serverless Devsを使ってNode.jsおよびPythonそれぞれをコンテナイメージにしながら、Alibaba Cloud FunctionComputeへデプロイする方法をご紹介しました。Serverless Devsはオープンソースでありながら、サーバレス基盤を自由にスライドできるので、例えばAWS Lambdaを使ってる人も、Serverless Devs経由でコンテナイメージを出力しAlibaba Cloud FunctionComputeへデプロイすることができます。類似サービスとしてserverlessがありますが、Serverless DevsはパブリッククラウドサービスだけでなくK8s エコシステムなどもサポートしていることや、GPUインスタンスやFPGA、オンプレミスなどでのデプロイができるなど幅広い選択肢ができる点で異なります。
サーバレスアプリケーションはコードを記述しながら実行できるクラウドサービスなので、エンジニアリングリソースを小さくしてくれるため非常に便利です。一方、クラウドベンダに依存したくない場合、あるいはInfrastructure as Codeでサーバレスを構築したい場合は、Serverless Devsによるデプロイが役に立ちます。別途、CLI版でFunctionComputeをデプロイする方法も紹介していますが、依存関係を含めた開発・デバッグ・展開・運用・保守の完全なライフサイクルを満たしたい場合は本記事をご参考になれば幸いです。
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
AWS
AWS LambdaにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
AWS LambdaをAWS CLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
AWS ECRを使ってNode.js/PythonのコンテナイメージをAWS Lambdaへデプロイしてみた
Google Cloud
Google Cloud FunctionにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編) ← 本記事
Google Cloud FunctionをGoogle Cloud CLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Azure
Azure FunctionにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Azure FunctionをAzure CLIベースおよびAzure Function Core ToolsでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Azure FunctionをAzure CLIおよびAzure Function Core ToolsでNode.jsおよびPythonそれぞれをデプロイしてみた ← 本記事
Alibaba Cloud
Alibaba Cloud Function ComputeにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみた
条件に該当するページがございません