"Membina Tapak Web Asli Awan dengan AWS: Daripada Pengehosan Statik kepada Kandungan Dinamik"
Saya mendengar tentang Cabaran Cloud Resume semasa melayari reddit beberapa tahun lalu. Sebagai peminat teknologi tetapi seseorang yang tidak bekerja di AWS setiap hari, cabaran itu menarik minat saya.
Cabaran Cloud Resume, yang dicipta oleh Forrest Brazeal, ialah projek berbilang langkah yang melibatkan membina aplikasi tindanan penuh menggunakan pelbagai perkhidmatan AWS. Ia direka untuk mempamerkan kemahiran awan melalui pelaksanaan praktikal, menjadikannya latihan yang sangat baik walaupun bagi kita yang sudah berada di lapangan.
Dalam catatan blog ini, saya akan berkongsi pengalaman saya menyelesaikan Cabaran Cloud Resume, memperincikan perkhidmatan AWS yang saya gunakan, seni bina yang saya laksanakan dan cerapan yang saya peroleh. Sama ada anda seorang profesional awan yang ingin mempertajam kemahiran anda atau seseorang yang ingin tahu tentang aplikasi AWS dunia sebenar, saya harap anda akan mendapat nilai dalam perjalanan saya melalui projek ini.
Pembangunan asli awan memanfaatkan kuasa pengkomputeran awan untuk membina aplikasi berskala dan berdaya tahan. Dalam panduan komprehensif ini, kami akan melalui proses mencipta tapak web asli awan menggunakan pelbagai perkhidmatan AWS. Kami akan bermula dengan mengehos tapak web statik dan secara beransur-ansur menambah ciri dinamik, termasuk kaunter pelawat. Artikel ini sesuai untuk pemula yang ingin memahami cara perkhidmatan AWS yang berbeza berfungsi bersama-sama untuk mencipta tapak web boleh skala yang berfungsi sepenuhnya.
Amazon S3 (Perkhidmatan Penyimpanan Mudah) ialah perkhidmatan penyimpanan objek yang boleh kami gunakan untuk mengehoskan tapak web statik. Begini cara untuk menyediakannya:
Buat baldi S3:
Muat naik fail tapak web anda:
Konfigurasikan dasar baldi:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
Ganti "nama baldi-anda" dengan nama baldi sebenar anda.
CloudFront ialah perkhidmatan Rangkaian Penyampaian Kandungan (CDN) AWS. Kami akan menggunakannya untuk menyediakan tapak web kami melalui HTTPS dan meningkatkan prestasi:
Buat pengedaran CloudFront:
Konfigurasikan sijil SSL/TLS:
Sediakan Identiti Akses Asal (OAI):
Laluan 53 ialah perkhidmatan web Sistem Nama Domain (DNS) AWS. Kami akan menggunakannya untuk memetakan nama domain kami ke pengedaran CloudFront kami:
Buat zon yang dihoskan:
Kemas kini pelayan nama:
Buat set rekod:
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.
Atas ialah kandungan terperinci AWS Cloud Resume Challenge Catatan Blog Bahagian 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!