Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみた

2022年9月29日掲載

キービジュアル

Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみました。

目次

  • Node.jsとPythonをサーバレスで実行する環境を作りたい方向けの記事です
  • Alibaba Cloudの環境にデプロイする方法をステップバイステップで解説します
  • この記事を読むと、Alibaba Cloudでどのようにデプロイするか全体感を把握することが可能です

はじめに

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)に寄贈した経緯があります。

1. 全体構成図

Serverless Devsを使ってNode.jsおよびPythonそれぞれのコードをコンテナイメージにしながら、Alibaba Cloud FunctionComputeへデプロイする際の流れ、構成図としては次の通りになります。

2. Serverless Devsのインストールと設定

公式ドキュメントによれば、Severless Devを複数のOSでもインストールができるよう、npm経由でSeverless Devのインストールを推奨しています。

コマンド`npm install @serverless-devs/s -g`を使用してツールをインストールし、`s--version`を使用してバージョン情報を確認します。

操作画面

`s config add`を実行してServerless Devsを設定します。ここではAlibaba Cloudを選択し、関連するアクセスキー情報を入力します。

ここで表示されている、プロファイルのaliasは以降の手順にて使用するため、メモに残しておきます。

3. Nodejsスクリプトをデプロイ - 1.Nodejsの初期設定

コマンド `s init` を実行し、対話式コマンドラインで必要な設定をします。

操作画面

対応する設定項目は以下の通りです。

  1. 対話型コマンドで設定を開始

  2. Cloud vendors、ここでAlibaba Cloud Serverlessを選択

  3. Code template、今回は「Quick Start」を選択

  4. Runtime template、event handlerでNode.js 14を選択

  5. コードフォルダ名としても使用されるプロジェクト名

  6. リージョン名。日本リージョンなので、ap-northeast-1を選択します。

  7. サービス名。既存のサービスを選択します。

  8. 関数コード名。ここではohara-bob-node-devsとして設定します。

  9. クレデンシャルエイリアス。上記の設定手順の1つを使用します。

 

この手順は初期設定プロセスの全体像を示しています。

無事設定が終わり、インストールが無事完了すると、`node_test_devs_ali`というフォルダに以下のファイルが保存されます。

4. Nodejsスクリプトをデプロイ - 2.Node.jsソースコードと構成の準備

英語バージョンで生成されたyamlファイルには正しい設定が含まれていません。英語バージョンで動作しなかった場合は手動で以下の対応が必要です。

  • 英語版の以下の項目を手動で更新する
  • 中国語版を削除する
  • 英語版の名前をs_en.yamlからs.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

5. Nodejsスクリプトをデプロイ - 3.Docker経由で依存関係を持ったコードを展開

`s build --use-docker`を実行してコード関数をデプロイします。コード自体に依存関係が含まれてない、あるいはpackage.jsonがない場合、以下のように処理がすぐに完了します。

この場合、コマンドはdockerと連携して、以下のように必要な依存パッケージを持つコード関数を準備します。イメージ構築プロセスを確認することもできます。

設定が完了すると、デプロイ結果の出力を含む `.s` フォルダがプロジェクトのルートディレクトリに作成されます。

コマンド `s local invoke` を実行して、デプロイする前にコード関数をローカルでテストします。上記のコードをデプロイすると、現在の日付情報が特定のフォーマットで返されます。

6. Nodejsスクリプトをデプロイ - 4.Node.jsソースコードを展開

`s deploy -y` コマンドで、事前に準備したコード関数をServerless Devs経由でクラウドにデプロイします。既存のサーバレスサービスを使用していて、ローカルとリモートの設定が異なる場合は、デプロイ時にコマンドラインインターフェースにて確認のための質問メッセージが来ます。

`s info`を実行してコード関数の詳細を確認します。

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

FunctionCompute コンソール画面にて、対象のコード関数を確認します。

操作画面
操作画面

リモートでコード関数を呼び出すには、 `s invoke` コマンドを使用します。

その結果、現在の日付情報が特定の形式で返されます。

以上が、Serverless Devsを使ってNode.jsソースコードをコンテナイメージにしながらFunctionComputeへデプロイする方法になります。

8. Pythonスクリプトをデプロイ - 1.Pythonの初期設定

Serverless Devsとしての設定は上記Node.js版と同じになります。

上記のように `s init` を実行し、初期設定を完了させます。

操作画面

この手順は初期設定プロセスの全体像を示しています。

無事設定が終わり、インストールが無事完了すると、`python_test_devs_ali`というフォルダに以下のファイルが保存されます。

9. Pythonスクリプトをデプロイ - 2.Pythonソースコードと構成の準備

上記と同じように、生成された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

10. Pythonスクリプトをデプロイ - 3.Docker経由で依存関係を持ったコードを展開

`s build--use-docker` を実行してコード関数に必要な依存関係を構築します。

コマンド `s local invoke` を実行して、デプロイする前にコード関数をローカルでテストします。上記のコードをデプロイすると、Googleホームページにアクセスし、ページコンテンツをログに出力し、関連するHTTPステータスコードが返却されます。

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

`s deploy -y` コマンドで、事前に準備したコード関数をServerless Devs経由でクラウドにデプロイします。既存のサーバレスサービスを使用していて、ローカルとリモートの設定が異なる場合は、デプロイ時にコマンドラインインターフェースにて確認のための質問メッセージが来ます。

`s info`を実行してコード関数の詳細を確認します。

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

FunctionCompute コンソール画面にて、対象のコード関数を確認します。

リモートでコード関数を呼び出すには、 `s invoke` コマンドを使用します。

13. 補足事項

・Serverless Devs構築中にデプロイエラーを修正する方法

Serverless Devsは s.yaml/s.yml のみが構成情報として読み込まれるため、構成変更等情報更新後には s_en.yaml の名前をリネームしておきます。

コード関数をデプロイする際は、Dockerが起動されていることを確認しておく必要があります。もしDockerが起動されていない場合、関連するエラーが発生します。Windowsでは、Docker Desktopを使用することができます。

14. さいごに

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へデプロイしてみた

関連サービス

Alibaba Cloud

Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。

MSPサービス

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

おすすめの記事

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