Amazon Web Services (AWS)
Last updated
Last updated
Amazon Web Services este unul dintre ce mai mari furnizori de servicii în Cloud, care însumează acum peste 200 de servicii.
Unul dintre cele mai utilizate servicii este EC2 (Elastic Compute Cloud) care pune la dispoziție mașini virtuale. Scopul nostru este de a porni o astfel de masină virtuală, a ne conecta la ea și a face disponibilă aplicația creată în pașii anteriori către internet.
Primul pas este reprezentat de crearea unui cont de AWS: https://signin.aws.amazon.com/
Instanța EC2 (Elastic Compute Cloud) pe AWS este o mașină virtuală scalabilă și configurabilă pe care o putem lansa în cloud-ul Amazon Web Services pentru a rula aplicații și servicii.
După autentificare, mergem la secțiunea search și căutăm EC2.
Ulterior, o să alegem să creăm o nouă instanță, apăsând butonul 'Launch Instance'.
Este foarte important să aveți grijă în ce zonă geografică vă creați instanța, deoarece dacă o să o schimbați vreodată din greșeală, nu o să vă mai puteți vedea instanțele până câ o să vă întoarceți la zona inițială.
Ulterior, trebuie să trecem printr-o serie de pași:
Alegem un nume
Alegem o masină virtuală Ubuntu
La tipul de instanță, o să îl lăsăm pe care care vine default și care este gratuit (t3.micro)
Să alegem o cheie SSH existentă sau generarea unei chei noi și salvarea acesteia într-un loc dedicat pe computer
Permiterea traficului HTTPS
În cazul în care dorim să alegem un alt tip de instanță, în afară de t3.micro, AWS vă va taxa taxa atâta timp cât instanța este pornită și rulează.
După crearea instanței, ar trebui să putem vedea următorul mesaj:
Atunci când creăm o nouă instanță pe care o să o tot oprim și să o pornim la loc, IP-ul instanței o să se tot schimbe.
Putem preveni acest lucru prin crearea unui IP care să nu se schimbe (Elastic IP).
Elastic IP-ul poate genera costuri suplimentare.
Mergem înapoi la secțiunea search și căutăm elastic IP.
Apăsăm pe butonul 'Allocate Elastic IP address' (lăsăm configurările default și apăsăm Allocate).
După crearea elastic IP-ului, urmează etapa în care trebuie să asociem acest elastic IP insanței pe care abia am creat-o. Apăsăm pe ip-ul creat, apoi pe butonul Allocate Elastic IP Address.
Deschidem un terminal de Git și navigăm până la locul unde am salvat cheia SSH.
Comandă conenctare SSH:
Pentru că este prima dată când ne conectăm, cel mai probabil o să fim întrebați dacă sigur dorim să continuăm conectarea, deoarece cheia este necunoscută.
Rulăm pe rând următoarele comenzi:
Nginx este un server web de performanță ridicată și proxy invers, folosit pentru gestionarea traficului web și pentru servirea conținutului static și dinamic.
Rulăm pe rând următoarele comenzi:
Acum, accesăm serverul la adresa IP pe care am generat-o anterior, și ar trebui să observăm un mesaj de bun venit.
Rulăm prima comandă pentru a accesa fisierul de configurare nginx:
Ștergem tot conținutul fișierului (CTRL + K de mai multe ori) și îl înlocuim cu următorul cod:
Apăsăm CTRL + S ca să salvăm fișierul și CTRL + X ca să ieșim din fișier.
Penrtru a reînărca fișierul de configurare nginx, o să îi dăm reload:
Astfel vom indica faptul că ne dorim ca serverul nostru să afișeze aplicația care va rula pe portul 3000.
Dacă o să încercăm să mergem acum din nou la adresa IP, o să primi eroarea 502, dar urmează să o fixăm imediat.
Instrucțiunile detaliate pentru instalarea Docker pe o instanță EC2 cu Ubuntu 22.04, le puteți găsi și aici: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04
Pentru a fi siguri că nu uitam o comandă, le voi lista și în această documentație.
Rulăm pe rând următoarele comenzi:
Dacă totul a fost în regulă, ar trebui să putem vedea următorul mesaj în consolă:
CTRL + C ca să ieșim.
Înainte de a asigura acces sudo pentru comenzile docker, va trebui să adaugăm o parolă pentru userul ubuntu (creat de AWS la pornirea instanței EC2).
Rulăm pe rând următoarele comenzi:
Salvați parola într-un fișier local pe calculator, sau în fișierul de .env
Acum, trebuie să ne întoarcem la utilizatorul ubuntu, folosind comanda:
Acum putem asigura acces sudo pentru comenzile docker:
Urmază pasul în care introducem parola, după care putem folosi comanda docker pentru utilizatorul ubuntu, fără să mai folosim sudo.
Putem testa acest lucru, folosind comanda:
Modificăm fișierul next.config.js pentru a indica faptul că pregătim proiectul pentru a fi trimis în producție. Inserăm linia output: "standalone".
Urmează pasul în care o să creăm un fișier Dockerfile în root-ul proiectului și o să dăm copy paste la codul de mai jos, luat de pe documentația oficială Vercel.
Urmează să creăm și un fișier de .dockerignore în root-ul proiectului, astfel încât să poată ignora anumite fișiere. Denumire fișierului trebuie să fie exactă, și anume .dockerignore.
La sfărșit, urcăm totul pe GitHub.
Înapoi în consola instanței EC2 configurate, o să aducem proiectul NextJS cu ajutorul Git. Pentru aceasta, avem nevoie de link-ul de clonare al repository-ului nostru, pe care îl vom lua de pe GitHub, exact ca la început când ne-am clonat repository-ul local.
Ne întoarcem pe consola de la AWS, și tastăm următoarea comandă:
După clonare, putem folosi comanda ls pentru a vedea toate directoarele și pentru a observa dacă repository-ul s-a clonat cu succes sau nu.
Ca și următori pași, urmează să ne mutăm în cadrul directorului abia clonat, și să ne creăm fișierul cu chei de environment.
Pentru crearea unui nou fișier, o să folosim comanda touch:
Pentru editarea fișierului, o să folosim comanda nano, și o să copiem conținutul fișierului .env pe care îl avem local în proiectul nostru:
Pentru salvarea fișierului, o să folosim CTRL + X, Y și ENTER.
Pentru a face build aplicației și pentru a muta tot codul într-o imagine de Docker, o să folosim următoarea comandă:
Pentru a testa că totul a funcționat, o să rulăm următoarea comandă
Pentru crearea unui container pe baza imaginii, o să folosim următoarea comandă:
Prin rularea acesti comenzi, ne asigurăm de faptul că de fiecare dată când instanța noastră este repornită, containerul o să pornească și el.
La sfârșit, putem să accesăm adresa IP (Elastic IP-ul) și să ne asigurăm de faptul că totul funcționează.
Să presupunem că am dorit să mai actualizăm sau să urcăm ceva nou pe GitHub, dar codul pe instanță nu s-a actualizat.
În acest caz, ar trebui să intervenim ori cu un pipeline care să facă totul singur și automat, fie să actualizăm noi codul manual, conectându-ne la instanță SSH.
O să mergem pe a doua variantă, și o să actualizăm codul manual.
Să presupun că la formularul de creare a unui nou record, vrem să adăugăm și un titlu.
Noua variantă a fișierului RecordForm.jsx:
Următorul pas, este reprezentat de actualizarea codului pe GitHub. (git add ., git commit, git push)
După ce am actualizat codul, ne mutăm iar în cadrul terminalului prin care suntem conectați la instanță, ne asigurăm că suntem încă în folderul unde s-a clonat proiectul, și actualizăm și acolo codul cu următoarea comandă:
Ca să putem să actualizăm codul, trebuie să ne asigurăm că ștergem imaginea și containerul create la pasul anterior, și să le creăm din nou.
Prima dată, trebuie să oprim containerul de docker care rulează. Pentru a verifica ce containere avem, o să folosim comanda:
Copiem id-ul container-ului de docker, și rulăm următoarea comandă:
Continuăm cu ștergerea container-ului:
Ulterior, verificăm lista de imagini:
Mai departe, luăm id-ul și folosim următoarea comandă pentru a o șterge:
Acum, suntem gata să dăm iar build la aplicație și să îi spunem docker-ului să repornească singur de fiecare dată când instanța repornește și ea.
Accesăm iar adresa IP, și o să putem să vedem modificările:
Ne deplasăm la secțiunea dedicată instanțelor EC2, și o alegem pe aceea pe care ne dorim să o oprim, și o accesăm.
După ce am selectat-o, mutăm cursorul la secțiunea Instance state -> Stop instance.
Aveți foarte mare grijă să nu apăsați pe Terminate Instance, deoarece nu o să mai puteți să reporniți insanța niciodată.
Este recomandat să folosim acea acțiune, doar atunci când dorim să renunțăm la respectiva instanță.
Aflându-ne tot pe pagina cu instanța pe care dorim să o pornim, mergem cu cursorul pe Instance state -> Start instance.
Dacă am urmat pașii de la partea de Docker, containerul care conține build-ul codului ar trebui să repornească automat și să își păstreze IP-ul, datorită Elastic IP-ului.