ホームページ >バックエンド開発 >PHPチュートリアル >Digital Ocean API を使用してクラウド インスタンスを管理する

Digital Ocean API を使用してクラウド インスタンスを管理する

WBOY
WBOYオリジナル
2023-09-03 13:29:01870ブラウズ

使用 Digital Ocean API 管理云实例

デジタルオーシャンとは何ですか?

Digital Ocean は、高速 SSD ベースのサーバーと月額 5 ドルの安価なホスティング プランのおかげで、最も急速に成長している Web ホストの 1 つです。テストまたは長期使用のために Digital Ocean でインスタンスを起動するのは、迅速、簡単、そして手頃な価格です。

Digital Ocean での再販用のアプリケーション イメージの構築では、WordPress (または他のアプリケーション) インスタンスをスピンアップし、クライアントのために繰り返しクローンを作成する方法を説明しました。このチュートリアルでは、Digital Ocean API を使用してインスタンス (ドロップレットとも呼ばれます) をプログラムで管理し、一般的なタスクを自動化する方法を説明します。また、Yii Framework for PHP で書かれた非常に基本的な API オペレーションを実行するためのサンプル コード ベースも提供します。コードは Github で入手できます。

デジタルオーシャンAPI

Digital Ocean API を使用すると、HTTP リクエストを使用してプログラムで簡単にドロップレットとリソースを管理できます。 Digital Ocean コントロール パネルで使い慣れたすべての機能は API 経由でも利用できるため、状況に応じて複雑な操作をスクリプト化できます。

このチュートリアルでは、開発者 Antoine Corcy の Digital Ocean V2 PHP API ライブラリを Yii ベースのコンソール アプリケーションに統合します。このアプリケーションを使用するために Yii を知る必要はありませんが、ここで詳細を学ぶことができます: Yii フレームワークの紹介。

Digital Ocean API は OAuth 経由でアカウントを認証し、12 近くのプレミアム領域で構成されます:

  • アカウント: Digital Ocean アカウントに関する基本情報を入力します。
  • 操作: アカウント内のドロップレットの操作履歴ログ。
  • ドメイン名とドメイン レコード: アカウント内のドロップレットで使用されるドメイン名と、それらに関連付けられた DNS レコードを管理できます。
  • ドロップレットとドロップレット アクション: ドロップレットの作成、シャットダウン、再起動、スナップショットなどを行うことができます。
  • 画像と画像アクション: アカウント内のドロップレット用に作成されたスナップショット イメージを列挙して管理できます。
  • SSH キー : ドロップレットの作成時にインストール用の SSH キーを登録できるため、パスワード セキュリティは必要ありません。
  • 地域: デジタル オーシャン ドロップを作成できる地理的エリアを列挙します。
  • Size: ドロップレットの作成時に使用できるドロップレットのサイズを列挙します。

API の一部を理解したところで、独自のアプリケーションについて詳しく見ていきましょう。

アクセスキーの設定

API を使用するには、アカウントの個人アクセス トークンをアクティブ化する必要があります。アカウントにサインインし、設定アプリケーション ページ (https://cloud.digitalocean.com/settings/applications) にアクセスします。以下に示すように、「」をクリックして新しいトークン を生成します。

使用 Digital Ocean API 管理云实例

アクセス トークンを以下に書き留めます。Digital Ocean は 1 回だけ表示します:

使用 Digital Ocean API 管理云实例

次に、サンプル コンソール アプリケーションに移りましょう。

私たちのコンソール アプリケーション

このチュートリアルでは、ドロップレットの管理に関連するいくつかのタスクを実行する、私が構築した小さなコンソール アプリケーションについて説明します。 Tuts GitHub リポジトリからアプリケーションを自分でインストールし、必要な追加の API 機能を実装するようにカスタマイズまたは拡張できます。コンソール アプリケーションの詳細なインストール ガイドを Web サイトに掲載しました。 Digital Ocean アプリの一般的なインストール ガイドを参照することもできます。

API アクセスの構成

ここでも、Antoine Corcy の Digital Ocean V2 PHP API ライブラリを使用して API にアクセスします。

私たちは、ライブラリを使用するためのモデルとして機能する Ocean.php というコンポーネントを構築しました。これは

/app/protected/components/Ocean.php にあります。

Yii は、Ocean.ini ファイルからアクセス トークンを読み込み (Digital Ocean コンソール アプリケーション インストール ガイドを参照)、

digitalOcean API オブジェクトをインスタンス化します。 リーリー

ドロップレットを入手

使用 Digital Ocean API 管理云实例

次に、アクティブなドロップレットのリストを取得しましょう。

/app/protected/models/Droplet.php で、sync メソッドは Ocean コンポーネントを呼び出し、Droplet を取得します。 リーリー Ocean

getDroplets

メソッドは次のとおりです: リーリー

注:

基本コンソール アプリケーションは、ドロップレット リストの一方向のダウンロード同期のみを行います。クラウドで削除されたドロップの削除など、さらに多くの機能を自分で実装できます。 これは、Droplet モデルの

add

関数です。ドロップレットがすでに存在する場合は、レコードを更新するだけです: <pre class="brush:php;toolbal:false;">public function add($droplet) { $d = Droplet::model()-&gt;findByAttributes(array('droplet_id'=&gt;$droplet-&gt;id)); if (empty($d)) { $d = new Droplet; } $d-&gt;user_id = Yii::app()-&gt;user-&gt;id; $d-&gt;droplet_id = $droplet-&gt;id; $d-&gt;name = $droplet-&gt;name; $d-&gt;vcpus = $droplet-&gt;vcpus; $d-&gt;memory = $droplet-&gt;memory; $d-&gt;disk = $droplet-&gt;disk; $d-&gt;status = $droplet-&gt;status; $d-&gt;active =1; $d-&gt;created_at = $d-&gt;created_at; $d-&gt;modified_at =new CDbExpression('NOW()'); $d-&gt;save(); return $d-&gt;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 作业来重复断电、快照操作。其工作原理如下:

访问图像页面,然后单击您想要克隆的快照的查看。然后,单击右侧的复制菜单选项。

使用 Digital Ocean API 管理云实例

这将创建一个 Droplet 并使用此 image_iddroplet_idend_stage 是一个常量,您可以设置它来指示要创建的重复项的数量。

使用 Digital Ocean API 管理云实例

这是 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 关闭,并请求快照。

使用 Digital Ocean API 管理云实例

这是 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,您将看到正在进行的操作:

使用 Digital Ocean API 管理云实例

如果快照成功,则返回Snapshot模型以递增阶段。当阶段复制完成后,操作完成。

您可以访问 Digital Ocean 网站的图像页面来查看复制的快照:

使用 Digital Ocean API 管理云实例

创建图像后,您可以手动删除 Droplet,或者您可以扩展代码以在 STATUS_COMPLETE 已达到。如果您不删除 Droplet,我们将向您收取费用。

请注意,目前 API 不提供将快照传输到电子邮件地址的功能,因此您需要继续通过网络界面手动执行此操作。

下一步是什么?

我希望您喜欢本教程,并发现 Digital Ocean 是您的工具和托管提供商组合中的一项有用服务。在下一个教程中,我们将探索 Digital Ocean DNS 服务。

请随时在下面发表您的问题和评论。您也可以通过 Twitter @reifman 联系我或直接给我发电子邮件。请关注我的 Tuts+ 讲师页面,查看本系列后续文章。

相关链接

  • 数字海洋 API
  • Digital Ocean V2 PHP API 库
  • 数字海洋控制台应用程序安装指南

以上がDigital Ocean API を使用してクラウド インスタンスを管理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。