Alibaba
FunctionCompute

AlibabaでFunction Computeを動かしてみる


Function Computeとは

Alibabaの「Function Compute」とは、サーバレスでコードを実行できる機能です。AWSでいうLambdaが該当します。ここでは、実際にPythonを使用してECS(AWSで言うところのEC2)をシャットダウン、スタートさせてみます。

AWSだとマニュアルが充実しているため、難なくできますが、Alibabaはそのあたりまだまだ発展途上のためgithubでソースを見たりして解読する必要があります。しかし、こちらの手順を覚えてしまえば見るポイントは絞られます。


Python3系でセットアップする

まずは、サービスを作成します。このサービスの中に関数を作成するイメージです。今回はECSのサービスを作成して、その中に関数(Function)をいくつか作成します。


最初にコードから

最初に最終系であるコードを記載します。

# -*- coding: utf-8 -*-

import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import StopInstanceRequest
from aliyunsdkecs.request.v20140526 import StartInstanceRequest

ACCESSKEYID = os.environ["ACCESSKEYID"]
ACCESSKEYSECRET = os.environ["ACCESSKEYSECRET"]
REGIONID = "ap-northeast-1"
STOP_INSTANCEID = "i-6we733XXXXXXXXXXXXXXX"
START_INSTANCEID = "i-6wejYYYYYYYYYYYYYYY"

def handler(event, context):
client = AcsClient(ACCESSKEYID, ACCESSKEYSECRET, REGIONID)

# Stop Instance (インスタンスをストップする
stop_request = StopInstanceRequest.StopInstanceRequest()
stop_request.set_InstanceId(STOP_INSTANCEID)
stop_request.set_ForceStop("true")
client.do_action_with_exception(stop_request)

# Start Instance (インスタンスを起動する)
start_request = StartInstanceRequest.StartInstanceRequest()
start_request.set_InstanceId(START_INSTANCEID)
client.do_action_with_exception(start_request)

return


ライブラリはどれ?

まず、最初に当たったのがこの問題でした。マニュアルを見るとなんとな~くわかりますが、自分は理解ができなかった。

ということで alibaba python sdkを見ました。

その中から [aliyan-python-sdk-ecs]→[aliyansdkecs]→[request]→[v20140526]とたどっていったところそこに何やらECSに関するものが発見!!

そこには「StartInstanceRequest.py」と「StopInstanceRequest.py」が有りました。

以下のようにクラス化されています。

class StartInstanceRequest(RpcRequest):

ということで、マニュアルと見比べて以下のように記載。

from aliyunsdkcore.client import AcsClient

from aliyunsdkecs.request.v20140526 import StopInstanceRequest
from aliyunsdkecs.request.v20140526 import StartInstanceRequest

次に下記の部分

https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-ecs/aliyunsdkecs/request/v20140526

ここの配下に[StopInstanceRequest.py]なるものがあり、インスタンスを停止するものだと名前でわかった。通常、インスタンを停止するには当然、停止するインスタンスを何かしら指定しなければならない。

この中でいうと下記が該当する。

def set_InstanceId(self,InstanceId):

self.add_query_param('InstanceId',InstanceId)

これを使えばいいので下記のようにセットして実行してみた。

なお、 client.do_action_with_exception の部分は do_action でも実行できるが

こちらのほうが、良い。

# Stop Instance (インスタンスをストップする)

stop_request = StopInstanceRequest.StopInstanceRequest()
stop_request.set_InstanceId(STOP_INSTANCEID)
client.do_action_with_exception(stop_request)

以上で、スクリプト完成。