APIを使用してマスタースナップショットからドロップレットをデプロイする方法
序章
このチュートリアルでは、ソフトウェアと構成を使用してマスタースナップショットイメージを作成し、DigitalOcean APIを使用して、このイメージを使用して液滴の展開を自動化します。 このチュートリアルの例では、Ruby DropletKit用の公式DigitalOceanAPIクライアントを使用します。
前提条件
- Ruby は、APIへの接続に使用するコンピューターにインストールする必要があります。
- DropletKitgemもこの環境にインストールする必要があります。
- スクリプトで使用するAPIトークンを生成する必要があります。
ステップ1:マスターイメージを作成する
このチュートリアルでは、 LAMPワンクリックイメージに基づいてマスターイメージを作成し、デフォルト構成をセットアップしてから、それを使用してスナップショットイメージを作成します。 スナップショットのコストは、ファイルシステム内の使用済みスペースの量に基づいて、1ギガバイトあたり1か月あたり0.05ドルです。 DigitalOcean APIを使用して、カスタマイズされたLAMPスタックの複数のインスタンスをデプロイできるようになります。
新しい液滴を作成する
まず、という名前の新しい液滴を作成します lamp-master
コントロールパネルから、[アプリケーション]タブでLAMPイメージを選択します。 このイメージは、Apache、MySQL、およびPHPを備えたビルド済みのUbuntu14.04サーバーを提供します。
マスタースナップショットイメージを生成するために使用するドロップレットを作成するときは、可能な限り最小のドロップレットプランを選択することが重要です。 スナップショットを作成すると、同じプランまたはより大きなプランでドロップレットを作成するためにのみ使用できます。 たとえば、1GBのドロップレットを使用してマスタースナップショットを作成する場合、それを使用して1GB、2GB、またはその他のより大きなプランでドロップレットを起動できますが、このスナップショットから512MBのRAMでドロップレットを起動することはできません。
新しいドロップレットが作成されたら、SSHクライアントを使用してそれに接続します。
初期構成
新しいドロップレットに接続したので、マスターイメージからデプロイされたすべてのドロップレットに設定を構成したり、パッケージをインストールしたりできます。 この場合、2つの追加のphpモジュールをインストールします。 curlとImagemagick。
sudo apt-get update
sudo apt-get install php5-curl php5-imagick
スナップショットの作成
必要なソフトウェアを追加したので、ドロップレットの電源を切り、スナップショットを作成できます。 実行中のシステムのスナップショットを作成することは可能ですが、電源を切ると、ファイルシステムが一貫した状態になります。
sudo poweroff
コントロールパネルからスナップショットを作成することもできますが、このチュートリアルでは、この時点からAPIを使用してDigitalOceanアカウントを操作します。 これらの例は、インタラクティブRuby(irb
)またはスクリプトに追加して、 ruby
指図。 最初のステップは、DropletKitクライアントを含めることです。
require 'droplet_kit'
token='[your api token]'
client = DropletKit::Client.new(access_token: token)
APIからスナップショットを作成するには、マスタードロップレットのIDを取得する必要があります。 これを行うには、APIのドロップレットエンドポイントを呼び出します。
droplets = client.droplets.all
droplets.each do |droplet|
if droplet.name == "lamp-master"
puts droplet.id
end
end
このコードスニペットは、APIのドロップレットエンドポイントを呼び出し、アカウント内のドロップレットをループして、名前の付いたドロップレットを探します。 lamp-master
. それが見つかると、スクリプトはこのドロップレットのID番号を表示します。
ドロップレットID番号を取得したので、ドロップレットIDをドロップレットエンドポイントのスナップショットアクションに渡すことで、このドロップレットのスナップショットを作成するようにAPIに指示できます。 ドロップレットIDに加えて、新しいイメージに使用されるスナップショット名も渡します。 この場合、スナップショットに名前を付けることにしました lamp-image
.
client.droplet_actions.snapshot(droplet_id: '1234567', name: 'lamp-image')
行ったスナップショット要求は、スナップショットプロセスのステータスを追跡するために使用できるイベントID番号を返します。 このチュートリアルでは、イベントIDの使用に関する詳細情報を提供します。
ステップ2:スナップショットからのドロップレットのデプロイ
これで、構成でドロップレットを展開するために使用できるマスタースナップショットイメージが作成されました。 ドロップレットで行ったように、APIをクエリして、新しいスナップショットの画像IDを取得する必要があります。
images = client.images.all(public:false)
images.each do |image|
if image.name == "lamp-image"
puts image.id
end
end
上記の液滴識別の例と同様に、このコードはアカウントのスナップショットとバックアップ画像をループし、名前の付いた画像のIDを表示します lamp-image
.
イメージのID番号を取得したので、ドロップレットのデプロイを開始できます。 次のコードは、ニューヨーク3リージョンのマスタースナップショットを使用して新しい2GBのドロップレットを作成します。
スナップショットイメージは、ドロップレットの作成用に指定した領域に存在する必要があることに注意してください。 コントロールパネルまたはAPIの画像エンドポイントを介して、画像を追加の領域に転送できます。
droplet = DropletKit::Droplet.new(name: 'my-lamp-server', region: 'nyc3', size: '2gb', image: '1234567')
client.droplets.create(droplet)
ステップ3:ユーザーデータを使用したカスタマイズ
APIを使用してカスタム構成で新しい液滴をデプロイできるようになりましたが、新しい液滴を個別にさらにカスタマイズしたい場合があります。 ドロップレットを作成するときにユーザーデータをドロップレットに送信することで、追加のカスタマイズを実行できます。
この例では、名前を含むカスタムindex.htmlファイルを新しいドロップレットにプリロードします。
sitename = "example.org"
userdata = "
#cloud-config
runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
droplet = DropletKit::Droplet.new(name: sitename, region: 'nyc3', size: '2gb', image: '1234567', user_data: userdata)
client.droplets.create(droplet)
この例では、単に echo
新しいドロップレット内のコマンドを使用して、HTMLをWebルートのindex.htmlファイルにドロップします。 他のコマンドを使用して、ドロップレット上で直接新しい仮想ホストを構成するか、リモートサーバーから追加の構成の詳細をプルダウンするか、ssh接続を介して実行できるほぼすべてのことを実行することを選択できます。 ユーザーデータの詳細については、こちらをご覧ください。
ステップ4:それをまとめる
APIを介してスナップショットイメージに基づいてドロップレットをデプロイし、そのコンテンツをカスタマイズできるようになったので、さらに一歩進んで、イメージに基づいて新しいドロップレットを起動するインタラクティブなスクリプトを作成します。 次のスクリプトは、スナップショットイメージがすでに作成されており、そのIDが使用可能であることを前提としています。
require 'droplet_kit'
token='[Your API Token]'
client = DropletKit::Client.new(access_token: token)
region = 'nyc3'
image_id = '1234567'
droplet_size = '2gb'
puts "Enter a name for your new droplet:"
sitename = gets.chomp
userdata = "
#cloud-config
runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
sitename.gsub!(/\s/,'-')
droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)
コードの内訳
このスクリプトには、最初にDropletKitクライアントが含まれ、指定したAPIトークンを使用して新しいクライアント接続を初期化します。
require 'droplet_kit'
token='[Your API Token]'
client = DropletKit::Client.new(access_token: token)
次に、領域、液滴サイズ、マスタースナップショットイメージのIDなど、液滴のいくつかのオプションを指定します。
region = 'nyc3'
image_id = '1234567'
droplet_size = '2gb'
次に、新しいドロップレットの名前を指定し、この情報をスクリプトが作成プロセスに提供するユーザーデータに含めるようにユーザーに促します。
puts "Enter a name for your new droplet:"
sitename = gets.chomp
userdata = "
#cloud-config
runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
index.htmlページにサイト名を含めたら、それをサニタイズして、ドロップレット名として使用できることを確認する必要があります。 ドロップレット名にはスペースを含めることができないため、スペースをダッシュに置き換えます。
sitename.gsub!(/\s/,'-')
次に、これらすべての変数をまとめて、新しいドロップレットを作成するリクエストを送信します。
droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)
次のステップ
APIを使用して、オンデマンドでカスタムドロップレットを作成し、作成時に独自の設定またはファイルを含めることができます。 このスクリプトに機能を追加することで、これらの基本を拡張することを選択できます。 考えられる改善には次のものがあります。
-
APIのDNSエンドポイントを使用して、新しいドロップレットの起動時にDNSレコードを自動構成します。
-
領域や液滴サイズなどの追加入力をユーザーに求めます。
-
user-data runcmd呼び出しを使用して、Webコンテンツを新しいドロップレットにダウンロードするか、MySQLデータベースにデータを入力します。