このブログでもお世話になっている ConoHa でスタートアップスクリプト機能が追加されたので早速試してみました。
【リリース】APIを利用したVPS作成におけるスタートアップスクリプト機能追加
APIでのVPS作成の際、自動的にスクリプトを実行できる機能を追加しました。パッケージの更新やアプリケーションのインストールなどの操作が可能となります。https://t.co/OpTLP3eFSo— ConoHaPR (@ConoHaPR) July 3, 2017
スタートアップスクリプトはコントロールパネルではなく、API から操作するようです。
公式サイトには下記の二つのページが紹介されていました。
今回は、前回(2年前!) ConoHa の API の記事にならって、PowerShell を使用します。
トークンの取得
スタートアップスクリプトに限らず、ConoHa の API を利用するには必要になります。
$apiUser = "APIユーザー名" $apiPassword = "APIパスワード" $tenantId = "テナントID" $identityServiceUrl = "https://identity.tyo1.conoha.io/v2.0" $computeServiceUrl = "https://compute.tyo1.conoha.io/v2/" + $tenantId $body = '{"auth":{"passwordCredentials":{"username":"' + $apiUser + '","password":"'+$apiPassword+'"},"tenantId":"'+$tenantId+'"}}' $url = $identityServiceUrl+"/tokens" $mytokens = Invoke-RestMethod $url -Method POST -Body $body $token = $mytokens.access.token.id $tokenHeader = @{"X-Auth-Token" = $token}
imageRef, flavorRef の取得
こちらも、スタートアップスクリプトスクリプトを使用しない場合でも、VPS 作成の API で必要になる imageRef と flavorRef の取得を行います。
今回は 1GB プランを使用します。
1024MB なので、このように調べてみました。
$flavors = Invoke-RestMethod -Method GET -Headers $tokenHeader -Uri "$computeServiceUrl/flavors/detail" $flavors.flavors | Where-Object {$_.ram -eq 1024}
1GB プランの場合、flavorRef は 7eea7469-0d85-4f82-8050-6ae742394681 を指定すると良いようです。
OS イメージは、Linux なら何でもよいようですが、今回は CentOS 7.3 を使用します。
name から絞り込むと良いようで、このように調べてみました。
$images = Invoke-RestMethod -Method GET -Headers $tokenHeader -Uri "$computeServiceUrl/images/detail" $images.images | Where-Object {$_.name -like "vmi-centos-7.3*"}
1GB プランなので、20gb がつかない vmi-centos-7.3-amd64-unified の 1788b029-1b7a-43eb-a89d-02abd0866458 を指定します。
base64 user-data の生成
以前の記事で紹介した、このブログを運用しているサーバーの設定をベースにスタートアップスクリプトを作成します。
ConoHa ではシェルスクリプトの他に、’#include-once’、’#include’、’#cloud-config’、’#cloud-boothook’ も利用できるようですが、スタートアップスクリプト初心者なのでシェルスクリプトを使用します。
スクリプトはこのようにしました。
$script = "#!/bin/sh yum -y update firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent yum -y remove httpd yum -y install nginx systemctl enable nginx rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum-config-manager --enable remi-php71 yum -y install php php-fpm php-mbstring php-mysqlnd composer systemctl enable php-fpm reboot"
PowerShell で Base64 に変換する場合、下記のようになります。
$byte = [System.Text.Encoding]::UTF8.GetBytes( $script ) $base64 = [System.Convert]::ToBase64String( $byte )
いよいよ、VM の作成
調べた imageRef と flavorRef、そして自作のスタートアップスクリプトを組み合わせると、下記の PowerShell で VM が作成できます。
$body = '{ "server": { "imageRef": "1788b029-1b7a-43eb-a89d-02abd0866458", "flavorRef": "7eea7469-0d85-4f82-8050-6ae742394681", "adminPass":"72LY2hf38Kf84vCy4sUr", "user_data" : "' + $base64 + '" } }' Invoke-RestMethod -Method POST -Headers $tokenHeader -Uri "$computeServiceUrl/servers" -Body $body
※adminPass は公式ドキュメントの転載です。ご安心ください。
VM の作成自体は 30秒で終了(コンパネ表記が起動中になる)のですが、スクリプトはその後実行されます。
スクリプト次第ですが、時間がかかる場合、スクリプト実行状態なのかそうでないのかが分からないことがあります。
/var/log/cloud-init.log に出力されるようなので、不安ならそこを見ると良いかもしれません。
今回は、セキュリティグループについては説明を省略しています。
(反則ですが)コントロールパネルから Web と SSH を有効にします。
最後に
スクリプトの最後の行より、自動的に再起動されます。
再起動後、IP アドレスを入力し、nginx のテストページが表示されると作業完了です。
ConoHa で独自に手を入れた VM を作成する場合、「イメージ保存」機能もありますが、時間がかかる作業です。
スクリプトで記述できる内容は、スタートアップスクリプトを使用すると便利になると思いました。