"Créer un site Web cloud natif avec AWS : de l'hébergement statique au contenu dynamique"
J'ai entendu parler du Cloud Resume Challenge en surfant sur Reddit il y a quelques années. En tant que passionné de technologie mais ne travaillant pas quotidiennement sur AWS, le défi m'a intrigué.
Le Cloud Resume Challenge, créé par Forrest Brazeal, est un projet en plusieurs étapes qui consiste à créer une application full-stack utilisant divers services AWS. Il est conçu pour mettre en valeur les compétences cloud grâce à une mise en œuvre pratique, ce qui en fait un excellent exercice même pour ceux d'entre nous déjà sur le terrain.
Dans cet article de blog, je partagerai mon expérience en complétant le Cloud Resume Challenge, en détaillant les services AWS que j'ai utilisés, l'architecture que j'ai implémentée et les informations que j'ai acquises. Que vous soyez un professionnel du cloud cherchant à perfectionner vos compétences ou quelqu'un curieux des applications AWS du monde réel, j'espère que vous trouverez de la valeur dans mon parcours à travers ce projet.
Le développement cloud natif exploite la puissance du cloud computing pour créer des applications évolutives et résilientes. Dans ce guide complet, nous passerons en revue le processus de création d'un site Web cloud natif à l'aide de divers services AWS. Nous commencerons par héberger un site Web statique et ajouterons progressivement des fonctionnalités dynamiques, notamment un compteur de visiteurs. Cet article est parfait pour les débutants qui souhaitent comprendre comment différents services AWS fonctionnent ensemble pour créer un site Web entièrement fonctionnel et évolutif.
Amazon S3 (Simple Storage Service) est un service de stockage d'objets que nous pouvons utiliser pour héberger des sites Web statiques. Voici comment le configurer :
Créez un compartiment S3 :
Téléchargez les fichiers de votre site Web :
Configurer la stratégie du compartiment :
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
Remplacez « your-bucket-name » par le nom réel de votre bucket.
CloudFront est le service Content Delivery Network (CDN) d'AWS. Nous l'utiliserons pour servir notre site Web via HTTPS et améliorer les performances :
Créez une distribution CloudFront :
Configurer le certificat SSL/TLS :
Configurer l'identité d'accès à l'origine (OAI) :
Route 53 est le service Web DNS (Domain Name System) d'AWS. Nous l'utiliserons pour mapper notre nom de domaine à notre distribution CloudFront :
Créer une zone hébergée :
Mettre à jour les serveurs de noms :
Créer des jeux d'enregistrements :
For our visitor counter, we'll use a serverless architecture with DynamoDB, Lambda, and API Gateway.
DynamoDB is a NoSQL database service. We'll use it to store our visitor count:
Lambda allows us to run code without provisioning servers. Our Lambda function will update the visitor count:
const { DynamoDBClient, UpdateItemCommand } = require('@aws-sdk/client-dynamodb'); const client = new DynamoDBClient(); exports.handler = async (event) => { const params = { TableName: process.env.TABLE_NAME, Key: { id: { S: 'visitors' } }, UpdateExpression: 'ADD visitorCount :inc', ExpressionAttributeValues: { ':inc': { N: '1' } }, ReturnValues: 'UPDATED_NEW' }; try { const command = new UpdateItemCommand(params); const data = await client.send(command); const visitorCount = data.Attributes.visitorCount.N; return { statusCode: 200, headers: { "Access-Control-Allow-Origin": "https://yourdomain.com", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "OPTIONS,POST" }, body: JSON.stringify({ visitorCount: parseInt(visitorCount) }) }; } catch (error) { console.error('Error:', error); return { statusCode: 500, headers: { "Access-Control-Allow-Origin": "https://yourdomain.com", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "OPTIONS,POST" }, body: JSON.stringify({ error: 'Failed to update visitor count' }) }; } };
Set up environment variables:
Configure permissions:
API Gateway allows us to create, publish, and manage APIs. We'll use it to expose our Lambda function:
Create a new API:
Create a resource and method:
Enable CORS:
Deploy the API:
Now, let's integrate our backend with the frontend:
<div id="visitor-count">Visitors: <span id="count">0</span></div>
function updateVisitorCount() { fetch('https://your-api-gateway-url/visitorcount', { method: 'POST', headers: { 'Content-Type': 'application/json' }, mode: 'cors' }) .then(response => response.json()) .then(data => { document.getElementById('count').textContent = data.visitorCount; }) .catch(error => console.error('Error:', error)); } document.addEventListener('DOMContentLoaded', updateVisitorCount);
Replace 'https://your-api-gateway-url' with your actual API Gateway URL.
To ensure our JavaScript works correctly, we'll add some tests:
npm install --save-dev jest
// Mock fetch function global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ visitorCount: 5 }), }) ); // Import the function to test const { updateVisitorCount } = require('./visitorCounter'); test('updates visitor count correctly', async () => { // Set up our document body document.body.innerHTML = '<div id="count">0</div>'; // Call the function await updateVisitorCount(); // Check that the count was updated expect(document.getElementById('count').textContent).toBe('5'); });
npx jest
In this guide, we've covered how to build a cloud-native website using various AWS services. We've implemented a static website with S3, secured it with CloudFront, set up DNS with Route 53, and created a serverless backend with DynamoDB, Lambda, and API Gateway.
This architecture provides a scalable, secure, and cost-effective solution for hosting websites and web applications. As you become more comfortable with these services, you can expand on this foundation to build even more complex and feature-rich applications.
In the next article, we'll explore how to automate the deployment of this website using CI/CD practices with GitHub Actions.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!