📚
さくらのクラウドのVMをAPIで操作する
目的
- 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