8.4 KiB
Zadania domowe
W ramach tego modułu do zdobycia jest 10 punktów. Zadania można realizować z wykorzystaniem dowolnego usługodawcy IaaS (Hetzner, Linode, AWS, Azure). Zadanie 3.1 i 3.2 można wykonać wielokrotnie dla różnych dostawców, zdobywająć kolejne punkty. Wykonanie zadania 3.2 automatycznie oznacza wykonanie zadania 3.1. Pamiętaj, że dobór odpowiedniego dostawcy chmury obliczeniowej do zadania jest częścią jego realizacji.
Uwaga: Łącznie można wykonać zadania za znacznie więcej niż dostępnych 10 punktów. Uzyskany wynik zostanie jednak obcięty do wartości maksymalnej.
Zadanie 3.1 (2 punkty)
Celem tego zadania jest przedstawienie sposobu konfiguracji podstawowej infrastruktury chmurowej obejmującej maszyny wirtualne, sieci prywatnej oraz dysków.
Zadanie polega na uruchomieniu systemu Gitea w modelu IaaS. Wymagane jest aby:
- baza danych oraz właściwy serwer Gitea uruchomione były na oddzielnych maszynach wirtualnych
- całość systemu znajdowała się w sieci prywatnej, a komunikacja pomiędzy bazą danych i serwerem odbywała się wyłącznie w ramach tej sieci
- baza danych nie była dostępna z poza sieci prywatnej
- dane z repozytoriów przechowywane były na oddzielnym zasobie dyskowym, który można relokować na inną maszynę w razie potrzeby
Wskazówka: Rekomendowane jest wykorzystanie narzędzia Docker i oficjalnych obrazów udostępnianych przez twórców Gitea.
Sposób sprawdzania zadania
Zadanie sprawdzane jest poprzez ręczną weryfikację czy system zbudowany został zgodnie ze specyfikacją. Pamiętaj aby przygotować się do prezentacji zadania.
Zadanie 3.2 (4 punkty + 2 punkty za 3.1)
Zautomatyzuj wykonanie zadania 3.1 tak aby cała infrastruktura (łącznie z zasobami chmurowymi, konfiguracją maszyn i oprogramowania) wykonywana była przez odpowiedni skrypt za pośrednictwem jednej komendy w konsoli.
Sam skrypt oraz wszystkie niezbędne pliki (np. cloud-init, pliki konfiguracyjne, itp.) powinny znajdować się na repozytorium Git.
Uwaga: Pamiętaj aby przygotować stosowną dokumentację (w formacie Markdown w pliku README.md) opisującą konfigurację środowiska wymaganą przez ten skrypt (autoryzacja do platform chmury obliczeniowej, zmienne środowiskowe, itp.). Nie powinna ona jednak być zbyt skomplikowana i wykraczać znacznie poza autoryzację do chmury.
Wskazówka: Technologia w której przygotowany zostanie skrypt nie jest ograniczona, wymagane jest tylko umożliwienie uruchomienia jej na systemie Linux (np. Ubuntu/Debian) bez potrzeby nadmiernej rekonfiguracji systemu. W przypadku potrzeby skorzystania z niestandardowych narzędzi, zalecane jest skorzystanie z narzędzia Docker, zbudowanie specjalnego obrazu i wykonanie skryptu z jego poziomu.
Sposób sprawdzania zadania
Zadanie sprawdzane jest ręcznie poprzez sklonowanie repozytorium Git, wykonanie konfiguracji zgodnie z dokumentacją, wywołanie odpowiedniego skryptu i ręczne sprawdzenie czy system został zbudowany zgodnie ze specyfikacją. Skrypt będzie wykonywany w środowisku zapewnionym i skonfigurowanym przez prowadzącego zajęcia. Przykład sposobu wykonania skryptu przez prowadzącego:
git clone git@git.wmi.amu.edu.pl:s<index>/<repo_name>.git
cd <repo_name>
./deploy.sh
Zadanie 3.3 (6 punktów)
Celem tego zadania jest przygotowanie do prowadzenia obliczeń wymagających dużej ilości zasobów obliczeniowych.
Zadanie polaga na przygotowaniu infrastruktury, która pozwoli rozwiązać pewien problem obliczeniowy w krótkim czasie poprzez wykorzystanie zasobów chmury obliczeniowej.
Dana jest następującą funkcja: $$ C_\sigma(a,b) = \sum_{i=a}^b f(i) \mod 999999937 $$
Zadanie polaga na policzeniu $C_\sigma(1, 10000)$ dla zadanej odgórnie wartości $\sigma$.
Wskazówka: Z podstawowych własności arytmetyki modularnej wiadomo, że funckja $C$ jest addytywna modulo $999999937$. Oznacza to, że jeśli $a<b<c$ to $C_\sigma(a, c) = C_\sigma(a, b) + C_\sigma(b+1, c) \mod 999999937$
Dany jest program w postaci binarnej (skompilowanej na architekturę amd64
, program działa jednowątkowo i ma minimalne wymagania pamięciowe), który liczy wartość $C_\sigma(a, b)$. Przyjmuje on 3 argumenty i wypisuje na standardowe wyjście jedną liczbę całkowitą stanowiącą wartość $C_\sigma(a,b)$.
./computeC <a> <b> <sigma>
Niestety program ten jest dość powolny (wykonanie ./computeC 1 1 1
trwa około 1 sekundy na AWS EC2 t2.micro), a otrzymana wartość $\sigma$ ważna jest tylko przez 5 minut. W tym czasie na pojedyńczym rdzeniu komputera można policzyć zaledwie około $300$ wartości. Do rozwiązania zdania potrzeba zatem przynajmniej 32 rdzeni liczących to zadanie równolegle i w skoordynowany sposób.
Uwaga: Czas działania programu computeC nie zależy od wartości parametrów wejściowych.
Uwaga: Poprawne rozwiązanie powinno korzystać z zasobów zdalnych. Przykładowo możesz utwożyć odpowiednie zasoby, a następnie wykonać uruchomić program poprzez SSH.
Uwaga: Limit 32 rdzeni wynika z ograniczeń usługodawców chmury obliczeniowej. W większości przypadków bez dodatkowej weryfikacji nie można wykorzystać więcej zasobów.
Wskazówka: Ze względu na koszty, zdecydowanie rekomendowane jest wykorzystanie wielu małych maszyn zamiast jednej dużej. Można też posiłkować się komputerami dostępnymi na WMI w celu zwiększenia mocy.
Sposób sprawdzania zadania
Zadanie sprawdzane jest automatycznie.
Należy wysłać do serwera sprawdzającego zapytanie HTTP w celu przydzielenia wartości $\sigma$.
curl -X GET https://bikol.vm.wmi.amu.edu.pl/pzc/Z3.3/<index>
Korzystając z zasobów chmurowych oraz programu
computeC
należy policzyć wartość $C_\sigma(a, b)$.Należy przesłać wyliczoną w ten sposób wartość $C_\sigma(a, b)$ na serwer sprawdzający
curl -X POST https://bikol.vm.wmi.amu.edu.pl/pzc/Z3.3/<index>/<wyliczona_wartość>
Zadanie 3.4 (3 punkty)
Zadanie ma na celu zapoznanie z narzędziem cloud-init.
Przygotuj skrypt cloud-init
, który automatycznie skonfiguruje przeglądarkową wersje VS Code na utworzonym serwerze.
Sposób sprawdzania zadania
Zadanie sprawdzane jest ręcznie poprzez utworzenie w infrastrukturze Hetzner maszyny wirtualnej CPX11, skonfigurowanie jej na bazie dostarczonego skryptu cloud-init
oraz ręczną weryfikację poprawności działania systemu. Skrypt będzie wykonywany w środowisku zapewnionym i skonfigurowanym przez prowadzącego zajęcia.