
この記事は ConoHa Advent Calendar 2021 における21日目の記事です.
(当初,カレンダーの方にURLを登録し忘れていました…….)
20日目の記事は「【ConoHa】Matomoの2021年を振り返ろう」でした.
今年は学会出張と重なり,またしてもぎりぎり投稿になってしまいました.
現在は 2021/12/21 22:32 です.頑張ります.
はじめに
この記事では,とても安価で使い勝手の良い ConoHa VPS を,これまたとても使いやすい Google Colaboratory でサーバを追加する方法について説明していきます.
私の所属する大学のあるコミュニティでは,サーバを建てては壊してを頻繁に繰り返しています.
この作業を各自でやれば良いのですが,諸般の事情で全て私一人でやる羽目になってしまいました.
そこで,この作業を楽にするため ConoHa が提供している API を叩いてサーバの追加を楽に行おうとした結果をまとめていきたいと思います.
Google Colaboratory って?
ブラウザから Python を記述・実行できるサービスで,Google が提供しています.通称 Colab です.
Colab の使い方そのものは説明しませんが,Python の実行環境を提供してくれるので色々楽です.
普段は授業や演習で使うことの方が多いですが,今回は便利ツールという位置づけで使っていきたいと思います.
ConoHa API の準備
API ユーザの作成
まずはこちらから API を触るために必要な API ユーザを作成します.とてもわかりやすい画面なので迷わないとは思いますが,「+ユーザー」ボタンをクリックして API ユーザを作成します.

作成が完了すると次のような画面になり,ユーザ名が発行されます.

以上で API ユーザの作成は終了です.
なお,本画面の上部にはテナント情報が表示されています.これは後ほど必要になるため,必要に応じて本画面を参照してください.
Google Colab の準備
Google Colab はこちらからアクセスできます.アクセスすると,次のように最近開いたノートブック(ファイル単位)の一覧が表示されます.

今回は「ノートブックを新規作成」で新しいノートブックを作成し進めていきたいと思います.
新規作成が完了すると次のようになるはずです.

Colab の使用方法については詳しく解説しませんが,この画面で Python を書いていくことになります.
Colab の使用方法についてはこちらがわかりやすいのでぜひご覧ください.
以上で Colab の準備は終了です.
Colab で ConoHa API を叩いてみる
Python スクリプト
Python スクリプトはこちらを参考に,色々と削ぎ落としています.
最終的には次のようになりました.
from requests.exceptions import *
import base64
import json
import requests
import sys
APIUSER = '<API ユーザ名>'
APIPASSWORD = '<API ユーザのパスワード>'
TENANTID = '<テナントID>'
ROOTPASS = '<root ユーザのパスワード>'
STAG = 'qiita-advent-calendar-demo'
def get_conoha_token(tid, user, passwd):
    ''' Function of getting a text of conoha token'''
    _api = 'https://identity.tyo1.conoha.io/v2.0/tokens'
    _header = {'Accept': 'application/json'}
    _body = {
        "auth": {
            "passwordCredentials": {
                "username": user,
                "password": passwd
                },
            "tenantId": tid
        }}
    try:
        _res = requests.post(_api, data=json.dumps(_body), headers=_header)
        return (json.loads(_res.text))["access"]["token"]["id"]
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not get ConoHa token text.', e)
        sys.exit()
def create_server(tid, token, admin_pass):
    ''' Function of creatting New Server '''
    _api = 'https://compute.tyo1.conoha.io/v2/' + tid + '/servers'
    _header = {'Accept': 'application/json', 'X-Auth-Token': token}
    _body = {"server": {
                "adminPass": admin_pass,
                "flavorRef": "7eea7469-0d85-4f82-8050-6ae742394681",
                "imageRef": "0ef81c70-bb4d-40a5-9163-37be85c5f0a6",
        }}
    try:
        _res = requests.post(_api, data=json.dumps(_body), headers=_header)
        if json.loads(_res.text)['server']:
            print('Success')
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not create server.', e)
        sys.exit()
    except KeyError:
        print('Error Code   : {code}¥nError Message: {res}'.format(
                code=_res.text['badRequest']['message'],
                res=_res.text['badRequest']['code']))
        sys.exit()
def main():
    # Get API token
    Token = get_conoha_token(TENANT, APIUSER, APIPASS)
    # Create New Server
    create_server(TENANT, Token, ROOTPASS)
        
if __name__ == '__main__':
    main()
トークンの取得
ConoHa API を使用する際には「トークン」が必要となります.
このトークンを API サーバに送信することで,API が叩けるようになるイメージです.
API トークンを取得する際には API ユーザ名とパスワード,そしてテナント ID をサーバに送信します.
このスクリプトでは create_server という関数が該当します.なお,公式のドキュメントはこちらです.
サーバの作成
ここでは,create_server という関数でサーバを作成しています.
サーバを作成するためには少なくともテナントID,トークンが必要で,今回は root ユーザのパスワード(ROOTPASS)も指定しています.
ここで重要なポイントは,_body という変数の中にある「flavorRef」と「imageRef」です.それぞれ,料金プランとディスクイメージの UUID を指定しています.
今回は 1GB のプランで Ubuntu 20.04 がインストールされたサーバを作成するように指定していますが,料金プランの一覧を取得するスクリプトやディスクイメージの一覧を取得するスクリプトによって他のUUIDを確認することができます.

おわりに
今回は Colab を使ってサーバを作成する方法をまとめました.基本的には Python スクリプトを実行する方法なので新しくも何もありませんが,Colab を普段から使っている人にとっては楽にサーバを作成できるのではないかと思います.
……今年の作業時間は1時間24分でした.





 
                     
                     
                     
                    
 
                         
                        