EnglishPolski
Moto server - mockowanie API AWS
AWS Chmura

Moto server - mockowanie API AWS

W tym poście, chcę pokazać narzędzie krdzo mi się przydaje podczas developowania skryptów narzedziowych które opierają sie na API chmury AWS’owej.

Jako, że zajmuję sie tym bardzo często (zwłaszcza ostatnio), a nie koniecznie chcę płacić za testowanie moich skryptów, to motoserver idealnie wpisuje się w taką potrzebę.

Jeszcze nie tak dawno korzystąłem w tym celu z localstacka, ale ze względu na jego niedawną zmianę licencji, zdecydowanie straciłem przekonanie by komukolwiek polecać to narzędzie (nawet w darmowje wersji). W mojej opinii twórcy localstacka zachowali się (delikatnie mówiąc) słabo.

Disclaimer

Pamiętaj, że moto server i localstack to nie jest dokładnie taki sam rodzaj narzędzia.

Moto server służy do mockowania, a nie emulowania prawdziej infrastruktury. Z kolei localstack potrafi w pewnym stopniu symulować usługi z realnej chmury, ale jego API również jest ograniczone, a do tego duża część tych “działającyh” usług wymagała licencji.

Oczywiście istnieje możliwość symulowania niektórych serwisów innymi narzędziami niż localstack, ale nie jest to już takie proste, wymaga uruchamiania różnych kontenerów, i dość dokładnego skonfigurowania wszystkiego, by mogło ze sobą współpracować. Mnie to bardzo często nie jest potrzebne, stąd wybór padł na moto server właśnie.

Instalacja

Generalnie, moto server to tylko jedna z funkcjonalności biblioteki moto dla Pythona. Więc, żeby z niego korzystać można po prostu zainstalować samą bibliotekę:

python3 -m pip install moto

Lub jeżeli preferujesz wersje w kontenerze (tak jak ja):

docker pull motoserver/moto:latest

Od tego momenty zakładam, że moto będzie działać właśnie w kontenerze, więc taki scenariusz zamierzam tutaj opisać

Uruchomienie

Uruchamiamy kontener, otwierając port 5000, który jest domyślnym portem dla moto servera:

docker run -d --rm -p 5000:5000 --name moto motoserver/moto:latest

Jeżeli chcesz od razu po uruchomieniu widzieć logi serwera , co czasem się przydaje, to warto kontener uruchomić w trybie attached, usuwając flagę -d.

Konfiguracja

Ponieważ moto server nie jest prawdziwym serwerem AWS, to należy odpowiednio przygotować profil konfiguracyjny, żeby CLI było w stanie działać.

Ponieważ lubię ułatwiać sobie pracę na przyszłość, to stworzyłem taki profil konfiguracji w pliku ~/.aws/config:

[profile moto]
region = us-east-1
output = json
aws_access_key_id = test
aws_secret_access_key = test
endpoint_url = http://localhost:5000

Najważniejszą kwestią tutaj jest ustawienie zmiennej endpoint_url na adres odpowiadający naszemu lokalnemu serwerowi moto.

Od tego momentu, ustawiając profil moto dla AWS CLI, będzie ono operować właśnie na nim:

export AWS_PROFILE=moto
aws sts get-caller-identity

Zwróci:

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

Terraform

Do skonfigurowania Terraforma/OpenTofu musimy również ustawić odpowiedni endpoint w konfiguracji providera AWS.

provider "aws" {
  region = "us-east-1"
  endpoints {
    ec2 = "http://localhost:5000"
  }
}

Po ustawieniu endpointa, terraform będzie w stanie bez problemu połączyć się z moto serverem i zarządzać jego stanem zupełnie jakby był podłączony do prawdziwej chmury.

Nie zapomnij ustawić endpointów w konfiguracji providera, do każdego serwisu którego planujesz używać (w przykładzie tylko port ec2).

Kilka dodatków na koniec

Gorąco zachęcam do przejrzenia dokumentacji moto, a być może znajdziesz tam coś jeszcze bardziej przydatnego dla siebie :)

Link oczywiście zamieszczam na samym dole posta.

Niestandardowy port

Jeżeli nie chcesz opierać się na domyłśnym porcie moto serwera, to możesz go zmienić ustawiając zmienną środowiskową MOTO_PORT: Np.

docker run -d --rm -p 3000:3000 --name moto -e MOTO_PORT=3000 motoserver/moto:latest

Dashboard

Jeżeli otworzysz w przeglądarce:

http://localhost:5000/moto-api

Zobaczysz prosty dashboard umożliwiający przeglądanie wszystkich utworzonych na serwerze zasobów.

Szybki reset stanu

Jeżeli chcesz szybko zresetować stan serwera, wystarczy wysłać żądanie POST do endpointa /moto-api/reset:

Pamiętaj aby dostosować port w adresie, jeżeli użyłeś niestandardowego.

curl -X POST http://localhost:5000/moto-api/reset

Przydatne linki:

Back to Top