Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)

2022年9月22日掲載

キービジュアル

Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイする方法を紹介します。

目次

  • Alibaba Cloudのサーバレスプロダクト Function Compute をCLIであまり触ったこと無い方向けの記事です
  • ステップバイステップで解説する、初心者向けの記事です
  • Alibaba Cloudのサーバレスプロダクト Function Compute を触るための基礎知識を得ることが出来ます

はじめに

Alibaba Cloud FunctionCompute はサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。

本記事では、Alibaba Cloud FunctionComputeのデプロイ方法の1つである、CLIベースでNode.jsおよびPythonそれぞれをデプロイする方法を説明します。Alibaba Cloud CLI(Command Line Interface)は、コマンドラインシェルのコマンドを使用してAlibaba CloudおよびFunctionCompute APIオペレーションを呼び出しすることができるオープンソースツールです。

関連記事リンク

CLIを使ってデプロイするモチベーションとして、例えばスクリプトの中身が定期的に更新されていくようなDevOps環境のもとで開発運用する場合、サーバレスの設定を外在化、つまり設定データをGitHubやZookeeper、Consul等CI/CDツールなど外部サードパーティやファイルに配置して、無人でもInfrastructure as Code(以降IaC)ベースで素早く自動デプロイするために、IaCを意識したCLIデプロイアプローチが重要になってきます。

※本記事は 2022年9月時点の情報をもとにしております。実際のご利用にあたっては、必ず各社の最新情報をご確認ください。

1. 全体構成図

Alibaba Cloud FunctionCompute上でのNode.jsおよびPythonコードをAlibaba Cloud CLIでデプロイする際の流れ、構成図としては次の通りになります。

2. Alibaba Cloud CLI のインストールと設定

最初にAlibaba Cloud CLIコマンドツールを導入します。
Alibaba Cloud CLIコマンドツールを使用するには、Installation GuideConfiguration Guideのガイドラインに従ってCLIコマンドツールをインストールし、設定します。著者はWindowsPCを使用しているので、Windowsを例に説明します。
CLIコマンドツールが正しく準備されたら、コマンド `aliyun configure --profile <profile name>` を使用してアカウントプロファイルを設定します。ターゲットアカウントは次のステップで使用されます。

操作画面

Alibaba Cloud CLIでコマンドを実行することで、Function Compute APIオペレーションを呼び出すことができます。Function Computeの関連コマンドは`aliyun fc-open<function info>` です。

参考のためにFunction Compute CLIをフォローするか、直接alyun fc-openを実行してヘルプを得ることができます。

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

CLI導入準備ができたら、FunctionComputeでデプロイしたいNode.jsソースコードを準備します。本記事では、node_test_zipというソースコードフォルダを作成し、FunctionComputeのハンドラーが含まれる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'));
}

FunctionComputeのNode.jsランタイム環境は、一般的なNode.jsモジュールと、使用可能な共通モジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係を必要とする場合があります。 上記のソースコードでは、日付を操作するためのmomentと呼ばれるパッケージが必要であり、デプロイ前に準備する必要があります。これらのパッケージはnpmでローカルに管理します。

`npm i<package name>--save` コマンドを実行して必要なパッケージをローカルにインストールした後、node_modulesフォルダ(関連するパッケージコードを含む)とpackage.json (必要なパッケージ情報を含む) が index.jsと同じフォルダの下にあります。

最後に、これらが含まれているソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はFunctionCompute上でデプロイする際に使用します。

4. Nodejsスクリプトをデプロイ - 2.OSSバケットにソースコードのアップロード

ソースコードの準備ができたら、そのソースコードを保存・管理するためにAlibaba Cloud Object Storage Service(OSS)画面へ遷移し、OSS bucketを用意します。準備したZIPファイルをそこにアップロードします。ここでは、コンソールからOSSバケットを作成し、CLIコマンド`aliyun oss cp <source file> <OSS bucket path>` を使用してZIPパッケージをアップロードします。

5. Nodejsスクリプトをデプロイ - 3.コンソールでFunction Computeのサービスを準備

Alibaba Cloudコンソール画面から、FunctionComputeを開きます。Function Computeサービスが現在のアカウントで既にアクティブ状態になっていることを確認します。もしまだアクティブ状態になってない場合はこの際アクティベーションにします。FunctionComputeを開き、Node.jsをデプロイする専用のサービス・リソースを新規で作成します。流れとして、①「Create Service」で新規サービスを立ち上げ、②サービス名やロギング、Tracing Analytsisなど作成に必要な情報を入力、③サービスに必要な情報の入力が完了すればOKボタンを押すと、サービスが作成されます。以降はこのサービス・リソース配下にてFunctionという名のリソースで様々な関数のコードをデプロイすることができます。

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

FunctionComputeコンソール画面にてサービス・リソース等の準備が出来たら、Alibaba Cloud CLIコマンド `aliyun fc-open POST /2021-04-06/services/<service name>/functions --body <JSON info>`  を使用して、関数のコードを作成します。

今回はNodejs 14 ランタイムのもと、OSS bucketに保存しているターゲットのZIPファイルのソースコードをベースとしたコードを作成するため、パラメータは以下の通りに指定してコマンドを入力します。

 aliyun fc-open POST /2021-04-06/services/ohara-bob-deploy/functions --body  “{\"functionName\":\"ohara-bob-node-cli\",\"handler\":\"index.handler\",\"regionId\":\"ap-northeast-1\",\"runtime\":\"nodejs14\",\"serviceName\":\"ohara-bob-deploy\",\"initializer\":\"\",\"environmentVariables\":{},\"initializationTimeout\":3,\"instanceType\":\"e1\",\"memorySize\":512,\"timeout\":60,\"instanceConcurrency\":1,\"code\":{\"ossBucketName\":\"ohara-bob-jp\",\"ossObjectName\":\"fc-code/node_test_zip.zip\"}}”

コマンド入力が正しければ、コンソール画面にて関数名等が表示されます。

7. Nodejsスクリプトをデプロイ - 5.CLIコマンドでデプロイ結果の確認及びテスト

コンソール画面で作成した関数のコード、スクリプト、ランタイム、などをチェックします。コマンドの引数パラメータが正しければ、関連するソースコードと依存パッケージが正しく表示されています。

コマンド `aliyun fc-open POST /2021-04-06/services/<Service Name>/functions/<Function Name>/invocations` を使用して、作成された関数を呼び出します。上記で展開したスクリプトでは、現在の日付情報が特定の形式で戻されます。

以下の通りコマンドを入力します。

aliyun fc-open POST /2021-04-06/services/ohara-bob-deploy/functions/ohara-bob-node-cli/invocations

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

以上が、CLIベースでFunctionCompute上のNode.jsソースコードをデプロイする方法になります。

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

次はPythonソースコードをFunctionComputeでデプロイする方法をご紹介します。python_test_zipというソースコードフォルダを作成し、FunctionComputeのHandlerとして特定の関数を持つindex.pyを作成します。ここでは、Event Handlerを例とします。

上記のソースコードは次の通りです。

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という名前のサードパーティパッケージが必要であり、デプロイ前にローカルで準備する必要があります。これらのパッケージはpipを使用してローカルで管理します。

`pip3 install <パッケージ名> -t .` コマンドを実行して必要なパッケージをローカルにインストールすると、index.pyに関連するパッケージフォルダができます。

次に、ソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はFunctionCompute上でデプロイする際に使用します。

9. Pythonスクリプトをデプロイ - 2.OSSバケットにソースコードのアップロード

デプロイしたいPythonソースコードの準備が出来たら、ターミナルからCLIコマンド `aliyun oss cp <source file> <OSS bucket path>` を実行して、事前に準備したZIPファイルをOSS bucketにアップロードします。次に、アップロードされたファイルをコンソールで確認します。

10. Pythonスクリプトをデプロイ - 3.PythonソースコードをCLIコマンドで展開

FunctionComputeコンソール画面にてサービス・リソース等の準備が出来たら、Alibaba Cloud CLIコマンド `aliyun fc-open POST /2021-04-06/services/<service name>/functions --body <JSON info>`  を使用して、関数のコードを作成します。上記はNode.jsをランタイムパラメータ値として設定していますが、今回はPython3に設定します。

今回はpython3 ランタイムのもと、OSS bucketに保存しているターゲットのZIPファイルのソースコードをベースとしたコードを作成するため、パラメータは以下の通りに指定してコマンドを入力します。

aliyun fc-open POST /2021-04-06/services/ohara-bob-deploy/functions --body  “{\"functionName\":\"ohara-bob-python-cli\",\"handler\":\"index.handler\",\"regionId\":\"ap-northeast-1\",\"runtime\":\"python3\",\"serviceName\":\"ohara-bob-deploy\",\"initializer\":\"\",\"environmentVariables\":{},\"initializationTimeout\":3,\"instanceType\":\"e1\",\"memorySize\":512,\"timeout\":60,\"instanceConcurrency\":1,\"code\":{\"ossBucketName\":\"ohara-bob-jp\",\"ossObjectName\":\"fc-code/python_test_zip.zip\"}}”

コマンド入力が正しければ、コンソール画面にて関数名等が表示されます。

11. Pythonスクリプトをデプロイ - 4.CLIコマンドでデプロイ結果の確認及びテスト

コンソール画面で作成した関数のコード、スクリプト、ランタイム、などをチェックします。コマンドの引数パラメータが正しければ、関連するソースコードと依存パッケージが正しく表示されています。

コマンド`aliyun fc-open POST /2021-04-06/services/<Service Name>/functions/<Function Name>/invocations`で作成された関数を呼び出します。上記のデプロイする関数コードの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。

以下の通りコマンドを入力します。

aliyun fc-open POST /2021-04-06/services/ohara-bob-deploy/functions/ohara-bob-python-cli/invocations

テストの結果、HTTP 200が無事返却されたので、成功です。以上が、CLIベースでFunctionCompute上のPythonソースコードをデプロイする方法になります。

12. 最後に

Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイする方法をご紹介しました。サーバレスアプリケーションはコードを記述しながら実行できるクラウドサービスなので、エンジニアリングリソースを小さくしてくれるため非常に便利です。一方、複数の開発者による並列操作、環境構成の管理、ランタイムで例えばPythonのバージョン変更など各環境で些細な変更が生じても素早く変更、自動的にデプロイしたい場合は、コンソール画面での操作では手入力等反映リソースが追いつかなくなるため、Infrastructure as Code(IaC)ベースで運用するのがベターです。

本記事では、IaCを意識しながらAlibaba Cloud CLIコマンドツールを介して、ローカルにあるソースコードをOSS bucketへアップロード保存し、そのままOSSからFunction ComputeへCLIコマンドでイベント操作をする方法を記載していますので、CI/CDパイプラインでサーバレスアプリケーションを構築する際はご参考になれば幸いです。

関連サービス

Alibaba Cloud

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

MSPサービス

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

おすすめの記事

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