Welkom bij Dag 4 van 12 Dagen van DigitalOcean! Gisteren hebben we Twilio SMS-notificaties toegevoegd aan onze Verjaardagsherinneringsdienst, waardoor het in staat is om sms-berichten te versturen voor de verjaardagen van vandaag. 🎂
Vandaag gaan we een stap verder door ons script te implementeren op DigitalOcean Functions. Dit stelt onze service in staat om in de cloud te draaien zonder de noodzaak van een toegewijde server, waardoor onze app lichtgewicht, schaalbaar en klaar voor automatisering is.
Met deze opzet ontvang je verjaardagsherinneringen, zelfs wanneer je computer uit staat of niet met internet is verbonden—geen noodzaak om het script handmatig op je machine uit te voeren. 🎉
✨ Waarom DigitalOcean Functions?
Soms heb je gewoon een eenvoudig script nodig dat af en toe draait. Het beheren van infrastructuur voor iets dergelijks kan overdreven zijn. Daar komt Functions om de hoek kijken. Het is een serverless platform, wat betekent dat je code kunt implementeren die alleen draait wanneer dat nodig is, en je betaalt alleen voor wat je gebruikt. Perfect voor onze gebruikscase—het controleren van verjaardagen en dagelijks herinneringen versturen.
🚀 Wat Je Zult Leren
Aan het einde van vandaag weet je hoe je:
- De
doctl
CLI-tool van DigitalOcean instelt. - Een serverless namespace (de manier waarop DigitalOcean functies georganiseerd houdt) aanmaakt en verbindt.
- Je Verjaardagsherinneringsdienst verpakt en implementeert naar DigitalOcean Functions.
- Je geïmplementeerde functie in de cloud test.
🛠 Wat Je Nodig Hebt
Voordat je begint, zorg ervoor dat je hebt:
- Een DigitalOcean-account.
- Een
.env
bestand met je PostgreSQL database-inloggegevens en Twilio-inloggegevens
🧑🍳 Recept voor Dag 4: Implementeren naar DigitalOcean Functions
Stap 1: Stel de doctl
CLI in
Als je doctl al op je machine hebt ingesteld, kun je deze stap overslaan. Voor degenen die het moeten instellen, volg deze instructies:
Voordat we beginnen, laten we snel praten over doctl
. Het is de officiële command-line interface tool van DigitalOcean waarmee je je cloudresources rechtstreeks vanuit je terminal kunt beheren. We zullen het gebruiken om een namespace (een map voor onze serverless functies) te maken, ons Python-script te implementeren en de functie te testen.
Het instellen is eenvoudig:
-
Installeer
doctl
: Volg de installatiehandleiding voor jouw besturingssysteem. -
Authenticeer
doctl
: Verbind het met je DigitalOcean-account door het volgende uit te voeren: -
Controleer de installatie: Zorg ervoor dat alles werkt door het volgende uit te voeren:
Als het succesvol is, zal deze opdracht details over uw DigitalOcean-account retourneren, zoals uw e-mailadres en account-ID.
Stap 2: Installeer de Serverless Software
DigitalOcean Functions vereist serverless ondersteuningssoftware, die u moet installeren. Dit is een eenmalige installatie, dus zodra het is geïnstalleerd, hoeft u het niet opnieuw te doen voor toekomstige projecten.
Voer de volgende opdracht uit:
U kunt de installatie-status controleren met:
Als u een fout ziet zoals:
Maak je geen zorgen—dat betekent gewoon dat we nog geen namespace hebben aangemaakt of verbonden. Dat zullen we in de volgende stap doen.
Stap 3: Maak een Namespace aan en Maak Verbinding
Namespaces zijn als mappen voor het organiseren van serverloze functies. Laten we er een maken voor onze Verjaardagsherinneringsdienst:
-
Maak een nieuwe namespace:
-
Verbind met de namespace:
-
Controleer de verbinding:
Je zou nu een bevestiging moeten zien dat je verbonden bent met de namespace.
Pro Tip: Om een lijst van alle beschikbare namespaces te zien, gebruik je de volgende opdracht:
Dit kan handig zijn als je meerdere projecten beheert of als je de namespace wilt verifiëren die je zojuist hebt aangemaakt.
Stap 4: Initialiseer en Stel de Projectstructuur In
DigitalOcean Functions verwacht een specifieke projectstructuur voor serverless implementaties. Je kunt deze structuur opstarten met doctl serverless init
, het handmatig aanmaken, of zelfs een starter repo klonen. Om het eenvoudig te houden, zullen we het opzetten met doctl serverless init
:
-
Voer de volgende opdracht uit om het project te initialiseren:
Dit creëert een lokale projectdirectory genaamd
my-birthday-reminder-service
met de volgende standaardstructuur: -
Navigeer naar de projectdirectory:
-
Hernoem de mappen om aan onze gebruikscase te voldoen:
-
Maak de benodigde bestanden aan:
- Maak een leeg .env-bestand aan in de hoofdmap van het project:
Dit bestand bevat je database- en Twilio-inloggegevens. Het bestand bevindt zich in de hoofdmap van de
my-birthday-reminder-service
map.- Maak een
requirements.txt
bestand aan in debirthdays
map:
Dit bestand bevat de Python-afhankelijkheden die nodig zijn voor je functie. Het bevindt zich onder
packages/reminders/birthdays
.- Maak een build.sh bestand aan in de birthdays map:
Het
build.sh
script is nodig voor het implementeren van functies met externe afhankelijkheden. Dechmod
opdracht zorgt ervoor dat het script uitvoerbaar is op Mac/Linux-systemen.
Bijgewerkte Structuur: Na het voltooien van deze stappen zou je projectstructuur er als volgt uit moeten zien:
Pro Tip: Als je per ongeluk een map verkeerd hebt genoemd, kun je de opdracht opnieuw uitvoeren of het handmatig hernoemen in je bestandsverkenner.
Stap 5: Bestanden Bijwerken
Nu de structuur klaar is, laten we deze vullen met de benodigde bestanden. Open de my-birthday-reminder-service directory in je favoriete code-editor
1. Werk project.yml
bij
Het project.yml
bestand is een configuratiebestand dat de structuur, omgevingsvariabelen en functies van je serverloze project definieert. Vervang de inhoud met:
Dit bestand stelt het reminders-pakket in en koppelt omgevingsvariabelen aan DigitalOcean Functions. Elke variabele komt overeen met de inloggegevens die nodig zijn voor je database en Twilio-integratie.
2. Werk je .env-bestand bij
Verwijs naar Dag 1: Een PostgreSQL-database instellen voor verjaardagsherinneringen voor de database-inloggegevens en Dag 3: Verjaardagen controleren en SMS-meldingen verzenden voor Twilio-inloggegevens om de volgende waarden in te vullen:
Opmerking: Het .env
bestand wordt gebruikt om gevoelige inloggegevens veilig op te slaan. Deze waarden worden gelezen door je project.yml
bestand en gekoppeld aan de serverless omgeving tijdens de implementatie, waardoor ze toegankelijk zijn voor je functie in de cloud.
3. Voeg afhankelijkheden toe
Werk het requirements.txt
bestand bij met de volgende afhankelijkheden:
pg8000
: Een pure-Python PostgreSQL-clientbibliotheek.
python-dotenv
: Gebruikt om omgevingsvariabelen te laden vanuit het .env
bestand.
twilio
: De Twilio Python-bibliotheek voor het verzenden van sms-berichten.
4. Werk build.sh
Voeg het volgende script toe aan het build.sh
bestand:
Dit script zorgt ervoor dat alle afhankelijkheden correct zijn verpakt met je functie. Het chmod +x
commando uit Stap 4 zorgt ervoor dat het uitvoerbaar is.
5. Werk __main__.py
bij
Dit is het hoofdschema voor je Verjaardagsherinneringsdienst. We gebruiken in wezen het script dat we op Dag 3 hebben gebouwd voor het verzenden van verjaardagsmeldingen. Om het echter compatibel te maken met DigitalOcean Functions, moeten we een paar kleine aanpassingen doen.
Werk het __main__.py
bestand bij met de volgende inhoud:
Dit is wat we hebben veranderd:
-
Een
main(params)
functie toegevoegd: DigitalOcean Functions verwacht een entry point functie genaamdmain
, die eenparams
argument neemt. Dit is waar de functie begint met uitvoeren. -
De scriptlogica verplaatst naar de
main
functie:
De code van Dag 3 is binnen demain
functie gewikkeld om aan deze vereiste te voldoen. -
Alles blijft hetzelfde:
De logica voor de databaseverbinding, verjaardagscontroles en de logica voor SMS-notificaties zijn onveranderd.
Stap 5: Pakket en Implementatie
Met alles op zijn plaats, implementeer je project naar DigitalOcean Functions:
- Implementeer het project:
Om te verifiëren dat je functie succesvol is geïmplementeerd naar de namespace:
- Bezoek het DigitalOcean Control Panel en navigeer naar Functions in de linker zijbalk.
- Zoek je namespace (bijv. my-birthday-reminder-namespace).
- Controleer of je functie onder de namespace verschijnt, meestal vermeld als
reminders/birthdays
. - Klik op de functienaam om details te bekijken, inclusief logs, configuratie en aanroepgeschiedenis.
Stap 6: Test je Geïmplementeerde Functie
Zodra je functie is geïmplementeerd, is het tijd om deze te testen. Je kunt de functie handmatig aanroepen om ervoor te zorgen dat deze werkt zoals verwacht. Er zijn twee manieren om dit te doen:
Optie 1: Gebruik de DigitalOcean CLI
Als alles correct is ingesteld, wordt je functie in de cloud uitgevoerd, waarbij deze de verjaardagen van vandaag controleert en SMS-meldingen verzendt.
Optie 2: Gebruik het DigitalOcean Dashboard
- Ga naar het DigitalOcean Control Panel.
- Navigeren naar Functies en zoek je herinneringen/verjaardagen functie.
- Klik op Uitvoeren om het handmatig uit te voeren.
- Bekijk de output en logs direct in de console.
Deze methode is vooral handig als je de voorkeur geeft aan een visuele interface of als je de logs in een schoon, gemakkelijk leesbaar formaat wilt controleren.
Testtips
Wanneer je de functie aanroept, controleert deze op verjaardagen die overeenkomen met de datum van vandaag. Als er een overeenkomst is, ontvang je een sms met de details. Om de functie effectief te testen:
- Voeg een of meer verjaardagen toe in je database die overeenkomen met de huidige datum.
- Controleer de console of CLI-logs om te bevestigen dat de functie succesvol is uitgevoerd.
🎁 Conclusie
Dit hebben we vandaag bereikt:
✅ doctl
ingesteld en een namespace voor ons project aangemaakt.
✅ Het Python-script herzien voor implementatie.
✅ De Verjaardagsherinneringsdienst verpakt en geïmplementeerd naar DigitalOcean Functions.
✅ De functie in de cloud getest met zowel de CLI als het DigitalOcean Dashboard.
Wat komt daarna: Hoewel dit een grote stap vooruit is, voeren we de functie nog steeds handmatig uit. In de volgende post zullen we dit proces automatiseren, zodat de Verjaardagsherinneringsdienst elke dag op een specifiek tijdstip automatisch draait. Stel je voor dat je wakker wordt met een sms-herinnering zonder een vinger te hoeven uitsteken—laten we dat morgen laten gebeuren! 🚀