📚

さくらのクラウドのVMをAPIで操作する

2024/03/09に公開

目的

  • AWS、GCP、Azureなどでは実行できないジョブをさくらのクラウドで作成したVMで実行する
  • 土日でしか動かさない
  • サーバー実行時間を節約するため、ジョブ実行時のみVMを起動する
    • 起動は他Paasのサーバレスサービスなどを利用など

Pythonの実装例

事前準備

さくらのクラウドのコンソールから必要な情報を取得して環境変数にセット

  • export SERVER_ID=${サーバーID}
  • export SAKURA_CLOUD_USERNAME=${APIトークン}
  • export SAKURA_CLOUD_PASSWORD=${APIシークレット}

requirements.txt

requests==2.25.1

main.py

import os
import sys
import requests
from requests.auth import HTTPBasicAuth

# GET:該当IDのサーバの起動状態を取得
def get_server_status(url, username, password):
    print("GET VM status")
    response = requests.get(url, auth=HTTPBasicAuth(username, password))
    if response.status_code == 200:
        print("成功:", response.json())
        return 0
    else:
        print("エラー:", response.status_code)
        return 1

# PUT:該当IDのサーバを起動
def start_server(url, username, password):
    print("START VM")
    response = requests.put(url, auth=HTTPBasicAuth(username, password))
    if 200 <= response.status_code < 300:
        print("成功:", response.json())
        return 0
    else:
        print("エラー:", response.status_code)
        return 1

# DELETE:該当IDのサーバを停止
def stop_server(url, username, password):
    print("STOP VM")
    response = requests.delete(url, auth=HTTPBasicAuth(username, password))
    if 200 <= response.status_code < 300:
        print("成功:", response.json())
        return 0
    else:
        print("エラー:", response.status_code)
        return 1

# main関数
def main(args):
    server_id = os.environ.get("SERVER_ID") 
    username = os.environ.get("SAKURA_CLOUD_USERNAME") # APIトークン
    password = os.environ.get("SAKURA_CLOUD_PASSWORD") # APIシークレット
    base_url = f"https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/{server_id}/power"

    if len(args) > 2:
        if args[1] == "start":
            return start_server(base_url, username, password)
        elif args[1] == "stop":
            return stop_server(base_url, username, password)

    get_server_status(base_url, username, password)

    return 0

# エントリーポイント
if __name__ == '__main__':
    sys.exit(main(sys.argv))

参考サイト

Discussion