Adatbázis hozzáférés 3. rész - Kapcsolódás a felhőhöz

Attila | 2022. 02. 26. 17:40 | Olvasási idő: 4 perc

Címkék: #Adatbázis (Database) #Azure #Cloud #Laravel #Laravel 8 #MySQL #Publikálás (Deployment)

Egy igazi különlegességgel készültem nektek! Ebben a bejegyzésben felköltöztetjük az adatbázisunkat a felhőbe, méghozzá a Microsoft Azure adatbázis szolgáltatását fogjuk használni. Korábbi bejegyzésekben lokálisan kapcsolódtunk a MySQL, SQLite, Microsoft SQL Server-hez. Most az Azure-ben az ún. "flexible-server"-t fogjuk használni, ami egy MySQL-alapú kiszolgáló. Minden, amit csinálni fogunk, ingyenes szolgáltatás, úgyhogy ez ne ijesszen el senkit a felhő használatától.
Azure-Mysql-DB-Connect

Maradunk a már jól bevált laravel-blog alkalmazásunknál és ezt próbáljuk úgy átalakítani, illetve a felhőben előkészíteni neki a helyet, hogy ténylegesen az Azure-höz kapcsolódva működjön. Mindehhez persze szükségünk van egy Azure hozzáférésre, amelyet egy regisztráció után mindenki meg tud szerezni. A regisztráció során szükség van a bankkártya adatainkra is, de megijedni ettől nem kell, mert az első hónap ingyenes minden szolgáltatás és kapunk 200 $ értékű (jelenleg ~180 EUR) kreditet, amit az első hónapban szabadon felhasználhatunk és a későbbiekben is vannak olyan szolgáltatások, amelyeket ingyenesen vehetünk igénybe (a mi általunk használtak pont ilyenek lesznek), illetve a fizetős szolgáltatásokért úgy fizetünk, hogy a tényleges használatot kell csak megtéríteni majd, ha valakinek megtetszenek az Azure további szolgáltatásai.

De most már vágjunk is bele! Elmondható általánosságban, hogy az Azure-t többféle módon is elérhetjük, akár weben keresztül, akár ún. CLI-n keresztül, vagyis parancssoros utasítások segítségével, de a későbbiekben majd SSH-n keresztül is becsatlakozunk rá, shell script-eket is írhatunk... aki persze most megijedne, az ne tegye, mert mindent nagyon részletesen igyekszem elmagyarázni.

Resource Group

Először egy Resource group-ra lesz szükségünk. Ebbe "pakolhatjuk" azokat a szolgáltatásokat, amiket majd használni szeretnénk. A Resource Group-ot hozzuk létre weben és akkor többféle "módszerrel" ismerkedünk közben. Az Azure portálon mindent tudunk vezérelni, itt érhető el: https://portal.azure.com/ A Resource Group-okat nagyon könnyen elérhetjük, használhatjuk például a weboldal tetején lévő keresőt is, de kinyithatjuk a bal felső sarokban lévő navigációs menüt ("hamburger ikon"), ahol az első menüpontok között ott van a "Resource groups" (itt a menü egy részlet és alul a nekünk kellő menüpont).

A menüpont megnyitása után kapunk egy listát a Resource Group-okról. Mivel még nem volt ilyenünk, ezért kattintsunk a Create gombra. Ki kell választani az előfizetésünket (subscription), a Resource Group nevét, én a GA_RG nevet adtam neki és a régiót (region), ahol minél közelebbit érdemes választani, hogy a későbbiekben a válaszidőkkel ne legyen gond, talán a (Europe) Germany West Central van a legközelebb hozzánk, így én azt választottam.

Azure Cloud Shell

Amire továbbá szükségünk van, az egy Azure Cloud Shell (Bash), szerencsére ezt külön telepítenünk nem kell, mert böngészőből elérhető (jobb felül lévő menüben, sárgával kiemeltem):

A kattintás után a böngészőnk alsó felében elkezd betöltődni a Shell.

Adjuk ki a következő parancsot:

az mysql flexible-server create --resource-group GA_RG

Megjegyzés: az utasításokban sárga háttérrel kiemeltem, amiket le kell cserélni mindenkinek a saját paramétereire.

Általában ezekről a parancsokról elmondható, hogy "az"-vel kezdődnek, ez utal az Azure-ra, utána magát a szolgáltatást kell azonosítani, majd kapcsolók segítségével kell felparaméterezni a szolgáltatásokat (a kapcsolók -- jellel kezdődnek), utána pedig ezen kapcsolók értékeinek beállítása következik. Ezek az értékek az én rendszeremre illeszkednek, de mindenkinek a saját rendszerét kell így beállítani, például az itt létrehozott szerver neve biztosan más "azonosító számot" kapott a nevébe másoknál.

Mindig figyeljük és próbáljuk értelmezni azokat a válaszokat, amelyek JSON formátumban, kulcs-érték párként érkeznek vissza. Ezek többsége nem feltétlenül érthető, de kezdetben például a username, name, password stb. értékeket érthetjük és mentsük is el őket akár egy külön dokumentumba.

A rendszer itt rögtön ellenőrzi, hogy a GA_RG nevű Resource group-om létezik-e, szerencsére érzékeli, hogy igen. Ezután megkérdezi, hogy szeretnék-e hozzáférést adni annak az IP címnek, ahonnan éppen be vagyok jelentkezve és menedzselem az Azure-t. Erre természetesen igennel (y-nal) kell válaszolni. Próbáltam úgy is, hogy már az utasításban hozzáadtam a --public-access paraméternek a korábban lekérdezett publikus IP címemet, de úgy nem működött, mert más IP címet érzékelt a Shell, úgyhogy így megoldottam azt a problémát, hogy engedtem neki, hogy rákérdezzen az IP címem engedélyezésére.

A parancs kiadása után, azért hosszabban tevékenykedett a rendszer, viszont szerencsére sikeresen végigfutott a flexible-server létrehozása, amit akár az Azure Portál segítségével is tudunk ellenőrizni, ha rákeresünk az "Azure Database for MySQL flexible servers" szövegre fenn (de amúgy a portál főoldalán is megjelenik már az erőforrások felsorolása között):

Az Azure portál segítségével tudjuk menedzselni ezt a létrejövő szerverünket, de továbbra is fogunk használni CLI utasításokat hozzá és a portált többnyire a beállítások megváltozásának ellenőrzésére használjuk.

Szerver tűzfal

Következhet a szerver tűzfalának beállítása, hogy engedje kapcsolódni a Laravel-es alkalmazásunkat hozzá.

az mysql flexible-server firewall-rule create --rule-name allanyAzureIPs --name server197968907 --resource-group GA_RG --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

Adjunk nevet a szabálynak, a name attribútumnak az előbb létrehozott szerverünket kell beírni, a resource group ugyanaz mint korábban, a start és end IP pedig azt szabályozza, hogy engedünk mindenféle Azure szolgáltatást hozzáférni majd. További paraméterek eszerint állíthatók be: https://docs.microsoft.com/en-us/cli/azure/mysql/flexible-server/firewall-rule?view=azure-cli-latest

Csatlakozás a szerverhez MySQL Console segítségével

Ha nincs a mysql.exe hozzáadva a környezeti változókhoz, akkor érdemes elnavigálni erre a helyre: c:\xampp\mysql\bin és kiadni a következő utasítást (a -u után az én felhasználónevem van, a -h után pedig az én szerverem neve van, így ezeket módosítani kell, de a többi marad):

mysql -u bossysausage3 -h server197968907.mysql.database.azure.com -P 3306 -p

De sajnos hibát adott:

ERROR 2002 (HY000): Can't connect to MySQL server on 'server197968907.mysql.database.azure.com' (10060)

Emiatt a saját IP címemet is hozzá kellett adni a tűzfal szabályhoz, így (könnyen lekérdezhetjük a saját IP címünket, ha a Google keresőjébe beírjuk ezeket: "get my ip" és rögtön adja is a választ, utána pedig jöhet a következő parancs):

az mysql flexible-server firewall-rule create --resource-group GA_RG --name server197968907 --rule-name allowip --start-ip-address 176.63.24.179

Majd megpróbáltam ismét csatlakozni a kiszolgálóhoz (Tipp: ha nem tudnánk, mert nem mentettük ki a felhasználónevünket és jelszavunkat a parancsok lefutásának eredményéül kapott JSON-ökből, akkor használjuk a webes felületet a MySQL szerverbeállításainál az Azure portálon. Itt látható alább a kép, amin a login name-em látható, felül pedig van egy "Reset password" menüpont, amivel megváltoztathatjuk a jelszavunkat.)

image

Újracsatlakozás a kiszolgálóhoz:

mysql -u bossysausage3 -h server197968907.mysql.database.azure.com -P 3306 -p

... de hibát adott még így is:

ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

A megoldása az Azure Portálon keresztül:

Válasszuk ki a szerverünket, majd a bal oldali menüben a "Server parameters"-t. Majd a jobb oldali keresőben a "require_secure_transport" paramétert OFF-ra kell állítani és utána felül el kell menteni. Ha ez a beállítás érvényre jut, akkor utána már működik a csatlakozás. Egy SQL paranccsal ellenőrizhetjük a MySQL Console segítségével, hogy ténylegesen működik a hozzáférés az Azure adatbázisszerverhez:

SHOW databases;

Ez kilistázza a szerveren lévő adatbázisokat:

Hozzuk létre az adatbázist, amit lokálisan is már megtettünk korábban MySQL esetében:

CREATE DATABASE laravel_blog_db;

Ehhez az adatbázishoz hozzunk létre egy felhasználót (phpappuser) és jelszavát (MySQLAzure2020), majd az utána következő utasításban rendeljük hozzá az adatbázishoz:

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2020';
GRANT ALL PRIVILEGES ON laravel_blog_db.* TO 'phpappuser';

Az első utasítás létrehozza a phpappuser nevű felhasználót a MySQLAzure2020 jelszóval. Majd utána ennek a felhasználónak biztosítok jogokat, hozzáférést az imént létrehozott adatbázishoz.

Ezután kiléphetünk a MySQL console-ból egy quit utasítással.

Csatlakozás a szerverhez a Laravel alkalmazásból

Visszatérhetünk a VSCode-ba a Laravel blog alkalmazásunkhoz. A már meglévő .env fájl mellé hozzunk létre egy .env.production nevű fájlt is, aminek a tartalma kezdetben lehet ugyanaz, mint az .env fájlé, de utána végezzük el a következő módosításokat (nyilván a ti paramétereiteket adjátok meg, például a DB_HOST-nál is):

APP_ENV=production
APP_DEBUG=true

DB_CONNECTION=mysql
DB_HOST=server197968907.mysql.database.azure.com
DB_DATABASE=laravel_blog_db
DB_USERNAME=phpappuser
DB_PASSWORD=MySQLAzure2020

MYSQL_SSL=true

Hozzunk létre egy ssl nevű mappát a projekt mappánk gyökerében. Majd töltsük le ezt a fájlt és mentsük el az ssl mappánkba: https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem

Nyissuk meg a config / database.php fájlt és adjuk hozzá a 'mysql' részhez két új kulcs-érték párost (sslmode és options kulcsokkal, a meglévő options-t írjuk felül ezzel az újjal) az alábbiak szerint:

'mysql' => [
    //...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/DigiCertGlobalRootCA.crt.pem',
    ] : []
],

Tesztelhetjük az alkalmazásunkat lokálisan.

Hozzuk létre az APP_KEY-t a production .env fájl számára: php artisan key:generate --env=production --force

Migráljuk az adattábláinkat az Azure adatbázisába: php artisan migrate --env=production --force

Töltsük is fel adatokkal: php artisan db:seed --env=production

Futtassuk az alkalmazásunkat helyben, de a felhőbeli adatbázist használva: php artisan serve --env=production

És voilà! Működik az alkalmazásunk helyben, az Azure-beli adatbázisszerverre kapcsolódva!


Kényelmi hozzáférés

További hasznos beállítás lehet még, hogy ha a MySQL Console-ból picit kényelmetlen a felhőbeli adatbázisok menedzselése, akkor a MySQL Workbench-ben is be tudunk állítani új kapcsolatot, megnyitás után a kezdőoldalon kattintsunk a + jelre itt:

Nevezzük el a kapcsolatot, állítsuk be a Hostname, Username mezőket megfelelően és persze a jelszót is állítsuk be a kapcsolatnak.

Majd egy Test Connection gomb megnyomása után vissza is kapjuk, hogy működik-e az adatkapcsolat, avagy sem.

Ha sikeresen működik a teszt, akkor leokézhatjuk a kapcsolat létrehoz ablakot, utána pedig már mindig tudunk két kattintással csatlakozni a Workbench-csel a felhőbeli adatbázisainkhoz.

Jó munkát kívánok hozzá!