APIを使用してマスタースナップショットからドロップレットを展開する方法

前書き

このチュートリアルでは、ソフトウェアと構成を使用してマスタースナップショットイメージを作成し、DigitalOcean APIを使用して、このイメージを使用したドロップレットの展開を自動化します。 このチュートリアルの例では、Ruby DropletKitの公式DigitalOcean APIクライアントを使用します。

前提条件

  • Rubyは、APIへの接続に使用するコンピューターにインストールする必要があります。

  • DropletKit gemもこの環境にインストールする必要があります。

  • スクリプトで使用するhttps://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2[APIトークンを生成]が必要です。

ステップ1:マスターイメージを作成する

このチュートリアルでは、https://www.digitalocean.com/features/one-click-apps/lamp/ [LAMP One-Click Image]に基づいてマスターイメージを作成し、デフォルト構成をセットアップしてから、それを使用してスナップショットイメージを作成します。 スナップショットのコストは、ファイルシステム内の使用済みスペースの量に基づいて、ギガバイトあたり月額0.05ドルです。 DigitalOcean APIを使用して、カスタマイズされたLAMPスタックの複数のインスタンスをデプロイできます。

新しい液滴を作成する

まず、コントロールパネルから「+ lamp-master +」という名前の新しいドロップレットを作成し、[アプリケーション]タブでLAMPイメージを選択します。 このイメージは、Apache、MySQL、およびPHPを備えたビルド済みのUbuntu 14.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=''
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: '', name: 'lamp-image')

作成したスナップショットリクエストは、スナップショットプロセスのステータスを追跡するために使用できるイベントID番号を返します。 https://www.digitalocean.com/community/tutorials/how-to-use-and-understand-action-objects-and-the-digitalocean-api [このチュートリアル]は、イベントIDの使用に関する詳細情報を提供します。

ステップ2:スナップショットからドロップレットを展開する

これで、構成でドロップレットを展開するために使用できるマスタースナップショットイメージが作成されました。 ドロップレットで行ったように、新しいスナップショットのイメージIDを取得するためにAPIをクエリする必要があります。

images = client.images.all(public:false)
images.each do |image|
 if image.name == "lamp-image"
   puts image.id
 end
end

上記の液滴識別の例と同様に、このコードはアカウントのスナップショットとバックアップ画像をループし、 `+ lamp-image +`という名前の画像のIDを表示します。

画像のID番号を取得したので、液滴の展開を開始できます。 次のコードは、New York 3リージョンのマスタースナップショットを使用して新しい2GBドロップレットを作成します。

スナップショットイメージは、ドロップレット作成用に指定した領域に存在する必要があることに注意してください。 コントロールパネルまたはAPIのhttps://developers.digitalocean.com/documentation/v2/#transfer-an-image[image endpoint]を使用して、画像を追加の領域に転送できます。

droplet = DropletKit::Droplet.new(name: 'my-lamp-server', region: 'nyc3', size: '2gb', image: '')
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: '', user_data: userdata)
client.droplets.create(droplet)

この例では、新しいドロップレット内で単に `+ echo +`コマンドを使用して、Webルートのindex.htmlファイルにHTMLをドロップしています。 他のコマンドを使用することで、新しい仮想ホストをドロップレットに直接設定したり、リモートサーバーから追加の設定の詳細をプルダウンしたり、ssh接続を介して実行できるほぼすべての操作を選択したりできます。 https://www.digitalocean.com/company/blog/automating-application-deployments-with-user-data/ [ユーザーデータの詳細については、こちらをご覧ください]。

ステップ4:まとめる

APIを介してスナップショットイメージに基づいてドロップレットを展開し、コンテンツをカスタマイズできるようになったので、さらに一歩進んで、イメージに基づいて新しいドロップレットを起動するインタラクティブスクリプトを作成します。 次のスクリプトは、スナップショットイメージが既に作成されており、そのIDが利用可能であることを前提としています。

require 'droplet_kit'
token=''
client = DropletKit::Client.new(access_token: token)
region = 'nyc3'
image_id = ''
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=''
client = DropletKit::Client.new(access_token: token)

次に、領域、液滴サイズ、マスタースナップショットイメージのIDなど、液滴のオプションをいくつか指定します。

region = 'nyc3'
image_id = ''
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のhttps://developers.digitalocean.com/documentation/v2/#domains[DNSエンドポイント]を使用して、新しいドロップレットの起動時にDNSレコードを自動構成します。

  • 領域や液滴サイズなどの追加の入力をユーザーに要求します。

  • ユーザーデータのruncmd呼び出しを使用して、Webコンテンツを新しいドロップレットにダウンロードするか、MySQLデータベースに入力します。

Related