kpi

Magazín KPI

Pieskovisko — nekontrolované články

Virtuálne stroje EC2 a ich manažment

Cloud Computing uľahčil fungovanie IT systémov vo všetkých smeroch. Krátke, či dlhodobé využívanie výpočtového priestoru, ktorý nemusí záujemca ani vlastniť je v dnešnom svete bežné. Záujemca o takéto priestory si môže vyskladať takýto priestor tak, aby spĺňal jeho funkčné a výkonnostné parametre. Sprostredkovateľ mu následne vyhradí tento priestor v podobe virtuálneho stroja. V tomto článku sa budeme venovať riadeniu a manažmentu virtuálnych strojov s názvom Elastic Compute Cloud (EC2) pomocou SDK, ktoré poskytuje spoločnosť Amazon.

Aké sú možnosti manažmentu virtuálnych strojov EC2?

Pre správu a manažment svojich strojov poskytuje Amazon webové rozhranie a SDK pre viacero programovacích jazykov. My sa v tomto článku budeme venovať SDK pre jazyk PHP. Pomocou tohto SDK je možné vykonávať rôzne akcie nad používateľovými strojmi programaticky. Využitie takéhoto ovládania virtuálnych strojov môže byť napríklad také, že ak používateľ potrebuje zastaviť alebo spustiť svoje inštancie dôsledkom nejakej akcie v jeho systéme, môže to urobiť priamo v jeho systéme, a nemusí využiť webové rozhranie Amazonu.

Vykonávanie akcií pomocou SDK

Vykonávaniu akcií nad strojmi programaticky predchádza vytvorenie prístupových kľúčov:

  • Access Key
  • Secret Key

Pomocou týchto kľúčov sa vykonáva autentifikácia a autorizácia pri používaní SDK. Vytvorenie týchto kľúčov je potrebné vykonať pomocou webového rozhrania Amazonu, kde sa následne nastavia práva, ktoré tieto kľúče budú mať.

SDK poskytuje množstvo rôznych akcií, ktoré je možno vykonať nad strojom. My si ukážeme ako vykonať niektoré z nich.

Vytvorenie klienta

Pre vykonanie akcií je nutné vytvoriť EC2 klienta, pomocou ktorého sa bude uskutočnovať volanie funkcií, ktoré poskytuje SDK. Klient sa autentifikuje a autorizuje pomocou vytvorených prístupových kľúčov.

use Aws\Ec2\Ec2Client;
----
private static $client = null;

public function getClient() {

    // Vytvorenie klienta ak neexistuje
    if (!isset(self::$client)) {

        $accessKey = env('AWS_ACCESS_KEY_ID');
        $secretKey = env('AWS_SECRET_ACCESS_KEY');

        self::$client = new Ec2Client([
            'credentials' => [
                'key' => $accessKey,
                'secret' => $secretKey,
            ],
            'version' => '2016-11-15',
            'region' => 'us-east-1',
        ]);
    }

    // Vrátenie inštancie klienta
    return self::$client;
}

V tomto úseku kódu sa vytvorí klient pomocou prístupových kľúčov uložených v premenných prostredia. Rovnako je nastavený región na us-east-1 (tento región je uvedený len pre príklad, pre vykonávanie akcií nad strojmi je treba uviesť región, v ktorom sa stroj nachádza) a momentálne posledná verzia SDK, ktorou je 2016-11-15.

Získanie informácii o strojoch

Pre získanie informácií o strojoch ako sú názov, verejná IP alebo typ stroja ale aj mnoho iných sa využíva funkcia ‘describeInstances’. Nasledujúca časť kódu predstavuje ukážku takéhoto volania.

$result = $client->describeInstances([
    'DryRun' => true || false,
    'Filters' => [
        [
            'Name' => '<string>',
            'Values' => ['<string>', ...],
        ],
        // ...
    ],
    'InstanceIds' => ['<string>', ...],
    'MaxResults' => <integer>,
    'NextToken' => '<string>',
]);

Pre vyselektovanie výsledkov sa dajú využiť tieto parametre:

  • DryRun - Overí, či klient má práva pre vykonanie tejto akcie. Ak áno, požiadavka vráti výsledok typu ‘DryRunOperation’, ak nie výsledok bude ‘UnauthorizedOperation’. Skutočné vykonávanie akcie sa však neuskutoční.
  • Filters - Zadáva sa ako pole, a reprezentuje filtrovanie pomocou rôznych vlastností, medzi ktoré patrí napríklad názov, IP alebo typ stroja.
  • InstanceIds - Zadáva sa ako pole, pomocou ktorého sa selektujú stroje určitým identifikátorom.
  • MaxResults - Určuje maximálny počet vrátených záznamov.
  • NextToken - Token, ktorý určuje ďalšiu stranu výsledkov.

Žiaden z týchto parametrov nie je povinný, táto funkcia sa môže zavolať bez parametrov, a výsledkom budú informácie o všetkých používateľových strojoch.

Životný cyklus virtuálneho stroja

Stroje počas svojej existencie striedajú viacero stavov, ktoré tvoria ich životný cyklus. Prechod medzi týmito stavmi je z časti ovládaný používateľom. Znázornenie prechodu medzi stavmi je zobrazené na obrázku nižšie.

Je možné si všimnúť, že stroje, ktoré nevyužívajú ukladacie priestory typu Amazon Elastic Block Store (Amazon EBS), nemôžu byť zastavené a znova spustené v bode zastavenia.

Spustenie zastaveného stroja

Prvý stav životného cyklu stroja nastáva pri jeho spustení, kedy prejde do stavu čakania. Tento stav reprezentuje zbieranie informácií a pripravovanie hardvéru pre typ stroja, ktorý si používateľ nakonfiguroval. Pomocou definovanej Amazon Machine Image (AMI) sa stroj zavedie. Následne, keď bude stroj pripravený na používanie, prejde do stavu, ktorý označuje stroj ako spustený. V tomto stave je schopný spĺňať rolu plnohodnotného stroja.

Syntax volania funkcie:

$result = $client->startInstances([
    'DryRun' => true || false,
    'InstanceIds' => ['<string>', ...],
]);

Parametre:

  • InstanceIds - Pomocou parametra ‘InstanceIds’ sa určujú stroje, ktoré majú byť spustené pomocou ich identifikátora. Tento parameter je povinný pri volaní tejto funkcie.

Zastavenie stroja

V prípade, že stroj zlyháva pri kontrole stavu funkcií, alebo nefunguje pri spúšťaní aplikácií ako by bolo očakávané. Je možné stroj zastaviť a znova zapnúť pre pokus o vyriešenie problému. Avšak, táto funkcionalita strojov je dostupná len pokiaľ stroj používa pre root zariadenie funkciu Amazon Elastic Block Store (Amazon EBS). Ak sa vyvolá akcia k zastaveniu, stroj vojde do stavu zastavovania a následne je zastavený. Spoločnosť Amazon používateľovi neúčtuje používanie stroja, ak je zastavený. V tomto stave je možné upravovať niektoré parametre stroja, vrátane jeho typu.

Ak stroj nemal elastickú IP adresu, tak bude jeho adresa pri spustení zmenená. Ak je vyvolaná akcia k spusteniu, tak stroj vojde do čakajúceho stavu a v niektorých prípadoch sa presunie na iný hostiteľský počítač. V prípade, že s predchádzajúcim nie sú žiadne problémy, tak tento úkon nemusí byť vykonaný. Stroje, ktoré nedisponujú úložiskom typu Amazon EBS, pri zastavení a spustení stratia všetky dáta v nich uchované. V prípade, že dáta stroja nie sú uložené v externom zdroji, tak je to dosť závažný problém pre používateľa.

Stroje, ktoré sú spustené v EC2-Classic, pri tejto akcii získajú novú súkromnú IPv4 adresu, čo znamená, že elastická IP adresa, ktorá sa viaže na súkromnú IPv4 adresu, už nie je spojená s týmito strojmi. Naopak, ak inštancie sú spustené v Amazon Elastic Compute Cloud EC2-VPC, zachovávajú si svoju súkromnú IPv4 adresu. Takže elastická IP adresa ostáva priradená k takejto inštancii aj po zastavení a spustení.

Syntax volania funkcie:

$result = $client->stopInstances([
    'DryRun' => true || false,
    'Force' => true || false,
    'Hibernate' => true || false,
    'InstanceIds' => ['<string>', ...],
]);

Parametre:

  • Force - Tento parameter reprezentuje vynútené zastavenie. Pri takomto zastavení stroj nespracúva údaje vo vyrovnávacej pamäti a ani systémové metadáta.
  • Hibernate - Tento parameter je možné použiť ak bola pri vytváraní stroja povolená funkcia hibernácie.
  • InstanceIds - Pomocou parametra ‘InstanceIds’ sa určujú stroje, ktoré majú byť zastavené pomocou ich identifikátora. Tento parameter je povinný pri volaní tejto funkcie.

Reštartovanie stroja

Reštartovanie stroja je ekvivalentom k reštartovaniu operačného systému. Konfigurácia stroja zostáva rovnaká, takisto stroj ostáva na rovnakom hostiteľskom počítači. Kde nadobúda svoje verejné DNS meno, privátnu IP adresu a všetky dáta na jeho úložisku. Takýto reštart trvá aj niekoľko minút, no záleží to od konfigurácie stroja.

Syntax volania funkcie:

$result = $client->rebootInstances([
    'DryRun' => true || false,
    'InstanceIds' => ['<string>', ...],
]);

Parametre:

  • InstanceIds - Pomocou parametra ‘InstanceIds’ sa určujú stroje, ktoré majú byť reštartované pomocou ich identifikátora. Tento parameter je povinný pri volaní tejto funkcie.

Zmena IP adresy stroja

Ak ma stroj priradenú elastickú IP adresu, v prvom rade sa mu musí táto adresa odobrať. Elastická IP adresa môže byť priradená stroji EC2-Classic alebo EC2-VPC. Pre viac informácií navštívte príručku o Elastických IP adresách na stránke Amazonu.

$result = $client->disassociateAddress([
    'AssociationId' => '<string>',
    'DryRun' => true || false,
    'PublicIp' => '<string>',
])

Parametre:

  • AssociationId - Pomocou parametra ‘AssociationId’ sa definuje ID priradenia IP adresy, ktorá má byť odobraná. Tento parameter je povinný ak ide o stroj EC2-VPC.
  • PublicIP - Tento parameter reprezentuje IP adresu stroja, ktorému má byť odobraná adresa. Tento parameter je povinný ak ide o stroj EC2-Classic.

Po odstránení elastickej IP adresy je potrebné pridať novú adresu z množiny nepoužitých. Nepoužité elastické IP adresy si používateľ môže vyselektovať pomocou nasledujúcej funkcie.

$result = $client->describeAddresses([
    'AllocationIds' => ['<string>', ...],
    'DryRun' => true || false,
    'Filters' => [
        [
            'Name' => '<string>',
            'Values' => ['<string>', ...],
        ],
        // ...
    ],
    'PublicIps' => ['<string>', ...],
]);

Parametre:

  • AllocationIds - Pomocou parametra ‘AllocationIds’ sa definuje ID umiestnenia IP adresy. Tento parameter sa dá použiť len ak ide o stroj EC2-VPC
  • Filters - Tento parameter je možné použiť pre vyselektovanie výsledkov pomocou rôznych informácií.
  • PublicIps - Týmto parametrom sa určujú konkrétne adresy, ktorých informácie používateľ potrebuje.

Pre priradenie Elastickej IP adresy k stroju je potrebný identifikátor umiestnenia IP adresy pokiaľ ide o EC2-VPC, alebo samutnú požadovanú IP adresu ak ide o EC2-Classic. Pre priradenie sa používa nasledujúca funkcia.

$result = $client->associateAddress([
    'AllocationId' => '<string>',
    'AllowReassociation' => true || false,
    'DryRun' => true || false,
    'InstanceId' => '<string>',
    'NetworkInterfaceId' => '<string>',
    'PrivateIpAddress' => '<string>',
    'PublicIp' => '<string>',
]);

Parametre:

  • AllocationIds - Pomocou parametra ‘AllocationIds’ sa definuje ID umiestnenia IP adresy. Tento parameter sa použije len ak ide o stroj EC2-VPC
  • AllowReassociation - Ak stroj už používa danú adresu, tak sa adresa odpojí a znova pripojí.
  • InstanceId - Identifikátor stroja, ktorému sa IP adresa má pripojiť.
  • NetworkInterfaceId - Ak sa stroj nachádza vo viacero sieťach, je potrebné špecifikovať, o ktorú sieť sa jedná.
  • PrivateIpAddress - Určuje primárnu alebo sekundárnu privátnu IP adresu pre priradenie spolu s Elastickou IP adresou. Ak nie je privátna IP adresa definovaná, tak Elastická IP adresa je priradená v spolu s primárnou privátnou IP adresou.
  • PublicIp - Reprezentuje IP adresu, ktorá má byť priradená. Používa sa len ak ide o stroj EC2-Classic.

Záver

Využívanie SDK pre manažment virtuálnych strojov je vhodné pre automatizáciu niektorých procesov. Napríklad ak používateľ nepotrebuje mať svoje stroje zapnuté počas noci alebo cez víkendy, môže si napísať vlastný systém pre automatické vypínanie a zapínanie svojich strojov v danom čase. Takisto, ak systém, ktorý funguje na strojoch EC2 môže z určitých dôvodov potrebovať zmenu IP adresy (napríklad pre zaradenie jeho IP adresy do verejného čierneho zoznamu adries), môže využiť odobratie starej a priradenie novej IP adresy.