LoginSignup
1
2

More than 3 years have passed since last update.

AlibabaでFunction Computeを動かしてみる

Posted at

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)

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2