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
次に下記の部分
ここの配下に[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)
以上で、スクリプト完成。