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.
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