De Digital Ocean API gebruiken om cloud-instanties te beheren

Wat je gaat creëren

Wat is Digital Ocean?

Digital Ocean is een van de snelstgroeiende webhosts, deels vanwege de snelle SSD-gebaseerde servers en de goedkope hostingpakketten van $ 5 per maand. Het snel, gemakkelijk en betaalbaar spinnen van voorbeelden op Digital Ocean voor testen of langdurig gebruik. 

Bij het bouwen van een app-afbeelding om te verkopen bij Digital Ocean, heb ik je uitgelegd hoe je een WordPress- (of andere app) -instance kunt starten en deze herhaaldelijk kunt klonen voor clients. In deze zelfstudie ga ik u helpen met het gebruiken van de Digital Ocean API om onze instanties, ook wel druppels genoemd, programmatisch te beheren en algemene taken te automatiseren. Ik zal ook een voorbeeldcodebase aanbieden voor het uitvoeren van zeer eenvoudige API-bewerkingen die zijn geschreven in het Yii Framework voor PHP; je kunt de code hier op Github krijgen.

De Digital Ocean API

Met de Digital Ocean API kunt u Droplets en bronnen op een eenvoudige, programmatische manier beheren met behulp van HTTP-aanvragen. Alle functionaliteit die u kent in het configuratiescherm van Digital Ocean is ook beschikbaar via de API, zodat u de complexe acties die in uw situatie nodig zijn, kunt uitvoeren.

Voor deze zelfstudie integreren we de Digital Ocean V2 PHP API-bibliotheek van ontwikkelaar Antoine Corcy in een Yii-gebaseerde consoletoepassing. U hoeft geen kennis van Yii te hebben om de toepassing te gebruiken, maar u kunt hier meer informatie over krijgen: Inleiding tot het Yii Framework.

De Digital Ocean API verifieert uw account via OAuth en bestaat uit bijna een dozijn gebieden op hoog niveau:

  • accounts: biedt basisinformatie over uw Digital Ocean-account.
  • acties: een historisch logboek met acties voor de druppels in uw account.
  • Domains & Domain Records: hiermee kunt u de domeinen beheren die worden gebruikt op de druppeltjes in uw account, evenals de DNS-records die eraan zijn gekoppeld.
  • Druppels en druppelacties: hiermee kunt u maken, afsluiten, opnieuw opstarten, snapshot en meer voor uw druppels.
  • Afbeeldingen en afbeeldingen: hiermee kunt u de snapshotafbeeldingen die u van druppeltjes in uw account hebt opgenomen, opsommen en beheren. 
  • SSH-sleutels: hiermee kunt u een SSH-sleutel registreren om te installeren bij het maken van een druppel, zodat wachtwoordbeveiliging niet vereist is.
  • Regio's: geeft een opsomming van de geografische regio's waar binnen Digital Ocean-druppeltjes kunnen worden aangemaakt.
  • maten: geeft een opsomming van de druppelformaten die u kunt gebruiken bij het maken van druppeltjes.

Nu dat je een beetje weet over de API, laten we duiken met onze eigen applicatie.

Toegangstoetsen instellen

Als u de API wilt gebruiken, moet u persoonlijke toegangstokens voor uw account activeren. Meld u aan bij uw account en ga naar de instellingenpagina van de instellingen: https://cloud.digitalocean.com/settings/applications. Klik Genereer nieuwe token, zoals hieronder getoond:

Noteer uw toegangstoken hieronder - Digital Ocean zal dit slechts eenmaal laten zien:

Laten we nu verder gaan met onze voorbeeldconsoletoepassing.

Onze console-applicatie

In deze zelfstudie gaan we een kleine consoletoepassing bekijken die ik heb gemaakt en die een aantal taken uitvoert met betrekking tot het beheren van druppels. U kunt de applicatie zelf installeren vanuit de Tuts + GitHub-repository en deze aanpassen of uitbreiden om extra API-functies te implementeren die u wenst. Ik heb een gedetailleerde installatiehandleiding voor de consoletoepassing op mijn website geplaatst. U kunt ook mijn generieke installatiehandleiding voor Digital Ocean-apps verkennen.

API-toegang configureren

Nogmaals, we gebruiken Antoine Corcy's Digital Ocean V2 PHP API-bibliotheek voor toegang tot de API. 

We hebben een component genaamd Ocean.php gebouwd, die als een model fungeert voor het gebruik van zijn bibliotheek. Het is bij /app/protected/components/Ocean.php.

Yii laadt uw toegangstoken vanaf het Ocean.ini-bestand, beschreven in de Installatiehandleiding van de Digital Ocean Console-toepassing en geeft een digitalOcean API-object.

adapter = nieuwe BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // maak een digitaal oceaanobject met de vorige adapter $ this-> digitalOcean = new DigitalOceanV2 ($ this-> adapter); 

Droplets ophalen

Laten we nu een lijst met onze actieve druppels ophalen. In /app/protected/models/Droplet.php, onze synchroniseren methode roept de oceaancomponenten op en krijgt de druppels:

 sync met openbare functies () $ ocean = new Ocean (); $ droplets = $ ocean-> getDroplets (); foreach ($ droplets als $ d) $ droplet_id = $ this-> add ($ d);  

Dit is wat de oceaan is getDroplets methode ziet eruit als: 

 openbare functie getDroplets () // retourneer de actie api $ action = $ this-> digitalOcean-> droplet (); // stuur een verzameling Action entity $ actions = $ action-> getAll () terug; return $ acties;  

Notitie: de basisconsoletoepassing doet gewoon een one-way download-synchronisatie van onze druppelvermeldingen. U zou zelf meer functies kunnen implementeren, inclusief het verwijderen van druppeltjes die in de cloud zijn verwijderd.

Dit zijn onze Droplet-modellen toevoegen functie. Als de druppel al bestaat, werken we de record bij:

public function add ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); if (leeg ($ d)) $ d = nieuw Droplet;  $ d-> user_id = Yii :: app () -> gebruiker-> id; $ d-> droplet_id = $ droplet-> id; $ d-> naam = $ droplet-> naam; $ d-> vcpus = $ droplet-> vcpus; $ d-> geheugen = $ droplet-> geheugen; $ d-> disk = $ droplet-> disk; $ d-> status = $ droplet-> status; $ d-> actief = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = nieuwe CDbExpression ('NU ()'); $ D-> save (); return $ d-> id; 

Als u de functies van het model wilt uitbreiden, biedt Digital Ocean een breed scala aan Droplet API-acties en Corcy heeft hier een lijst met duidelijke voorbeelden.

Afbeeldingen ophalen

Vervolgens gebruiken we de API om een ​​lijst met onze huidige afbeeldingen op te halen. Afbeeldingen zijn snapshots, voornamelijk back-ups, gemaakt van een serverinstantie op een bepaald tijdstip.

Ons Snapshot.php-model heeft een synchroniseren bewerking die een lijst met uw afbeeldingen aanvraagt ​​en deze afzonderlijk aan de database toevoegt:

 sync met openbare functies () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ snapshots als $ i) $ image_id = $ this-> add ($ i); if ($ image_id! == false) echo $ image_id; lb (); pp ($ i);  

Dit is de oceaancomponent getSnapshots code:

 openbare functie getSnapshots () // stuur actie terug api $ action = $ this-> digitalOcean-> image (); // stuur een verzameling Action entity $ actions = $ action-> getAll () terug; return $ acties;  

Dit is het momentopnamemodel toevoegen code - we negeren de afbeeldingen van digitale afbeeldingen van Digital Ocean die als publiek worden onderscheiden:

 public function add ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('image_id' => $ snapshot-> id)); if (empty ($ i)) $ i = nieuwe Snapshot; $ i-> created_at = nieuwe CDbExpression ('NU ()');  if (isset ($ snapshot-> public) en $ snapshot-> public == 1) return false; // geen behoefte om openbare afbeeldingen nu te bewaren else $ i-> user_id = Yii :: app () -> gebruiker-> id; $ i-> image_id = $ snapshot-> id; $ i-> naam = $ snapshot-> naam; $ i-> region = $ snapshot-> regions [0]; $ i-> actief = 1; $ i-> modified_at = nieuwe CDbExpression ('NU ()'); $ I-> save (); return $ i-> id;  

Snapshots automatiseren

Zoals we hebben besproken bij het bouwen van een app-afbeelding om opnieuw te verkopen bij Digital Ocean, is het handig om het maken van snapshots te automatiseren die u kunt overdragen aan klanten en klanten. Helaas is er momenteel geen manier om een ​​afbeelding door verwijzing te klonen of over te dragen; elke keer dat u een snapshot naar een ander account overdraagt, is het verdwenen.

Omdat Digital Ocean vereist dat u een afbeelding instantiseert als een druppel en deze uitschakelt voordat u een nieuwe momentopname maakt, is het een tijdrovend handmatig proces om herhaaldelijk snapshots te maken. Het helpt niet dat Digital Ocean na het maken van momentopnamen weer druppels gebruikt, dit vertraagt ​​het proces gewoon.

Omdat de API geen aanvragen accepteert terwijl andere bewerkingen in behandeling zijn, moeten we een tabel bouwen om achtergrondacties te volgen en een cron-taak gebruiken om de uitschakeling en de momentopname te herhalen. Dit is hoe het werkt:

Bezoek de Afbeeldingen pagina en klik Uitzicht voor de momentopname die u wilt klonen. Klik vervolgens op de kopiëren menu-optie aan de rechterkant. 

Hiermee maakt u een druppel en voegt u hiermee een item toe aan de actietabel Achtergrond image_id en droplet_id. De eindstadium is een constante die u kunt instellen om het aantal te maken duplicaten aan te geven.

Dit is het model van de Snapshot repliceren () methode:

 replicatie van publieke functie ($ id) // lookup image_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // maak de druppel $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> name, $ snapshot-> region, $ snapshot-> image_id); // opdracht toevoegen aan actietabel met droplet_id en image_id $ a = nieuwe actie (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = Action :: ACTION_SNAPSHOT; $ a-> status = Actie :: STATUS_ACTIVE; $ a-> stage = 0; // door gebruiker in te stellen constante voor aantal replicaties om $ a-> end_stage = momentopname :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = nieuwe CDbExpression ('NU ()'); $ a-> created_at = nieuwe CDbExpression ('NU ()'); $ A-> save (); 

De cron-taak pingt http://ocean.yourdomain.com/daemon/index om de actietabel regelmatig te verwerken. Voor alle onvoltooide items die nog niet zijn voltooid, wordt een nieuwe momentopname aangevraagd.

Dit zijn de actiemodellen werkwijze() methode:

 public function-proces () set_time_limit (0); // zoek naar achterstallige acties $ todo = Actie: model () -> achterstallige () -> findAllByAttributes (array ('status' => self :: STATUS_ACTIEF)); foreach ($ todo als $ item) if ($ item-> action == self :: ACTION_SNAPSHOT) $ result = Snapshot :: model () -> take ($ item-> id); 

Het snapshotproces schakelt de druppel uit, pauzeert 20 seconden om te wachten tot de druppel wordt afgesloten en vraagt ​​om een ​​momentopname.

Dit is het model van de Snapshot nemen() methode:

 openbare functie take ($ action_id) $ result = false; $ a = Actie :: model () -> findByPk ($ action_id); $ snapshot = Snapshot :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = new Ocean (); // poging tot afsluiten // take snapshot $ result = $ ocean-> snapshot ($ a-> stage, $ a-> droplet_id, $ snapshot-> name, $ snapshot-> region, $ snapshot-> image_id); // als momentopname succesvol was als ($ resultaat) // stap een stap $ a-> fase + = 1; // als laatste snapshotreplicatie voltooid is, beëindigt u actie als ($ a-> stage> = $ a-> end_stage) $ a-> status = Action :: STATUS_COMPLETE;  // in beide richtingen, update last_checked $ a-> last_checked = time (); $ A-> save (); return $ resultaat; 

Hier is de code in de Ocean-component voor het daadwerkelijk maken van de API-aanroepen:

momentopname van openbare functie ($ stage, $ droplet_id, $ name, $ region, $ image_id, $ start = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ name = str_replace ("_", "-", $ naam); $ droplet = $ this-> digitalOcean-> droplet (); probeer echo 'Afsluiten'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id);  catch (Uitzondering $ e) $ err = $ e-> getMessage (); echo 'Incught exception:', $ e-> getMessage (), "\ n"; if (stristr ($ err, 'already powered off') === false) return false; else $ no_sleep = true;  if (! $ no_sleep) echo 'Slaap 20 seconden voor uitschakelen ...'; lb (); slaap (20);  echo 'Maak een snapshot van'. $ droplet_id. ' met de naam '. $ name .'- copy -'. $ stage; lb (); probeer $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name .'- copy - '. $ stage);  catch (Uitzondering $ e) echo 'Incught exception:', $ e-> getMessage (), "\ n"; return false;  // shutdown en snapshot succesvol return true; 

Als u de website van Digital Ocean bezoekt om de druppel te bekijken, ziet u de actie die wordt uitgevoerd:

Als de snapshot succesvol is, keert deze terug naar het Snapshot-model om de stage te verhogen. Wanneer het aantal fase-replicaties is voltooid, is de actie voltooid.

Je kunt het Afbeeldingen pagina op de website van Digital Ocean om uw gerepliceerde snapshots te bekijken:

Nadat de afbeeldingen zijn gemaakt, kunt u de druppel handmatig verwijderen of kunt u de code verlengen om dit te doen wanneer STATUS_COMPLETE is bereikt. Als u de druppel niet verwijdert, worden er kosten in rekening gebracht.

Houd er rekening mee dat de API op dit moment niet de mogelijkheid biedt om een ​​momentopname naar een e-mailadres over te brengen, dus u moet dit handmatig blijven doen via de webinterface.

Wat is het volgende?

Ik hoop dat je deze tutorial leuk vond en dat Digital Ocean een nuttige service is in je portfolio met tools en hostingproviders. In de volgende tutorial zullen we de Digital Ocean DNS-service verkennen.

Aarzel niet om uw vragen en opmerkingen hieronder te plaatsen. Je kunt me ook bereiken via Twitter @reifman of mij rechtstreeks een e-mail sturen. Volg mijn Tuts + instructeurspagina om toekomstige artikelen in deze serie te bekijken.

Gerelateerde Links

  • De Digital Ocean API
  • Digital Ocean V2 PHP API-bibliotheek
  • Installatiehandleiding Digital Ocean Console-toepassing