Digital Ocean は、高速 SSD ベースのサーバーと月額 5 ドルの安価なホスティング プランのおかげで、最も急速に成長している Web ホストの 1 つです。テストまたは長期使用のために Digital Ocean でインスタンスを起動するのは、迅速、簡単、そして手頃な価格です。
Digital Ocean での再販用のアプリケーション イメージの構築では、WordPress (または他のアプリケーション) インスタンスをスピンアップし、クライアントのために繰り返しクローンを作成する方法を説明しました。このチュートリアルでは、Digital Ocean API を使用してインスタンス (ドロップレットとも呼ばれます) をプログラムで管理し、一般的なタスクを自動化する方法を説明します。また、Yii Framework for PHP で書かれた非常に基本的な API オペレーションを実行するためのサンプル コード ベースも提供します。コードは Github で入手できます。
Digital Ocean API を使用すると、HTTP リクエストを使用してプログラムで簡単にドロップレットとリソースを管理できます。 Digital Ocean コントロール パネルで使い慣れたすべての機能は API 経由でも利用できるため、状況に応じて複雑な操作をスクリプト化できます。
このチュートリアルでは、開発者 Antoine Corcy の Digital Ocean V2 PHP API ライブラリを Yii ベースのコンソール アプリケーションに統合します。このアプリケーションを使用するために Yii を知る必要はありませんが、ここで詳細を学ぶことができます: Yii フレームワークの紹介。
Digital Ocean API は OAuth 経由でアカウントを認証し、12 近くのプレミアム領域で構成されます:
API の一部を理解したところで、独自のアプリケーションについて詳しく見ていきましょう。
API を使用するには、アカウントの個人アクセス トークンをアクティブ化する必要があります。アカウントにサインインし、設定アプリケーション ページ (https://cloud.digitalocean.com/settings/applications) にアクセスします。以下に示すように、「」をクリックして新しいトークン を生成します。
アクセス トークンを以下に書き留めます。Digital Ocean は 1 回だけ表示します:次に、サンプル コンソール アプリケーションに移りましょう。
私たちのコンソール アプリケーション
API アクセスの構成
私たちは、ライブラリを使用するためのモデルとして機能する Ocean.php というコンポーネントを構築しました。これは
/app/protected/components/Ocean.php にあります。
digitalOcean API オブジェクトをインスタンス化します。
リーリー
/app/protected/models/Droplet.php で、
sync メソッドは Ocean コンポーネントを呼び出し、Droplet を取得します。
リーリー
Ocean
メソッドは次のとおりです:
リーリー
基本コンソール アプリケーションは、ドロップレット リストの一方向のダウンロード同期のみを行います。クラウドで削除されたドロップの削除など、さらに多くの機能を自分で実装できます。 これは、Droplet モデルの
add 関数です。ドロップレットがすでに存在する場合は、レコードを更新するだけです:
<pre class="brush:php;toolbal:false;">public function add($droplet) {
$d = Droplet::model()->findByAttributes(array('droplet_id'=>$droplet->id));
if (empty($d)) {
$d = new Droplet;
}
$d->user_id = Yii::app()->user->id;
$d->droplet_id = $droplet->id;
$d->name = $droplet->name;
$d->vcpus = $droplet->vcpus;
$d->memory = $droplet->memory;
$d->disk = $droplet->disk;
$d->status = $droplet->status;
$d->active =1;
$d->created_at = $d->created_at;
$d->modified_at =new CDbExpression('NOW()');
$d->save();
return $d->id;
}
</pre>
<p>如果您希望扩展模型的功能,Digital Ocean 提供了各种 Droplet API 操作,Corcy 在此列出了清晰的示例。</p>
<h2>获取图像</h2>
<p>接下来,我们将使用 API 来获取当前图像的列表。映像是快照,本质上是备份,是在给定时间点从服务器实例获取的。</p>
<p><img src="https://img.php.cn/upload/article/000/887/227/169371894962430.jpg" alt="使用 Digital Ocean API 管理云实例"></p>
<p>我们的 Snapshot.php 模型有一个 <code class="inline">sync
操作,它会请求图像列表并添加将它们分别写入数据库:
public function sync() { $ocean = new Ocean(); $snapshots = $ocean->getSnapshots(); foreach ($snapshots as $i) { $image_id = $this->add($i); if ($image_id!==false) { echo $image_id;lb(); pp($i); } } }
这是海洋组件 getSnapshots
代码:
public function getSnapshots() { // return the action api $action = $this->digitalOcean->image(); // return a collection of Action entity $actions = $action->getAll(); return $actions; }
这是快照模型 add
代码 - 我们忽略 Digital Ocean 的库存应用程序映像,这些映像被区分为公共:
public function add($snapshot) { $i = Snapshot::model()->findByAttributes(array('image_id'=>$snapshot->id)); if (empty($i)) { $i = new Snapshot; $i->created_at =new CDbExpression('NOW()'); } if (isset($snapshot->public) and $snapshot->public ==1) { return false; // no need to save public images right now } else $i->user_id = Yii::app()->user->id; $i->image_id = $snapshot->id; $i->name = $snapshot->name; $i->region = $snapshot->regions[0]; $i->active =1; $i->modified_at =new CDbExpression('NOW()'); $i->save(); return $i->id; }
正如我们在构建要在 Digital Ocean 进行转售的应用映像中所讨论的那样,自动创建可传输给客户和顾客的快照非常有用。遗憾的是,目前无法通过引用克隆或传输图像;每次您将快照转移到另一个帐户时,它就会消失。
由于 Digital Ocean 要求您将图像实例化为 Droplet,并在拍摄新快照之前将其关闭,因此重复创建快照是一个耗时的手动过程。 Digital Ocean 在拍摄快照后再次启动水滴并没有什么帮助,这只会减慢进程。
由于 API 在其他操作挂起时不接受请求,因此我们必须构建一个表来跟踪后台操作并使用 cron 作业来重复断电、快照操作。其工作原理如下:
访问图像页面,然后单击您想要克隆的快照的查看。然后,单击右侧的复制菜单选项。
这将创建一个 Droplet 并使用此 image_id
和droplet_id
。 end_stage
是一个常量,您可以设置它来指示要创建的重复项的数量。
这是 Snapshot 模型的 replicate()
方法:
public function replicate($id) { // look up image_id $snapshot = Snapshot::model()->findByAttributes(array('id'=>$id)); // create the droplet $ocean = new Ocean(); $droplet_id = $ocean->launch_droplet($snapshot->name,$snapshot->region,$snapshot->image_id); // add command to action table with droplet_id and image_id $a = new Action(); $a->droplet_id = $droplet_id; $a->snapshot_id = $snapshot->image_id; $a->action = Action::ACTION_SNAPSHOT; $a->status = Action::STATUS_ACTIVE; $a->stage = 0; // user settable constant for number of replications to make $a->end_stage = Snapshot::NUMBER_REPLICATIONS; $a->last_checked = 0; $a->modified_at =new CDbExpression('NOW()'); $a->created_at =new CDbExpression('NOW()'); $a->save(); }
cron 任务将 ping http://ocean.yourdomain.com/daemon/index 以定期处理操作表。任何未完成的逾期项目都将请求另一个快照。
这是 Action 模型的 process()
方法:
public function process() { set_time_limit(0); // look for overdue actions $todo = Action::model()->overdue()->findAllByAttributes(array('status'=>self::STATUS_ACTIVE)); foreach ($todo as $item) { if ($item->action == self::ACTION_SNAPSHOT) { $result = Snapshot::model()->take($item->id); } } }
快照过程将关闭 Droplet,暂停 20 秒等待 Droplet 关闭,并请求快照。
这是 Snapshot 模型的 take()
方法:
public function take($action_id) { $result = false; $a = Action::model()->findByPk($action_id); $snapshot = Snapshot::model()->findByAttributes(array('image_id'=>$a->snapshot_id)); $ocean = new Ocean(); // attempt shutdown // take snapshot $result = $ocean->snapshot($a->stage,$a->droplet_id,$snapshot->name,$snapshot->region,$snapshot->image_id); // if snapshot was successful if ($result) { // increment stage $a->stage+=1; // if last snapshot replication complete, end action if ($a->stage >= $a->end_stage) $a->status = Action::STATUS_COMPLETE; } // either way, update last_checked $a->last_checked = time(); $a->save(); return $result; }
以下是 Ocean 组件中用于实际进行 API 调用的代码:
public function snapshot($stage,$droplet_id,$name,$region,$image_id,$begin=1,$count=3,$size='512mb') { $no_sleep = false; $name = str_replace("_","-",$name); $droplet = $this->digitalOcean->droplet(); try { echo 'Shutting down '.$droplet_id;lb(); $shutdown = $droplet->shutdown($droplet_id); } catch (Exception $e) { $err = $e->getMessage(); echo 'Caught exception: ', $e->getMessage(), "\n"; if (stristr ( $err , 'already powered off')===false) return false; else $no_sleep = true; } if (!$no_sleep) { echo 'Sleep 20 seconds for power off...';lb(); sleep(20); } echo 'Take snapshot of '.$droplet_id.' named '.$name.'-copy-'.$stage;lb(); try { $snapshot = $droplet->snapshot($droplet_id, $name.'-copy-'.$stage); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; return false; } // shutdown and snapshot successful return true; }
如果您访问 Digital Ocean 网站查看 Droplet,您将看到正在进行的操作:
如果快照成功,则返回Snapshot模型以递增阶段。当阶段复制完成后,操作完成。
您可以访问 Digital Ocean 网站的图像页面来查看复制的快照:
创建图像后,您可以手动删除 Droplet,或者您可以扩展代码以在 STATUS_COMPLETE
已达到。如果您不删除 Droplet,我们将向您收取费用。
请注意,目前 API 不提供将快照传输到电子邮件地址的功能,因此您需要继续通过网络界面手动执行此操作。
我希望您喜欢本教程,并发现 Digital Ocean 是您的工具和托管提供商组合中的一项有用服务。在下一个教程中,我们将探索 Digital Ocean DNS 服务。
请随时在下面发表您的问题和评论。您也可以通过 Twitter @reifman 联系我或直接给我发电子邮件。请关注我的 Tuts+ 讲师页面,查看本系列后续文章。
以上がDigital Ocean API を使用してクラウド インスタンスを管理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。