"AWS를 사용하여 클라우드 네이티브 웹 사이트 구축: 정적 호스팅에서 동적 콘텐츠까지"
몇 년 전 Reddit을 서핑하다가 Cloud Resume Challenge에 대해 들었습니다. 기술에 열광하지만 매일 AWS에서 일하지는 않는 사람으로서 이 도전에 흥미를 느꼈습니다.
Forrest Brazeal이 만든 Cloud Resume Challenge는 다양한 AWS 서비스를 사용하여 풀 스택 애플리케이션을 구축하는 다단계 프로젝트입니다. 실제 구현을 통해 클라우드 기술을 보여주도록 설계되었으므로 이미 현장에 있는 사람들에게도 훌륭한 연습이 됩니다.
이 블로그 게시물에서는 Cloud Resume Challenge를 완료한 경험을 공유하고, 제가 사용한 AWS 서비스, 구현한 아키텍처, 얻은 통찰력을 자세히 설명하겠습니다. 기술을 연마하려는 클라우드 전문가이거나 실제 AWS 애플리케이션에 대해 궁금한 사람이라면 이 프로젝트를 통해 제 여정에서 가치를 발견할 수 있기를 바랍니다.
클라우드 네이티브 개발은 클라우드 컴퓨팅의 성능을 활용하여 확장 가능하고 탄력적인 애플리케이션을 구축합니다. 이 종합 가이드에서는 다양한 AWS 서비스를 사용하여 클라우드 네이티브 웹 사이트를 생성하는 과정을 안내합니다. 우리는 정적 웹사이트 호스팅부터 시작하여 점진적으로 방문자 카운터를 포함한 동적 기능을 추가할 것입니다. 이 문서는 다양한 AWS 서비스가 어떻게 함께 작동하여 완벽하게 기능하고 확장 가능한 웹 사이트를 생성하는지 이해하려는 초보자에게 적합합니다.
Amazon S3(Simple Storage Service)는 정적 웹사이트를 호스팅하는 데 사용할 수 있는 객체 스토리지 서비스입니다. 설정 방법은 다음과 같습니다.
S3 버킷 생성:
웹사이트 파일 업로드:
버킷 정책 구성:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
"your-bucket-name"을 실제 버킷 이름으로 바꾸세요.
CloudFront는 AWS의 CDN(콘텐츠 전송 네트워크) 서비스입니다. 이를 사용하여 HTTPS를 통해 웹사이트를 제공하고 성능을 향상할 것입니다.
CloudFront 배포판 생성:
SSL/TLS 인증서 구성:
오리진 액세스 ID(OAI) 설정:
Route 53은 AWS의 DNS(Domain Name System) 웹 서비스입니다. 이를 사용하여 도메인 이름을 CloudFront 배포에 매핑합니다.
호스팅 영역 생성:
네임서버 업데이트:
기록 세트 만들기:
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.
위 내용은 AWS Cloud Resume 챌린지 블로그 게시물 1부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!