AWS Local

AWS Local


moto_server este un serviciu inclus în librăria moto care oferă o interfață HTTP pentru a simula serviciile AWS. Acesta permite rularea unui server local care emulează diferite API-uri AWS, permițând astfel aplicațiilor să se conecteze la acest server local ca și cum ar fi serviciile AWS reale.


Notă: pentru a urmari acest tutorial in mod interactiv poti lansa urmatorul sandbox: AWS Cloud


Deschide o fereastra terminal in VSCode si introdu urmatoarea comanda:

moto_server


După executarea acestei comenzi în fereastra terminalului va apărea următorul rezultat

* Running on http://127.0.0.1:5000
Press CTRL+C to quit


În primul rând, să verificăm dacă setarea noastră funcționează corect. Pentru aceasta, putem executa orice comandă disponibilă în AWS. Haideți să rulăm comanda care ne arată identitatea sub care suntem logați:
Deschide un terminal într-o fereastră nouă sau poți împărți terminalul curent (split).
În fereastra nouă, introdu următoarea comandă:

aws sts get-caller-identity


Executarea acestei comenzi ar trebui să returneze următorul mesaj:

You must specify a region. You can also configure your region bu running "aws configure".


Acest mesaj de eroare indică faptul că AWS CLI nu a fost configurat și SDK-ul nu știe care este regiunea AWS selectată sau implicită. Pentru a rezolva această problemă, putem executa comanda:

aws configure


Această comandă va solicita câteva valori pe care trebuie să le introducem. De obicei, aceste valori sunt credențiale valide, dar deoarece folosim o configurare locală cu Moto, aceste credențiale nu au impact funcțional. Din acest motiv, putem introduce orice valori pentru AWS Access Key ID și AWS Secret Access Key, așa cum se vede mai jos:

AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: us-east-1
Default output format [None]: json


Acum, să încercăm din nou să executăm comanda anterioară:

aws sts get-caller-identity


De această dată, comanda ar trebui să returneze o eroare deoarece SDK-ul nu poate contacta serverele AWS din cauza faptului că rețeaua din acest sandbox este izolată de exterior. Pentru a redirecționa această cerere către serverul Moto, trebuie să setăm valoarea AWS_ENDPOINT_URL. Această valoare controlează serverul destinație pentru cererile generate de clientul nostru AWS. Pentru a seta această valoare, avem câteva opțiuni:



1. --endpoint-url

O opțiune este să furnizăm parametrul --endpoint-url când rulăm comenzi AWS. Astfel, comanda anterioară poate fi executată în următorul mod:

aws sts get-caller-identity --endpoint-url http://127.0.0.1:5000


De data aceasta, nu ar trebui să mai avem erori și vom vedea un rezultat similar cu cel de mai jos:

{
    "UserId": "AKIAIOSFODNN7EXAMPLE",
    "Account": "1234556789012",
    "Arn": "arn:aws:sts::1234556789012:user/moto"
}


Utilizarea unui endpoint pentru aws-cli specifica URL-ul punctului de intrare pentru un serviciu web AWS. Astfel, atunci când vom executa o comandă folosind aws-cli, sau boto3 cererea va fi interceptată și procesată de serverul Moto, în loc să fie trimisă către serverele regionale sau globale AWS.
Rezultatul de mai sus indică un cont generat aleator de Moto, similar cu un număr de cont AWS, precum și un ARN (Amazon Resource Name) pentru identitatea apelantă.
Nota: În terminalul unde rulează serverul Moto, putem valida primirea unei cereri din partea AWS CLI:

127.0.0.1 - - [25/Jun/2024 17:31:47] "POST / HTTP/1.1" 200


127.0.0.1 - Aceasta este adresa IP a clientului care a făcut cererea. În acest caz, 127.0.0.1 este adresa IP de loopback, care se referă la computerul local. Indică faptul că cererea a fost făcută de pe același computer pe care rulează serverul.

[25/Jun/2024 17:31:47] - Aceasta este data și ora la care cererea a fost făcută. Formatul este [ziua/luna/anul ora:minutul:secunda].

"POST / HTTP/1.1" - Aceasta este linia de cerere HTTP, care conține trei componente:

  1. POST: Metoda HTTP folosită pentru cerere. În acest caz, este o cerere POST, care este de obicei folosită pentru a trimite date către server.
  2. /: URI-ul solicitat. În acest caz, este rădăcina serverului (/).
  3. HTTP/1.1: Versiunea protocolului HTTP folosită pentru cerere.

200 - Acesta este codul de stare HTTP returnat de server ca răspuns la cerere. Codul 200 înseamnă OK, indicând că cererea a fost procesată cu succes.

2. alias aws=...

Dacă dorim sa rulăm o altă comandă AWS putem folosi schema menționată mai sus.
De exemplu pentru a lista elementele 'S3 Buckets' putem executa următoarea comandă:

aws s3api list-buckets --endpoint-url http://127.0.0.1:5000


Executarea acestei comenzi ne returnează o lista cu 'bucket-urile' S3 disponibile la moment din perspectiva serverului moto:

{
"Buckets" : [],
"Owner" : {
    "DisplayName": "webfile",
    "ID": "bcaf11ffd86ca5f098766651dfc"
    }
}


După cum se poate observa, de fiecare dată când rulăm o comandă AWS este necesar să adăugăm parametrul --endpoint-url=.... Această procedură poate deveni incomodă dacă lucrăm frecvent cu aws-cli. Pentru a elimina necesitatea de a adăuga acest parametru de fiecare dată, putem utiliza comanda alias disponibilă în Linux:

alias aws="aws --endpoint-url=http://127.0.0.1:5000"


Această comandă creează un alias pentru comanda aws, astfel încât oricând rulăm o comandă aws, opțiunea --endpoint-url=http://127.0.0.1:5000 va fi adăugată automat. Astfel, acum putem rula comenzile fără a mai adăuga acest parametru

aws s3api list-buckets



3. AWS_ENDPOINT_URL

O altă opțiune pentru a seta valoarea pentru endpoint-ul AWS este să utilizăm o variabilă de mediu (env var) care va fi disponibilă pe toată durata sesiunii unui terminal.
Pentru aceasta, putem seta următoarea variabilă:

export AWS_ENDPOINT_URL=http://127.0.0.1:5000


Pentru a dezactiva alias-ul creat anterior și a ne asigura că aws-cli utilizează variabila de mediu setată, putem utiliza comanda

unalias aws


Haideti să rulăm încă o comandă pentru a lista funcțiile Lambda

aws lambda list-functions


Deoarece nu există funcții Lambda, vom primi următorul rezultat/output

"Functions": []


Această metodă este utilă în cazul în care lucrăm doar într-un singur terminal. Dacă deschidem un alt terminal, variabila de mediu AWS_ENDPOINT_URL nu va mai fi disponibilă. Pentru a seta această variabilă global, putem utiliza fișierul .bashrc din Linux, astfel:

nano ~/.bashrc


sau

vim ~/.bashrc


Adăugați comanda în acel fișier, salvați modificările și închideți editorul

export AWS_ENDPOINT_URL=http://127.0.0.1:5000


Pentru ca modificările să aibă efect imediat în terminalul curent, putem executa următoarea comandă

source ~/.bashrc


Sau putem deschide un alt terminal și rula orice comandă AWS - vom observa că, chiar fără a specifica valoarea pentru AWS_ENDPOINT_URL, comanda va fi corect procesată de serverul Moto


Trebuie să fii autentificat pentru a accesa editorul de cod și pentru a experimenta codul prezentat în acest tutorial.

Intră în cont