AWS 클라우드 서비스 완전 정복: EC2, S3, Lambda 실전 가이드 (2025년 최신판)

📚 목차
- AWS 클라우드 서비스 소개
- EC2: 가상 서버의 모든 것
- S3: 무한한 스토리지의 세계
- Lambda: 서버리스 컴퓨팅의 혁명
- 세 가지 서비스 연동하기
- 실전 프로젝트: 풀스택 애플리케이션 구축
- 비용 최적화 전략
- 보안 모범 사례
- 마무리 및 다음 단계
1. AWS 클라우드 서비스 소개 🌩️
안녕! 오늘은 AWS(Amazon Web Services)의 핵심 서비스인 EC2, S3, Lambda에 대해 함께 알아볼 거야. 2025년 현재, AWS는 전 세계 클라우드 시장의 약 33%를 차지하는 최대 클라우드 서비스 제공업체로, 이 세 가지 서비스는 AWS 생태계의 중심축이라고 할 수 있어.
프로그래밍과 개발에 관심 있는 사람이라면, 이 서비스들을 활용해 다양한 애플리케이션을 구축하고 배포하는 방법을 알아두면 정말 큰 도움이 될 거야. 특히 요즘처럼 AI와 빅데이터가 중요해진 시대에는 클라우드 서비스 활용 능력이 개발자의 필수 역량이 되었어!
🔍 알고 있니? AWS는 2025년 현재 전 세계 32개 리전, 102개의 가용 영역(AZ)을 운영 중이야. 이는 2023년보다 5개 리전, 15개 가용 영역이 늘어난 수치지!
재능넷에서도 많은 개발자들이 AWS 클라우드 서비스를 활용한 프로젝트 개발 재능을 공유하고 있어. 이 글을 통해 기본 개념부터 실전 활용법까지 배우고 나면, 너도 곧 클라우드 전문가로 거듭날 수 있을 거야! 😊
2. EC2: 가상 서버의 모든 것 🖥️
EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스야. 쉽게 말하면, 인터넷에 연결된 컴퓨터를 빌려 쓰는 개념이라고 생각하면 돼. 물리적인 서버를 직접 구매하고 관리할 필요 없이, 필요한 만큼만 사용하고 비용을 지불하는 방식이지.
🔑 EC2의 핵심 특징
- 탄력적 확장성: 트래픽에 따라 서버를 쉽게 확장하거나 축소할 수 있어
- 다양한 인스턴스 타입: 2025년 현재 300개 이상의 인스턴스 타입 제공
- 다양한 운영체제: Linux, Windows, macOS 등 선택 가능
- 사용한 만큼 지불: 초 단위 요금제로 비용 효율적
- 글로벌 인프라: 전 세계 어디서든 서비스 배포 가능
EC2 인스턴스 시작하기
EC2 인스턴스를 시작하는 과정을 함께 알아보자. 2025년 AWS 콘솔은 이전보다 더 직관적으로 개선되었어!
- AWS 관리 콘솔에 로그인한다.
- EC2 서비스로 이동한다.
- "인스턴스 시작" 버튼을 클릭한다.
- AMI(Amazon Machine Image)를 선택한다.
AMI는 서버에 필요한 운영체제와 소프트웨어가 미리 구성된 템플릿이야. 2025년 현재 Amazon Linux 3, Ubuntu 24.04 LTS, Windows Server 2025 등이 인기 있는 선택지지.
- 인스턴스 유형을 선택한다.
2025년 기준 최신 인스턴스 패밀리는 다음과 같아:
- • C8g: 컴퓨팅 최적화 (Graviton4 프로세서)
- • M8g: 범용 (Graviton4 프로세서)
- • R8g: 메모리 최적화 (Graviton4 프로세서)
- • P6: GPU 최적화 (NVIDIA H200 GPU)
- • T5: 버스트 가능 성능
- 인스턴스 세부 정보를 구성한다.
- 스토리지를 추가한다.
- 태그를 추가한다.
- 보안 그룹을 구성한다.
- 키 페어를 생성하거나 선택한다.
- "인스턴스 시작" 버튼을 클릭한다.
인스턴스가 시작되면, SSH(Linux) 또는 RDP(Windows)를 사용하여 접속할 수 있어. 2025년부터는 AWS 콘솔에서 직접 브라우저 기반 터미널로 접속하는 기능이 더욱 강화되었어.
💡 EC2 인스턴스에 SSH로 접속하기
ssh -i "your-key.pem" ec2-user@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
Windows 사용자라면 PuTTY나 Windows Terminal을 사용할 수 있어. 2025년부터는 Windows Terminal이 SSH 클라이언트를 기본 내장하고 있어 더 편리해졌지!
EC2 인스턴스 타입 선택 가이드
인스턴스 타입 선택은 애플리케이션의 성능과 비용에 직접적인 영향을 미쳐. 목적에 맞는 인스턴스를 선택하는 것이 비용 최적화의 첫 번째 단계야!
인스턴스 패밀리 | 최적화 용도 | 사용 사례 |
---|---|---|
T 시리즈 | 버스트 가능 성능 | 개발/테스트 환경, 소규모 웹 서버 |
M 시리즈 | 범용 | 웹 서버, 소규모 DB |
C 시리즈 | 컴퓨팅 최적화 | 배치 처리, 고성능 웹 서버 |
R 시리즈 | 메모리 최적화 | 인메모리 DB, 빅데이터 분석 |
P 시리즈 | GPU 최적화 | 머신러닝, 딥러닝, 렌더링 |
2025년에는 Graviton4 프로세서 기반 인스턴스가 x86 기반 인스턴스보다 최대 40% 더 높은 성능과 30% 더 나은 에너지 효율성을 제공해. 특히 ARM 아키텍처에 최적화된 워크로드라면 비용 대비 성능이 훨씬 뛰어나지!
EC2 Auto Scaling으로 자동 확장 구성하기
트래픽이 증가하면 자동으로 인스턴스를 추가하고, 감소하면 자동으로 인스턴스를 제거하는 Auto Scaling 기능은 EC2의 강력한 기능 중 하나야. 2025년에는 AI 기반 예측 스케일링 기능이 추가되어 더욱 효율적인 리소스 관리가 가능해졌어!
Auto Scaling 그룹을 설정하는 기본 단계는 다음과 같아:
- 시작 템플릿 생성 (AMI, 인스턴스 타입, 보안 그룹 등 정의)
- Auto Scaling 그룹 생성
- 최소, 최대, 원하는 용량 설정
- 스케일링 정책 설정 (CPU 사용률, 네트워크 트래픽 등)
- 알림 설정 (선택사항)
🌱 EC2 비용 절감 팁
EC2를 사용하면서 비용을 절감하는 몇 가지 방법을 알아볼까?
- 예약 인스턴스(RI): 1년 또는 3년 약정으로 최대 72% 할인
- 스팟 인스턴스: 미사용 EC2 용량을 최대 90% 할인된 가격에 이용
- Savings Plans: 1년 또는 3년 약정으로 유연한 사용량에 대해 할인
- Graviton 인스턴스: ARM 기반 프로세서로 더 나은 가격 대비 성능
- Auto Scaling: 필요한 만큼만 인스턴스 실행
EC2는 AWS 생태계의 중심이라고 할 수 있어. 웹 서버, 애플리케이션 서버, 게임 서버, 배치 처리 등 다양한 워크로드를 실행할 수 있지. 재능넷에서도 많은 개발자들이 EC2를 활용한 서버 구축 및 운영 노하우를 공유하고 있어. 다음으로는 데이터 저장소인 S3에 대해 알아보자!
3. S3: 무한한 스토리지의 세계 📦
S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지 서비스야. 쉽게 말하면 인터넷에 연결된 무한대의 하드 디스크라고 생각하면 돼. 파일을 저장하고, 검색하고, 백업하는 용도로 널리 사용되며, 99.999999999%(11 9's)의 내구성을 제공해!
🔑 S3의 핵심 특징
- 무한한 확장성: 저장 용량에 제한이 없음
- 높은 내구성과 가용성: 데이터 손실 위험 최소화
- 다양한 스토리지 클래스: 접근 빈도와 비용에 따라 선택 가능
- 버전 관리: 파일의 이전 버전 보존 가능
- 정적 웹사이트 호스팅: HTML, CSS, JS 파일 호스팅 가능
- 이벤트 알림: 파일 업로드/삭제 시 알림 트리거 가능
S3 버킷 생성하기
S3에서는 '버킷'이라는 컨테이너에 파일(객체)을 저장해. 버킷 이름은 전 세계적으로 고유해야 해. 버킷을 생성하는 과정을 함께 알아보자.
- AWS 관리 콘솔에 로그인한다.
- S3 서비스로 이동한다.
- "버킷 만들기" 버튼을 클릭한다.
- 버킷 이름을 입력한다.
버킷 이름은 전 세계적으로 고유해야 하며, DNS 명명 규칙을 따라야 해. 예: my-unique-bucket-name-2025
- 리전을 선택한다.
2025년 기준 새로 추가된 리전으로는 멕시코, 말레이시아, 태국 리전이 있어.
- 객체 소유권 설정을 구성한다.
- 퍼블릭 액세스 차단 설정을 구성한다.
보안을 위해 기본적으로 모든 퍼블릭 액세스가 차단되어 있어. 웹사이트 호스팅 등의 목적이 아니라면 이 설정을 유지하는 것이 좋아.
- 버킷 버전 관리를 설정한다.
- 태그를 추가한다.
- 암호화 설정을 구성한다.
- "버킷 만들기" 버튼을 클릭한다.
S3에 파일 업로드하기
버킷을 생성한 후에는 파일(객체)을 업로드할 수 있어. 다양한 방법으로 파일을 업로드할 수 있지만, 가장 기본적인 방법은 콘솔을 통한 업로드야.
- 생성한 버킷을 클릭한다.
- "업로드" 버튼을 클릭한다.
- 업로드할 파일을 선택하거나 드래그 앤 드롭한다.
- 추가 설정(권한, 메타데이터, 스토리지 클래스 등)을 구성한다.
- "업로드" 버튼을 클릭한다.
대용량 파일이나 많은 파일을 업로드할 때는 AWS CLI나 SDK를 사용하는 것이 더 효율적이야.
💡 AWS CLI로 S3 파일 업로드하기
aws s3 cp myfile.txt s3://my-bucket/myfile.txt
여러 파일을 한 번에 업로드하려면:
aws s3 sync my-local-folder/ s3://my-bucket/my-folder/
S3 정적 웹사이트 호스팅
S3의 강력한 기능 중 하나는 정적 웹사이트를 호스팅할 수 있다는 거야. HTML, CSS, JavaScript 파일을 S3에 업로드하고, 버킷을 웹사이트로 구성하면 돼. 2025년에는 S3 웹사이트에 자동으로 HTTPS를 적용할 수 있는 기능이 추가되었어!
S3 정적 웹사이트 호스팅 설정 방법:
- 버킷 속성으로 이동한다.
- "정적 웹사이트 호스팅" 섹션에서 "편집" 버튼을 클릭한다.
- "정적 웹사이트 호스팅 활성화"를 선택한다.
- 인덱스 문서(예: index.html)와 오류 문서를 지정한다.
- "변경 사항 저장" 버튼을 클릭한다.
- 버킷의 퍼블릭 액세스 차단 설정을 비활성화한다.
- 버킷 정책을 추가하여 객체에 대한 퍼블릭 읽기 액세스를 허용한다.
📝 S3 버킷 정책 예시 (웹사이트 호스팅용)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
설정이 완료되면 S3에서 제공하는 웹사이트 엔드포인트 URL을 통해 웹사이트에 접속할 수 있어. 일반적으로 URL 형식은 http://your-bucket-name.s3-website-region.amazonaws.com
이야.
S3 수명 주기 관리
S3에 저장된 객체의 수명 주기를 자동으로 관리할 수 있어. 예를 들어, 30일 후에는 Standard에서 Standard-IA로, 90일 후에는 Glacier로 자동 이동시키는 규칙을 설정할 수 있지.
이를 통해 스토리지 비용을 최적화할 수 있어. 2025년에는 AI 기반 수명 주기 추천 기능이 추가되어, 액세스 패턴을 분석하고 최적의 수명 주기 정책을 추천해줘!
🌱 S3 비용 절감 팁
S3를 사용하면서 비용을 절감하는 몇 가지 방법을 알아볼까?
- 적절한 스토리지 클래스 선택: 액세스 빈도에 따라 최적의 클래스 선택
- 수명 주기 정책 설정: 오래된 객체를 저비용 스토리지로 자동 이동
- S3 Intelligent-Tiering: 액세스 패턴에 따라 자동으로 스토리지 클래스 조정
- 불필요한 객체 버전 정리: 버전 관리 사용 시 오래된 버전 삭제
- S3 분석 도구 활용: 스토리지 사용 패턴 분석 및 최적화
S3는 단순한 파일 저장소를 넘어, 웹사이트 호스팅, 백업 및 복구, 빅데이터 분석, 콘텐츠 배포 등 다양한 용도로 활용할 수 있어. 재능넷에서도 많은 개발자들이 S3를 활용한 효율적인 데이터 관리 방법을 공유하고 있지. 다음으로는 서버리스 컴퓨팅의 핵심인 Lambda에 대해 알아보자!
4. Lambda: 서버리스 컴퓨팅의 혁명 ⚡
Lambda는 AWS에서 제공하는 서버리스 컴퓨팅 서비스야. 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있어. 코드가 실행된 시간만큼만 비용을 지불하므로, 사용량이 적은 애플리케이션에 매우 경제적이야!
🔑 Lambda의 핵심 특징
- 서버리스: 서버 관리 없이 코드 실행
- 자동 확장: 트래픽에 따라 자동으로 확장
- 이벤트 기반: 다양한 AWS 서비스의 이벤트에 반응
- 다양한 언어 지원: Node.js, Python, Java, Go, Ruby, .NET, Rust 등
- 사용한 만큼 지불: 실행 시간과 메모리 사용량에 따라 요금 부과
- 타임아웃 제한: 2025년 기준 최대 30분까지 실행 가능
Lambda 함수 생성하기
Lambda 함수를 생성하는 과정을 함께 알아보자. 2025년 AWS 콘솔에서는 함수 생성 과정이 더욱 간소화되었어!
- AWS 관리 콘솔에 로그인한다.
- Lambda 서비스로 이동한다.
- "함수 생성" 버튼을 클릭한다.
- 함수 생성 방법을 선택한다.
- • 처음부터 새로 작성
- • 블루프린트 사용
- • 컨테이너 이미지
- • 서버리스 앱 저장소
- 함수 이름을 입력한다.
- 런타임(프로그래밍 언어)을 선택한다.
2025년 기준 최신 런타임으로는 Node.js 20.x, Python 3.12, Java 21, .NET 8, Go 1.22, Ruby 3.3, Rust 1.75 등이 지원돼.
- 실행 역할을 설정한다.
- "함수 생성" 버튼을 클릭한다.
함수가 생성되면, 코드 편집기에서 함수 코드를 작성하거나 수정할 수 있어. 간단한 Python Lambda 함수 예시를 살펴볼까?
💡 간단한 Python Lambda 함수 예시
def lambda_handler(event, context):
# 이벤트에서 이름 파라미터 가져오기
name = event.get('name', 'World')
# 응답 생성
response = {
'statusCode': 200,
'body': f'Hello, {name}! Welcome to AWS Lambda in 2025!'
}
return response
Lambda 트리거 설정하기
Lambda 함수는 다양한 이벤트에 의해 트리거될 수 있어. 가장 일반적인 트리거 몇 가지를 살펴볼까?
- API Gateway: HTTP 요청에 응답하는 API 생성
- S3 이벤트: 파일 업로드/삭제 시 함수 실행
- CloudWatch Events: 일정에 따라 함수 실행
- DynamoDB Streams: 데이터베이스 변경 시 함수 실행
- SQS: 메시지 큐에서 메시지 처리
- SNS: 알림 처리
트리거를 설정하는 방법은 다음과 같아:
- Lambda 함수 페이지에서 "트리거 추가" 버튼을 클릭한다.
- 트리거 유형을 선택한다.
- 트리거 구성을 설정한다.
- "추가" 버튼을 클릭한다.
🔄 Lambda 함수 버전 관리와 별칭
Lambda 함수의 버전을 관리하고 별칭을 사용하면 안전하게 새 버전을 배포할 수 있어.
- 버전: 함수 코드와 구성의 스냅샷
- 별칭: 특정 버전을 가리키는 포인터
- 트래픽 이동: 별칭을 사용하여 점진적으로 트래픽 이동 가능
2025년에는 카나리 배포 기능이 강화되어, 새 버전으로 트래픽을 1%씩 점진적으로 이동시키는 것이 가능해졌어!
Lambda 함수 모니터링
Lambda 함수의 성능과 오류를 모니터링하는 것은 매우 중요해. AWS는 CloudWatch를 통해 Lambda 함수 모니터링을 위한 다양한 도구를 제공해.
2025년에는 Lambda Insights가 더욱 강화되어, 함수의 성능 병목 현상을 자동으로 감지하고 개선 방안을 제안해줘!
주요 모니터링 지표:
- 호출 수: 함수가 호출된 횟수
- 오류 수: 함수 실행 중 발생한 오류 수
- 지연 시간: 함수 실행에 걸린 시간
- 제한 수: 동시 실행 제한으로 인해 제한된 호출 수
- 메모리 사용량: 함수가 사용한 메모리 양
Lambda 함수 최적화
Lambda 함수의 성능을 최적화하고 비용을 절감하는 몇 가지 방법을 알아볼까?
🌱 Lambda 최적화 팁
- 메모리 설정 최적화: 메모리를 늘리면 CPU 성능도 향상되어 전체 실행 시간이 줄어들 수 있어. 2025년에는 자동 메모리 최적화 기능이 추가되었어!
- 콜드 스타트 최소화: Provisioned Concurrency를 사용하거나, 함수를 주기적으로 호출하여 웜 상태 유지
- 종속성 최소화: 필요한 라이브러리만 포함하여 패키지 크기 줄이기
- 연결 재사용: 데이터베이스 연결 등을 함수 핸들러 외부에서 초기화
- 임시 스토리지 활용: /tmp 디렉토리를 사용하여 임시 파일 처리
💡 Lambda 함수에서 데이터베이스 연결 최적화 예시 (Node.js)
// 전역 변수로 연결 객체 선언
let connection;
// 연결 초기화 함수
async function initializeConnection() {
if (!connection) {
connection = await mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
}
return connection;
}
// Lambda 핸들러
exports.handler = async (event) => {
// 연결 초기화 (컨테이너 재사용 시 기존 연결 활용)
const conn = await initializeConnection();
// 데이터베이스 쿼리 실행
const [rows] = await conn.execute('SELECT * FROM users');
return {
statusCode: 200,
body: JSON.stringify(rows)
};
};
Lambda는 서버리스 아키텍처의 핵심 구성 요소로, 개발자가 인프라 관리 없이 코드에만 집중할 수 있게 해줘. 특히 이벤트 기반 애플리케이션, 백엔드 API, 데이터 처리 파이프라인 등에 적합해. 재능넷에서도 많은 개발자들이 Lambda를 활용한 서버리스 애플리케이션 개발 노하우를 공유하고 있어. 다음으로는 이 세 가지 서비스를 연동하는 방법에 대해 알아보자!
5. 세 가지 서비스 연동하기 🔄
지금까지 EC2, S3, Lambda에 대해 각각 알아봤어. 이제 이 세 가지 서비스를 연동하여 더 강력한 애플리케이션을 구축하는 방법을 알아보자. 세 서비스의 장점을 결합하면 확장성, 비용 효율성, 유연성을 모두 갖춘 아키텍처를 구현할 수 있어!
시나리오 1: 이미지 처리 애플리케이션
사용자가 이미지를 업로드하면 자동으로 크기를 조정하고 워터마크를 추가하는 애플리케이션을 만들어보자.
- EC2: 웹 애플리케이션 호스팅 (사용자 인터페이스 및 API)
- S3: 원본 이미지와 처리된 이미지 저장
- Lambda: S3에 업로드된 이미지 자동 처리
작동 흐름:
- 사용자가 EC2에서 호스팅되는 웹 애플리케이션을 통해 이미지 업로드
- 웹 애플리케이션은 이미지를 S3 버킷의 "원본" 폴더에 저장
- S3 이벤트가 Lambda 함수 트리거
- Lambda 함수가 이미지를 처리하고 "처리됨" 폴더에 저장
- 웹 애플리케이션이 처리된 이미지 URL을 사용자에게 제공
💡 이미지 처리 Lambda 함수 예시 (Python)
import boto3
import PIL
from PIL import Image
import io
s3 = boto3.client('s3')
def lambda_handler(event, context):
# 이벤트에서 버킷 이름과 키 가져오기
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# 원본 이미지가 아닌 경우 처리하지 않음
if not key.startswith('original/'):
return
# 원본 이미지 다운로드
response = s3.get_object(Bucket=bucket, Key=key)
image_content = response['Body'].read()
# 이미지 처리
image = Image.open(io.BytesIO(image_content))
# 이미지 크기 조정 (예: 800x600)
resized_image = image.resize((800, 600))
# 처리된 이미지를 메모리에 저장
buffer = io.BytesIO()
resized_image.save(buffer, format=image.format)
buffer.seek(0)
# 처리된 이미지를 S3에 업로드
processed_key = key.replace('original/', 'processed/')
s3.put_object(
Bucket=bucket,
Key=processed_key,
Body=buffer,
ContentType=f'image/{image.format.lower()}'
)
return {
'statusCode': 200,
'body': f'Successfully processed {key}'
}
시나리오 2: 서버리스 웹 애플리케이션
EC2 없이 완전 서버리스 아키텍처로 웹 애플리케이션을 구축할 수도 있어.
- S3: 정적 웹사이트 호스팅 (HTML, CSS, JavaScript)
- Lambda + API Gateway: 백엔드 API
- S3: 사용자 업로드 파일 저장
작동 흐름:
- 사용자가 S3에서 호스팅되는 정적 웹사이트 접속
- 프론트엔드 JavaScript가 API Gateway를 통해 Lambda 함수 호출
- Lambda 함수가 비즈니스 로직 처리 및 데이터 반환
- 사용자가 파일을 업로드하면 S3에 직접 저장 (미리 서명된 URL 사용)
🔒 S3 미리 서명된 URL 생성 Lambda 함수 (Node.js)
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
// 요청에서 파일 이름과 타입 가져오기
const { fileName, fileType } = JSON.parse(event.body);
// 현재 타임스탬프를 사용하여 고유한 키 생성
const key = `uploads/${Date.now()}-${fileName}`;
// 미리 서명된 URL 생성 파라미터
const params = {
Bucket: process.env.UPLOAD_BUCKET,
Key: key,
ContentType: fileType,
Expires: 300 // 5분 동안 유효
};
try {
// 미리 서명된 URL 생성
const signedUrl = await s3.getSignedUrlPromise('putObject', params);
// 클라이언트에 URL과 키 반환
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify({
signedUrl,
key
})
};
} catch (error) {
console.error('Error generating signed URL:', error);
return {
statusCode: 500,
body: JSON.stringify({ error: 'Failed to generate signed URL' })
};
}
};
시나리오 3: 하이브리드 아키텍처
EC2, S3, Lambda의 장점을 모두 활용하는 하이브리드 아키텍처도 구현할 수 있어.
- EC2: 메인 애플리케이션 서버 (지속적인 연결이 필요한 기능)
- S3: 정적 자산 및 사용자 업로드 파일 저장
- Lambda: 비동기 작업 및 이벤트 처리
작동 흐름:
- 사용자가 EC2에서 호스팅되는 웹 애플리케이션 접속
- 정적 자산(이미지, CSS, JS)은 S3에서 제공
- 사용자 요청에 따라 EC2가 메인 비즈니스 로직 처리
- 시간이 오래 걸리는 작업은 EC2가 SQS를 통해 Lambda로 위임
- Lambda가 백그라운드 작업 처리 후 결과를 데이터베이스에 저장
⚖️ 서비스 선택 가이드
각 서비스를 언제 사용해야 할지 고민된다면 이 가이드를 참고해봐:
- EC2 사용 시기:
- • 지속적인 연결이 필요한 경우 (웹소켓, 게임 서버 등)
- • 특정 운영체제나 소프트웨어가 필요한 경우
- • 완전한 제어가 필요한 경우
- • 장기적으로 높은 사용량이 예상되는 경우 (예약 인스턴스로 비용 절감)
- Lambda 사용 시기:
- • 이벤트 기반 처리가 필요한 경우
- • 간헐적인 트래픽이 있는 경우
- • 15분 이내에 완료되는 작업
- • 서버 관리 오버헤드를 피하고 싶은 경우
- S3 사용 시기:
- • 정적 파일 저장 및 제공
- • 대용량 데이터 저장
- • 백업 및 아카이브
- • 정적 웹사이트 호스팅
2025년에는 AWS Step Functions가 더욱 강화되어, EC2, Lambda, S3 등 다양한 서비스를 쉽게 연동할 수 있는 시각적 워크플로우 도구로 발전했어! 복잡한 비즈니스 프로세스를 코드 없이도 구현할 수 있게 되었지.
세 가지 서비스를 연동하면 각 서비스의 장점을 최대한 활용하면서 비용 효율적인 아키텍처를 구축할 수 있어. 재능넷에서도 AWS 서비스 연동 경험이 풍부한 개발자들이 다양한 아키텍처 패턴과 모범 사례를 공유하고 있어. 다음으로는 실전 프로젝트를 통해 이 세 가지 서비스를 활용하는 방법을 더 자세히 알아보자!
6. 실전 프로젝트: 풀스택 애플리케이션 구축 🏗️
이제 EC2, S3, Lambda를 모두 활용하는 실전 프로젝트를 만들어보자. 이 프로젝트는 사용자가 이미지를 업로드하고 공유할 수 있는 간단한 소셜 미디어 플랫폼이야. 실제 서비스를 구축하는 과정을 통해 세 가지 서비스의 연동 방법을 더 깊이 이해할 수 있을 거야!
프로젝트 개요: 포토 공유 플랫폼
이 애플리케이션은 다음과 같은 기능을 제공해:
- 사용자 등록 및 로그인
- 이미지 업로드 및 갤러리 보기
- 이미지 자동 처리 (크기 조정, 필터 적용)
- 이미지 공유 및 소셜 기능
아키텍처 설계
이 애플리케이션의 아키텍처는 다음과 같아:
구현 단계
이 프로젝트를 구현하는 단계를 살펴보자:
1. 인프라 설정
- EC2 인스턴스 생성 (프론트엔드 및 백엔드 서버)
- S3 버킷 생성 (정적 자산 및 이미지 저장소)
- Lambda 함수 생성 (이미지 처리 및 알림)
- DynamoDB 테이블 생성 (사용자 데이터 및 이미지 메타데이터)
- CloudFront 배포 설정 (콘텐츠 전송 네트워크)
2. 백엔드 API 개발 (EC2)
Node.js와 Express를 사용하여 RESTful API를 개발해보자:
💡 백엔드 API 서버 코드 예시 (Node.js)
const express = require('express');
const AWS = require('aws-sdk');
const multer = require('multer');
const { v4: uuidv4 } = require('uuid');
const cors = require('cors');
// AWS 서비스 클라이언트 초기화
const s3 = new AWS.S3();
const dynamodb = new AWS.DynamoDB.DocumentClient();
const app = express();
const port = 3000;
// 미들웨어 설정
app.use(cors());
app.use(express.json());
// 메모리 스토리지 설정 (파일을 메모리에 임시 저장)
const storage = multer.memoryStorage();
const upload = multer({ storage });
// 사용자 등록 API
app.post('/api/users', async (req, res) => {
const { username, email, password } = req.body;
const userId = uuidv4();
const params = {
TableName: 'Users',
Item: {
userId,
username,
email,
password, // 실제로는 해시된 비밀번호를 저장해야 함
createdAt: new Date().toISOString()
}
};
try {
await dynamodb.put(params).promise();
res.status(201).json({ userId, username });
} catch (error) {
console.error('Error creating user:', error);
res.status(500).json({ error: 'Failed to create user' });
}
});
// 이미지 업로드 API
app.post('/api/images', upload.single('image'), async (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'No image file provided' });
}
const { userId, title, description } = req.body;
const file = req.file;
// 고유한 키 생성
const key = `original/${userId}/${Date.now()}-${file.originalname}`;
// S3에 이미지 업로드
const s3Params = {
Bucket: 'my-photo-sharing-app',
Key: key,
Body: file.buffer,
ContentType: file.mimetype
};
try {
// S3에 업로드
await s3.putObject(s3Params).promise();
// 이미지 메타데이터를 DynamoDB에 저장
const imageId = uuidv4();
const dbParams = {
TableName: 'Images',
Item: {
imageId,
userId,
title,
description,
originalKey: key,
processedKey: key.replace('original/', 'processed/'),
status: 'processing',
uploadedAt: new Date().toISOString()
}
};
await dynamodb.put(dbParams).promise();
res.status(201).json({
imageId,
message: 'Image uploaded successfully and is being processed'
});
} catch (error) {
console.error('Error uploading image:', error);
res.status(500).json({ error: 'Failed to upload image' });
}
});
// 사용자 이미지 가져오기 API
app.get('/api/users/:userId/images', async (req, res) => {
const { userId } = req.params;
const params = {
TableName: 'Images',
IndexName: 'UserIdIndex',
KeyConditionExpression: 'userId = :userId',
ExpressionAttributeValues: {
':userId': userId
}
};
try {
const result = await dynamodb.query(params).promise();
res.json(result.Items);
} catch (error) {
console.error('Error fetching images:', error);
res.status(500).json({ error: 'Failed to fetch images' });
}
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
3. 이미지 처리 Lambda 함수
S3에 이미지가 업로드되면 자동으로 처리하는 Lambda 함수를 개발해보자:
💡 이미지 처리 Lambda 함수 코드 예시 (Python)
import boto3
import json
import os
import uuid
from PIL import Image, ImageFilter
import io
s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
lambda_client = boto3.client('lambda')
def lambda_handler(event, context):
# S3 이벤트에서 버킷 이름과 키 가져오기
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# 원본 이미지가 아닌 경우 처리하지 않음
if not key.startswith('original/'):
return {
'statusCode': 200,
'body': 'Not an original image, skipping processing'
}
try:
# 원본 이미지 다운로드
response = s3.get_object(Bucket=bucket, Key=key)
image_content = response['Body'].read()
# 이미지 처리
image = Image.open(io.BytesIO(image_content))
# 처리 1: 크기 조정 (썸네일)
thumbnail = image.copy()
thumbnail.thumbnail((300, 300))
# 처리 2: 필터 적용 (흑백)
bw_image = image.copy().convert('L')
# 처리 3: 필터 적용 (블러)
blur_image = image.copy().filter(ImageFilter.GaussianBlur(5))
# 처리된 이미지 저장 및 업로드
processed_key = key.replace('original/', 'processed/')
thumbnail_key = processed_key.replace('.', '_thumbnail.')
bw_key = processed_key.replace('.', '_bw.')
blur_key = processed_key.replace('.', '_blur.')
# 썸네일 업로드
thumbnail_buffer = io.BytesIO()
thumbnail.save(thumbnail_buffer, format=image.format)
thumbnail_buffer.seek(0)
s3.put_object(
Bucket=bucket,
Key=thumbnail_key,
Body=thumbnail_buffer,
ContentType=f'image/{image.format.lower()}'
)
# 흑백 이미지 업로드
bw_buffer = io.BytesIO()
bw_image.save(bw_buffer, format=image.format)
bw_buffer.seek(0)
s3.put_object(
Bucket=bucket,
Key=bw_key,
Body=bw_buffer,
ContentType=f'image/{image.format.lower()}'
)
# 블러 이미지 업로드
blur_buffer = io.BytesIO()
blur_image.save(blur_buffer, format=image.format)
blur_buffer.seek(0)
s3.put_object(
Bucket=bucket,
Key=blur_key,
Body=blur_buffer,
ContentType=f'image/{image.format.lower()}'
)
# 사용자 ID 추출 (키 형식: original/userId/timestamp-filename)
parts = key.split('/')
user_id = parts[1]
# 알림 Lambda 함수 호출
notification_payload = {
'userId': user_id,
'originalKey': key,
'processedKeys': [thumbnail_key, bw_key, blur_key]
}
lambda_client.invoke(
FunctionName='image-notification-function',
InvocationType='Event',
Payload=json.dumps(notification_payload)
)
return {
'statusCode': 200,
'body': f'Successfully processed image {key}'
}
except Exception as e:
print(f'Error processing image: {str(e)}')
return {
'statusCode': 500,
'body': f'Error processing image: {str(e)}'
}
4. 프론트엔드 개발 (EC2 또는 S3 정적 웹사이트)
React를 사용하여 사용자 인터페이스를 개발해보자. 이 코드는 EC2에서 호스팅하거나 S3 정적 웹사이트로 배포할 수 있어.
💡 React 프론트엔드 코드 예시 (App.js)
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import './App.css';
const API_URL = 'https://api.myphotosharingapp.com';
function App() {
const [user, setUser] = useState(null);
const [images, setImages] = useState([]);
const [loading, setLoading] = useState(false);
const [selectedFile, setSelectedFile] = useState(null);
const [title, setTitle] = useState('');
const [description, setDescription] = useState('');
// 로그인 상태 확인
useEffect(() => {
const storedUser = localStorage.getItem('user');
if (storedUser) {
setUser(JSON.parse(storedUser));
}
}, []);
// 사용자 이미지 가져오기
useEffect(() => {
if (user) {
fetchUserImages();
}
}, [user]);
const fetchUserImages = async () => {
setLoading(true);
try {
const response = await axios.get(`${API_URL}/api/users/${user.userId}/images`);
setImages(response.data);
} catch (error) {
console.error('Error fetching images:', error);
alert('Failed to fetch images');
} finally {
setLoading(false);
}
};
const handleLogin = async (e) => {
e.preventDefault();
const username = e.target.username.value;
const password = e.target.password.value;
try {
const response = await axios.post(`${API_URL}/api/login`, { username, password });
const userData = response.data;
setUser(userData);
localStorage.setItem('user', JSON.stringify(userData));
} catch (error) {
console.error('Login error:', error);
alert('Login failed');
}
};
const handleLogout = () => {
setUser(null);
localStorage.removeItem('user');
};
const handleFileChange = (e) => {
setSelectedFile(e.target.files[0]);
};
const handleUpload = async (e) => {
e.preventDefault();
if (!selectedFile) {
alert('Please select a file');
return;
}
const formData = new FormData();
formData.append('image', selectedFile);
formData.append('userId', user.userId);
formData.append('title', title);
formData.append('description', description);
setLoading(true);
try {
await axios.post(`${API_URL}/api/images`, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
// 업로드 후 이미지 목록 새로고침
fetchUserImages();
// 폼 초기화
setSelectedFile(null);
setTitle('');
setDescription('');
document.getElementById('file-upload').value = '';
} catch (error) {
console.error('Upload error:', error);
alert('Upload failed');
} finally {
setLoading(false);
}
};
return (
<div classname="app">
<header classname="header">
<h1>Photo Sharing App</h1>
{user ? (
<div classname="user-info">
<span>Welcome, {user.username}!</span>
<button onclick="{handleLogout}">Logout</button>
</div>
) : null}
</header>
<main classname="main">
{!user ? (
<div classname="login-container">
<h2>Login</h2>
<form onsubmit="{handleLogin}">
<div classname="form-group">
<label htmlfor="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div classname="form-group">
<label htmlfor="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Login</button>
</form>
</div>
) : (
<div classname="dashboard">
<div classname="upload-section">
<h2>Upload New Image</h2>
<form onsubmit="{handleUpload}">
<div classname="form-group">
<label htmlfor="file-upload">Select Image:</label>
<input type="file" id="file-upload" accept="image/*" onchange="{handleFileChange}" required>
</div>
<div classname="form-group">
<label htmlfor="title">Title:</label>
<input type="text" id="title" value="{title}" onchange="{(e)"> setTitle(e.target.value)}
required
/>
</div>
<div classname="form-group">
<label htmlfor="description">Description:</label>
<textarea id="description" value="{description}" onchange="{(e)"> setDescription(e.target.value)}
></textarea>
</div>
<button type="submit" disabled>
{loading ? 'Uploading...' : 'Upload'}
</button>
</form>
</div>
<div classname="gallery-section">
<h2>Your Images</h2>
{loading ? (
<p>Loading...</p>
) : images.length === 0 ? (
<p>No images found. Upload your first image!</p>
) : (
<div classname="image-grid">
{images.map((image) => (
<div key="{image.imageId}" classname="image-card">
<img src="%7B%60https://my-photo-sharing-app.s3.amazonaws.com/%24%7Bimage.processedKey.replace('.'," alt="{image.title}">
<h3>{image.title}</h3>
<p>{image.description}</p>
<div classname="image-actions">
<button>View</button>
<button>Share</button>
</div>
</div>
))}
</div>
)}
</div>
</div>
)}
</main>
<footer classname="footer">
<p>© 2025 Photo Sharing App</p>
</footer>
</div>
);
}
export default App;
5. CloudFront 배포 설정
CloudFront를 사용하여 정적 자산과 이미지를 더 빠르게 제공할 수 있어:
- CloudFront 배포 생성
- 원본 설정:
- • S3 버킷 (정적 자산)
- • EC2 인스턴스 (API 엔드포인트)
- 캐시 동작 설정:
- • API 요청은 캐시하지 않음
- • 정적 자산은 장기간 캐시
- • 이미지는 중간 기간 캐시
- HTTPS 설정
- 지리적 제한 설정 (선택사항)
🚀 프로젝트 확장 아이디어
이 기본 프로젝트를 더 확장할 수 있는 몇 가지 아이디어를 소개할게:
- AI 이미지 분석: AWS Rekognition을 사용하여 이미지 내용 자동 태깅
- 소셜 기능: 팔로우, 좋아요, 댓글 기능 추가
- 커스텀 필터: 사용자가 직접 이미지 필터를 만들고 공유
- 프리미엄 기능: 구독 모델로 고급 기능 제공
- 모바일 앱: React Native로 모바일 앱 개발
이 프로젝트는 EC2, S3, Lambda의 강점을 모두 활용하는 좋은 예시야. EC2는 웹 서버와 API를 호스팅하고, S3는 이미지와 정적 자산을 저장하며, Lambda는 이미지 처리와 알림을 담당해!
실제로 이런 프로젝트를 구현하면서 AWS 서비스의 연동 방법을 배우면, 클라우드 아키텍처에 대한 이해도가 크게 향상될 거야. 재능넷에서도 이와 같은 실전 프로젝트를 통해 AWS 클라우드 서비스를 마스터한 개발자들이 많이 활동하고 있어. 다음으로는 비용 최적화 전략에 대해 알아보자!
7. 비용 최적화 전략 💰
AWS 서비스를 사용하면서 가장 중요한 부분 중 하나는 비용 관리야. 효율적인 비용 관리를 통해 불필요한 지출을 줄이고 ROI(투자 수익률)를 극대화할 수 있어! 각 서비스별로 비용을 최적화하는 방법을 알아보자.
EC2 비용 최적화
- 적절한 인스턴스 유형 선택: 워크로드에 맞는 인스턴스 유형을 선택하는 것이 중요해. 2025년에는 AWS Cost Explorer의 인스턴스 추천 기능이 더욱 정교해져서 최적의 인스턴스 유형을 추천해줘.
- 예약 인스턴스(RI) 활용: 1년 또는 3년 약정으로 최대 72% 할인 받기
- Savings Plans 활용: 유연한 사용량에 대해 약정 기반 할인 받기
- 스팟 인스턴스 활용: 내결함성이 있는 워크로드에 최대 90% 할인된 가격으로 이용
- Auto Scaling 활용: 필요한 만큼만 인스턴스 실행
- Graviton 인스턴스 사용: ARM 기반 프로세서로 더 나은 가격 대비 성능 제공
- 미사용 리소스 정리: 사용하지 않는 EBS 볼륨, 탄력적 IP 등 정리
💡 EC2 비용 절감 사례 연구
한 스타트업이 EC2 비용을 60% 절감한 방법:
- 모든 개발/테스트 환경을 밤과 주말에 자동으로 중지하는 스케줄링 설정
- 프로덕션 워크로드를 분석하여 오버프로비저닝된 인스턴스 다운사이징
- 예측 가능한 워크로드에 예약 인스턴스 구매
- 배치 처리 작업을 스팟 인스턴스로 마이그레이션
- Graviton 인스턴스로 마이그레이션하여 추가 20% 비용 절감
S3 비용 최적화
- 적절한 스토리지 클래스 선택: 액세스 빈도에 따라 최적의 클래스 선택
- 수명 주기 정책 설정: 오래된 객체를 저비용 스토리지로 자동 이동
- S3 Intelligent-Tiering: 액세스 패턴에 따라 자동으로 스토리지 클래스 조정
- 불필요한 객체 버전 정리: 버전 관리 사용 시 오래된 버전 삭제
- S3 분석 도구 활용: 스토리지 사용 패턴 분석 및 최적화
- 불완전한 멀티파트 업로드 정리: 완료되지 않은 업로드 자동 삭제
- S3 요청 최적화: 불필요한 LIST 요청 줄이기
Lambda 비용 최적화
- 메모리 설정 최적화: 적절한 메모리 할당으로 실행 시간 단축
- 코드 최적화: 효율적인 코드로 실행 시간 단축
- 콜드 스타트 최소화: Provisioned Concurrency 전략적 사용
- 불필요한 종속성 제거: 패키지 크기 최소화
- 배치 처리: 여러 항목을 한 번에 처리하여 호출 횟수 줄이기
- 타임아웃 설정: 적절한 타임아웃으로 비용 낭비 방지
- Step Functions 활용: 복잡한 워크플로우를 효율적으로 관리
💡 Lambda 배치 처리 최적화 예시 (Node.js)
// 비효율적인 방식: 각 항목마다 별도의 Lambda 호출
// 효율적인 방식: 배치로 처리
exports.handler = async (event) => {
// SQS 이벤트에서 여러 메시지를 한 번에 처리
const records = event.Records;
console.log(`Processing ${records.length} messages in batch`);
// 모든 메시지 병렬 처리
const processPromises = records.map(async (record) => {
const body = JSON.parse(record.body);
// 각 메시지 처리 로직
await processItem(body);
});
// 모든 처리 완료 대기
await Promise.all(processPromises);
return {
statusCode: 200,
body: `Successfully processed ${records.length} messages`
};
};
종합적인 비용 최적화 전략
- AWS Budgets 설정: 예산을 설정하고 초과 시 알림 받기
- AWS Cost Explorer 활용: 비용 패턴 분석 및 최적화 기회 발견
- 태깅 전략 수립: 리소스에 태그를 지정하여 비용 할당 및 추적
- Trusted Advisor 활용: 비용 최적화 권장 사항 확인
- 리전 선택 최적화: 비용이 저렴한 리전 활용 (데이터 주권 고려)
- 데이터 전송 비용 최적화: 같은 리전 내에서 데이터 전송, CloudFront 활용
- 서버리스 아키텍처 고려: 사용량이 적은 워크로드는 서버리스로 전환
🔍 AWS 비용 분석 도구
2025년 기준 AWS에서 제공하는 주요 비용 분석 및 최적화 도구:
- AWS Cost Explorer: 비용 및 사용량 패턴 시각화
- AWS Budgets: 예산 설정 및 알림
- AWS Cost Anomaly Detection: 비정상적인 지출 감지
- AWS Compute Optimizer: 리소스 크기 최적화 추천
- AWS Trusted Advisor: 비용 최적화 권장 사항
- AWS Cost and Usage Report: 상세한 비용 및 사용량 데이터
- AWS Cost Categories: 비용 그룹화 및 분류
- AWS Cost Allocation Tags: 태그 기반 비용 할당
2025년에는 AWS가 AI 기반 비용 최적화 도구를 강화하여, 사용 패턴을 분석하고 자동으로 비용 절감 방안을 추천해줘. 이를 통해 평균 30% 이상의 비용 절감이 가능해졌어!
비용 최적화는 지속적인 과정이야. 정기적으로 사용 패턴을 분석하고, 새로운 서비스와 가격 모델을 검토하며, 아키텍처를 최적화하는 것이 중요해. 재능넷에서도 AWS 비용 최적화 전문가들이 다양한 비용 절감 전략을 공유하고 있어. 다음으로는 보안 모범 사례에 대해 알아보자!
8. 보안 모범 사례 🔒
AWS 클라우드 서비스를 사용할 때 보안은 가장 중요한 요소 중 하나야. AWS는 공동 책임 모델을 따르는데, 이는 AWS가 인프라의 보안을 책임지고, 고객은 그 위에 구축하는 것의 보안을 책임진다는 의미야. EC2, S3, Lambda 각각에 대한 보안 모범 사례를 알아보자.
EC2 보안 모범 사례
- 보안 그룹 최소 권한 원칙: 필요한 포트만 개방
- IMDSv2 사용: 인스턴스 메타데이터 서비스 보안 강화
- 키 페어 관리: 안전한 키 관리 및 정기적인 교체
- EBS 볼륨 암호화: 저장 데이터 암호화
- 패치 관리: 정기적인 보안 패치 적용
- VPC 설계: 프라이빗 서브넷 활용 및 네트워크 분리
- Systems Manager 활용: 안전한 원격 관리
- GuardDuty 활성화: 위협 탐지 및 모니터링
💡 EC2 보안 그룹 설정 예시
# 웹 서버를 위한 보안 그룹 설정
aws ec2 create-security-group \
--group-name web-server-sg \
--description "Security group for web servers" \
--vpc-id vpc-1234567890abcdef0
# HTTP 및 HTTPS 트래픽 허용
aws ec2 authorize-security-group-ingress \
--group-id sg-1234567890abcdef0 \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id sg-1234567890abcdef0 \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0
# SSH는 특정 IP에서만 허용
aws ec2 authorize-security-group-ingress \
--group-id sg-1234567890abcdef0 \
--protocol tcp \
--port 22 \
--cidr 203.0.113.0/24
S3 보안 모범 사례
- 버킷 퍼블릭 액세스 차단: 기본적으로 모든 퍼블릭 액세스 차단
- 버킷 정책 및 IAM 정책: 최소 권한 원칙 적용
- 서버 측 암호화: 저장 데이터 암호화 (SSE-S3, SSE-KMS, SSE-C)
- 버전 관리 활성화: 우발적인 삭제 및 변경 방지
- 객체 잠금: WORM(Write Once Read Many) 모델 적용
- 액세스 로깅: 모든 버킷 액세스 로깅
- CloudTrail 통합: API 호출 모니터링
- S3 Access Points: 세분화된 액세스 제어
🔒 S3 버킷 보안 설정 체크리스트
- 모든 버킷에 퍼블릭 액세스 차단 설정 활성화
- 필요한 경우에만 특정 객체에 대한 액세스 허용
- 모든 객체에 서버 측 암호화 적용
- 중요 데이터에 KMS 키를 사용한 암호화 적용
- 버전 관리 활성화
- 액세스 로깅 활성화
- Macie를 사용하여 민감한 데이터 스캔
- S3 객체 잠금 고려 (규정 준수 요구사항이 있는 경우)
Lambda 보안 모범 사례
- IAM 역할 최소 권한: 함수에 필요한 최소한의 권한만 부여
- 환경 변수 암호화: 민감한 정보 보호
- 코드 보안: 종속성 취약점 스캔 및 안전한 코딩 관행
- VPC 내 실행: 민감한 리소스에 접근하는 함수는 VPC 내에서 실행
- 계층 활용: 공통 코드를 계층으로 분리하여 보안 관리 용이
- 로깅 및 모니터링: CloudWatch Logs 및 X-Ray 활용
- 타임아웃 설정: 적절한 타임아웃으로 DoS 방지
- 코드 서명: 승인된 개발자의 코드만 배포
종합적인 보안 모범 사례
- IAM 모범 사례:
- • 루트 사용자 액세스 키 삭제
- • 최소 권한 원칙 적용
- • 역할 기반 액세스 제어
- • 정기적인 액세스 검토
- • MFA 활성화
- 암호화:
- • 전송 중 데이터 암호화 (TLS/SSL)
- • 저장 데이터 암호화 (EBS, S3, RDS 등)
- • KMS 또는 CloudHSM 활용
- 네트워크 보안:
- • VPC 설계 및 서브넷 분리
- • 보안 그룹 및 NACL 구성
- • VPN 또는 Direct Connect 사용
- • WAF 및 Shield 활용
- 모니터링 및 감사:
- • CloudTrail 활성화
- • CloudWatch 경보 설정
- • GuardDuty 활성화
- • Security Hub 활용
- 인시던트 대응:
- • 인시던트 대응 계획 수립
- • 자동화된 대응 구현
- • 정기적인 훈련 및 시뮬레이션
🛡️ AWS 보안 서비스 활용 가이드
2025년 기준 AWS에서 제공하는 주요 보안 서비스:
- AWS IAM: 액세스 관리
- AWS Organizations: 다중 계정 관리
- AWS Config: 리소스 구성 관리 및 감사
- AWS CloudTrail: API 활동 로깅
- Amazon GuardDuty: 지능형 위협 탐지
- AWS Security Hub: 보안 상태 통합 관리
- Amazon Inspector: 취약점 평가
- AWS Shield: DDoS 보호
- AWS WAF: 웹 애플리케이션 방화벽
- AWS Macie: 민감한 데이터 검색 및 보호
2025년에는 AI 기반 보안 위협 탐지 및 대응 기능이 크게 강화되어, 제로데이 공격에도 효과적으로 대응할 수 있게 되었어!
보안은 지속적인 과정이며, AWS의 공동 책임 모델을 이해하고 적용하는 것이 중요해. 정기적인 보안 평가와 업데이트를 통해 시스템을 안전하게 유지하자!
AWS 클라우드 서비스를 안전하게 활용하기 위해서는 각 서비스의 보안 기능을 충분히 이해하고 적용하는 것이 중요해. 재능넷에서도 AWS 보안 전문가들이 다양한 보안 모범 사례와 팁을 공유하고 있어. 다음으로는 이 가이드의 마무리와 다음 단계에 대해 알아보자!
9. 마무리 및 다음 단계 🚀
지금까지 AWS의 핵심 서비스인 EC2, S3, Lambda에 대해 자세히 알아봤어. 이 세 가지 서비스는 AWS 클라우드의 기반이 되는 서비스로, 이를 마스터하면 다양한 클라우드 아키텍처를 구축할 수 있어!
배운 내용 요약
- EC2: 가상 서버를 프로비저닝하고 관리하는 방법
- S3: 객체 스토리지를 활용하여 파일을 저장하고 제공하는 방법
- Lambda: 서버리스 컴퓨팅으로 코드를 실행하는 방법
- 서비스 연동: 세 가지 서비스를 함께 활용하는 아키텍처 패턴
- 실전 프로젝트: 포토 공유 플랫폼 구축을 통한 실습
- 비용 최적화: AWS 서비스 비용을 효율적으로 관리하는 전략
- 보안 모범 사례: AWS 서비스를 안전하게 활용하는 방법
🌟 2025년 AWS 트렌드
현재 AWS 생태계에서 주목해야 할 주요 트렌드:
- 서버리스 아키텍처의 확산: Lambda, Step Functions, EventBridge 등을 활용한 서버리스 아키텍처가 주류로 자리잡고 있어.
- 컨테이너 오케스트레이션: ECS, EKS를 통한 컨테이너 기반 애플리케이션 배포가 표준화되고 있어.
- AI/ML 서비스 통합: SageMaker, Bedrock 등 AI/ML 서비스가 다른 AWS 서비스와 긴밀하게 통합되고 있어.
- 지속 가능한 클라우드: 탄소 발자국을 줄이기 위한 에너지 효율적인 서비스 선택이 중요해지고 있어.
- 멀티 클라우드 전략: AWS와 다른 클라우드 제공업체를 함께 활용하는 전략이 보편화되고 있어.
다음 단계: 더 배워볼 AWS 서비스
EC2, S3, Lambda를 마스터했다면, 다음으로 배워볼 만한 AWS 서비스들이야:
- Amazon RDS: 관계형 데이터베이스 서비스
- Amazon DynamoDB: NoSQL 데이터베이스 서비스
- Amazon API Gateway: API 생성, 배포, 관리
- AWS Step Functions: 서버리스 워크플로우 오케스트레이션
- Amazon CloudFront: 콘텐츠 전송 네트워크
- AWS Elastic Beanstalk: 애플리케이션 배포 및 관리
- Amazon ECS/EKS: 컨테이너 오케스트레이션
- AWS Amplify: 풀스택 웹 및 모바일 애플리케이션 개발
AWS 자격증 취득하기
AWS 지식을 검증하고 경력을 발전시키기 위해 AWS 자격증 취득을 고려해보는 것도 좋아. 2025년 기준 주요 AWS 자격증은 다음과 같아:
자격증 수준 | 자격증 이름 | 대상 |
---|---|---|
기초 | AWS Certified Cloud Practitioner | AWS 클라우드 기초 지식을 가진 모든 사람 |
어소시에이트 | AWS Certified Solutions Architect - Associate | AWS에서 분산 시스템을 설계하는 사람 |
AWS Certified Developer - Associate | AWS에서 애플리케이션을 개발하는 사람 | |
AWS Certified SysOps Administrator - Associate | AWS에서 시스템을 운영하는 사람 | |
프로페셔널 | AWS Certified Solutions Architect - Professional | 복잡한 AWS 아키텍처를 설계하는 경험이 있는 사람 |
AWS Certified DevOps Engineer - Professional | AWS에서 DevOps 방법론을 구현하는 사람 |
2025년에는 AI/ML 전문 자격증과 지속 가능한 클라우드 아키텍처 자격증이 새롭게 추가되었어. 자신의 경력 목표에 맞는 자격증을 선택하는 것이 좋아!
커뮤니티 참여하기
AWS 지식을 더 발전시키고 네트워킹하기 위해 다양한 커뮤니티에 참여해보는 것도 좋은 방법이야:
- AWS 사용자 그룹: 지역별 AWS 사용자 모임
- AWS re:Invent: AWS의 연례 컨퍼런스
- AWS 온라인 포럼: 질문과 답변을 공유하는 공간
- GitHub: AWS 관련 오픈 소스 프로젝트
- 재능넷: AWS 전문가들과 지식을 공유하고 협업할 수 있는 플랫폼
💼 AWS 클라우드 서비스 활용 사례
다양한 산업에서 AWS 클라우드 서비스를 활용한 성공 사례:
- 넷플릭스: 전체 스트리밍 인프라를 AWS에서 운영, 수억 명의 사용자에게 콘텐츠 제공
- 에어비앤비: AWS를 통해 글로벌 확장, 피크 시간대 트래픽 처리
- NASA: 화성 탐사 로버의 이미지 처리 및 저장에 AWS 활용
- 캐피탈 원: 레거시 시스템을 AWS로 마이그레이션하여 혁신 가속화
- 핀터레스트: AWS를 통해 사용자 증가에 따른 확장성 확보
AWS 클라우드 서비스는 계속해서 진화하고 있어. 지속적인 학습과 실습을 통해 최신 기술과 모범 사례를 익히는 것이 중요해!
이 가이드가 AWS EC2, S3, Lambda를 이해하고 활용하는 데 도움이 되었기를 바라. 재능넷에서는 이러한 AWS 클라우드 서비스에 대한 더 많은 정보와 실전 노하우를 공유하고 있으니, 지속적인 학습을 위해 재능넷 커뮤니티에 참여해보는 것도 좋은 방법이야. 클라우드 여정에서 행운을 빌어!
AWS 클라우드 서비스 마스터하기
EC2, S3, Lambda를 활용한 클라우드 아키텍처 구축에 관심이 있다면, 재능넷에서 AWS 전문가들과 함께 더 많은 지식과 경험을 나눠보세요!
질문, 피드백, 또는 추가 정보가 필요하시면 언제든지 재능넷 커뮤니티에 참여해주세요. 함께 성장하는 클라우드 여정을 시작합시다! 🚀
1. AWS 클라우드 서비스 소개 🌩️
안녕! 오늘은 AWS(Amazon Web Services)의 핵심 서비스인 EC2, S3, Lambda에 대해 함께 알아볼 거야. 2025년 현재, AWS는 전 세계 클라우드 시장의 약 33%를 차지하는 최대 클라우드 서비스 제공업체로, 이 세 가지 서비스는 AWS 생태계의 중심축이라고 할 수 있어.
프로그래밍과 개발에 관심 있는 사람이라면, 이 서비스들을 활용해 다양한 애플리케이션을 구축하고 배포하는 방법을 알아두면 정말 큰 도움이 될 거야. 특히 요즘처럼 AI와 빅데이터가 중요해진 시대에는 클라우드 서비스 활용 능력이 개발자의 필수 역량이 되었어!
🔍 알고 있니? AWS는 2025년 현재 전 세계 32개 리전, 102개의 가용 영역(AZ)을 운영 중이야. 이는 2023년보다 5개 리전, 15개 가용 영역이 늘어난 수치지!
재능넷에서도 많은 개발자들이 AWS 클라우드 서비스를 활용한 프로젝트 개발 재능을 공유하고 있어. 이 글을 통해 기본 개념부터 실전 활용법까지 배우고 나면, 너도 곧 클라우드 전문가로 거듭날 수 있을 거야! 😊
2. EC2: 가상 서버의 모든 것 🖥️
EC2(Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 서비스야. 쉽게 말하면, 인터넷에 연결된 컴퓨터를 빌려 쓰는 개념이라고 생각하면 돼. 물리적인 서버를 직접 구매하고 관리할 필요 없이, 필요한 만큼만 사용하고 비용을 지불하는 방식이지.
🔑 EC2의 핵심 특징
- 탄력적 확장성: 트래픽에 따라 서버를 쉽게 확장하거나 축소할 수 있어
- 다양한 인스턴스 타입: 2025년 현재 300개 이상의 인스턴스 타입 제공
- 다양한 운영체제: Linux, Windows, macOS 등 선택 가능
- 사용한 만큼 지불: 초 단위 요금제로 비용 효율적
- 글로벌 인프라: 전 세계 어디서든 서비스 배포 가능
EC2 인스턴스 시작하기
EC2 인스턴스를 시작하는 과정을 함께 알아보자. 2025년 AWS 콘솔은 이전보다 더 직관적으로 개선되었어!
- AWS 관리 콘솔에 로그인한다.
- EC2 서비스로 이동한다.
- "인스턴스 시작" 버튼을 클릭한다.
- AMI(Amazon Machine Image)를 선택한다.
AMI는 서버에 필요한 운영체제와 소프트웨어가 미리 구성된 템플릿이야. 2025년 현재 Amazon Linux 3, Ubuntu 24.04 LTS, Windows Server 2025 등이 인기 있는 선택지지.
- 인스턴스 유형을 선택한다.
2025년 기준 최신 인스턴스 패밀리는 다음과 같아:
- • C8g: 컴퓨팅 최적화 (Graviton4 프로세서)
- • M8g: 범용 (Graviton4 프로세서)
- • R8g: 메모리 최적화 (Graviton4 프로세서)
- • P6: GPU 최적화 (NVIDIA H200 GPU)
- • T5: 버스트 가능 성능
- 인스턴스 세부 정보를 구성한다.
- 스토리지를 추가한다.
- 태그를 추가한다.
- 보안 그룹을 구성한다.
- 키 페어를 생성하거나 선택한다.
- "인스턴스 시작" 버튼을 클릭한다.
인스턴스가 시작되면, SSH(Linux) 또는 RDP(Windows)를 사용하여 접속할 수 있어. 2025년부터는 AWS 콘솔에서 직접 브라우저 기반 터미널로 접속하는 기능이 더욱 강화되었어.
💡 EC2 인스턴스에 SSH로 접속하기
ssh -i "your-key.pem" ec2-user@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
Windows 사용자라면 PuTTY나 Windows Terminal을 사용할 수 있어. 2025년부터는 Windows Terminal이 SSH 클라이언트를 기본 내장하고 있어 더 편리해졌지!
EC2 인스턴스 타입 선택 가이드
인스턴스 타입 선택은 애플리케이션의 성능과 비용에 직접적인 영향을 미쳐. 목적에 맞는 인스턴스를 선택하는 것이 비용 최적화의 첫 번째 단계야!
인스턴스 패밀리 | 최적화 용도 | 사용 사례 |
---|---|---|
T 시리즈 | 버스트 가능 성능 | 개발/테스트 환경, 소규모 웹 서버 |
M 시리즈 | 범용 | 웹 서버, 소규모 DB |
C 시리즈 | 컴퓨팅 최적화 | 배치 처리, 고성능 웹 서버 |
R 시리즈 | 메모리 최적화 | 인메모리 DB, 빅데이터 분석 |
P 시리즈 | GPU 최적화 | 머신러닝, 딥러닝, 렌더링 |
2025년에는 Graviton4 프로세서 기반 인스턴스가 x86 기반 인스턴스보다 최대 40% 더 높은 성능과 30% 더 나은 에너지 효율성을 제공해. 특히 ARM 아키텍처에 최적화된 워크로드라면 비용 대비 성능이 훨씬 뛰어나지!
EC2 Auto Scaling으로 자동 확장 구성하기
트래픽이 증가하면 자동으로 인스턴스를 추가하고, 감소하면 자동으로 인스턴스를 제거하는 Auto Scaling 기능은 EC2의 강력한 기능 중 하나야. 2025년에는 AI 기반 예측 스케일링 기능이 추가되어 더욱 효율적인 리소스 관리가 가능해졌어!
Auto Scaling 그룹을 설정하는 기본 단계는 다음과 같아:
- 시작 템플릿 생성 (AMI, 인스턴스 타입, 보안 그룹 등 정의)
- Auto Scaling 그룹 생성
- 최소, 최대, 원하는 용량 설정
- 스케일링 정책 설정 (CPU 사용률, 네트워크 트래픽 등)
- 알림 설정 (선택사항)
🌱 EC2 비용 절감 팁
EC2를 사용하면서 비용을 절감하는 몇 가지 방법을 알아볼까?
- 예약 인스턴스(RI): 1년 또는 3년 약정으로 최대 72% 할인
- 스팟 인스턴스: 미사용 EC2 용량을 최대 90% 할인된 가격에 이용
- Savings Plans: 1년 또는 3년 약정으로 유연한 사용량에 대해 할인
- Graviton 인스턴스: ARM 기반 프로세서로 더 나은 가격 대비 성능
- Auto Scaling: 필요한 만큼만 인스턴스 실행
EC2는 AWS 생태계의 중심이라고 할 수 있어. 웹 서버, 애플리케이션 서버, 게임 서버, 배치 처리 등 다양한 워크로드를 실행할 수 있지. 재능넷에서도 많은 개발자들이 EC2를 활용한 서버 구축 및 운영 노하우를 공유하고 있어. 다음으로는 데이터 저장소인 S3에 대해 알아보자!
3. S3: 무한한 스토리지의 세계 📦
S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지 서비스야. 쉽게 말하면 인터넷에 연결된 무한대의 하드 디스크라고 생각하면 돼. 파일을 저장하고, 검색하고, 백업하는 용도로 널리 사용되며, 99.999999999%(11 9's)의 내구성을 제공해!
🔑 S3의 핵심 특징
- 무한한 확장성: 저장 용량에 제한이 없음
- 높은 내구성과 가용성: 데이터 손실 위험 최소화
- 다양한 스토리지 클래스: 접근 빈도와 비용에 따라 선택 가능
- 버전 관리: 파일의 이전 버전 보존 가능
- 정적 웹사이트 호스팅: HTML, CSS, JS 파일 호스팅 가능
- 이벤트 알림: 파일 업로드/삭제 시 알림 트리거 가능
S3 버킷 생성하기
S3에서는 '버킷'이라는 컨테이너에 파일(객체)을 저장해. 버킷 이름은 전 세계적으로 고유해야 해. 버킷을 생성하는 과정을 함께 알아보자.
- AWS 관리 콘솔에 로그인한다.
- S3 서비스로 이동한다.
- "버킷 만들기" 버튼을 클릭한다.
- 버킷 이름을 입력한다.
버킷 이름은 전 세계적으로 고유해야 하며, DNS 명명 규칙을 따라야 해. 예: my-unique-bucket-name-2025
- 리전을 선택한다.
2025년 기준 새로 추가된 리전으로는 멕시코, 말레이시아, 태국 리전이 있어.
- 객체 소유권 설정을 구성한다.
- 퍼블릭 액세스 차단 설정을 구성한다.
보안을 위해 기본적으로 모든 퍼블릭 액세스가 차단되어 있어. 웹사이트 호스팅 등의 목적이 아니라면 이 설정을 유지하는 것이 좋아.
- 버킷 버전 관리를 설정한다.
- 태그를 추가한다.
- 암호화 설정을 구성한다.
- "버킷 만들기" 버튼을 클릭한다.
S3에 파일 업로드하기
버킷을 생성한 후에는 파일(객체)을 업로드할 수 있어. 다양한 방법으로 파일을 업로드할 수 있지만, 가장 기본적인 방법은 콘솔을 통한 업로드야.
- 생성한 버킷을 클릭한다.
- "업로드" 버튼을 클릭한다.
- 업로드할 파일을 선택하거나 드래그 앤 드롭한다.
- 추가 설정(권한, 메타데이터, 스토리지 클래스 등)을 구성한다.
- "업로드" 버튼을 클릭한다.
대용량 파일이나 많은 파일을 업로드할 때는 AWS CLI나 SDK를 사용하는 것이 더 효율적이야.
💡 AWS CLI로 S3 파일 업로드하기
aws s3 cp myfile.txt s3://my-bucket/myfile.txt
여러 파일을 한 번에 업로드하려면:
aws s3 sync my-local-folder/ s3://my-bucket/my-folder/
S3 정적 웹사이트 호스팅
S3의 강력한 기능 중 하나는 정적 웹사이트를 호스팅할 수 있다는 거야. HTML, CSS, JavaScript 파일을 S3에 업로드하고, 버킷을 웹사이트로 구성하면 돼. 2025년에는 S3 웹사이트에 자동으로 HTTPS를 적용할 수 있는 기능이 추가되었어!
S3 정적 웹사이트 호스팅 설정 방법:
- 버킷 속성으로 이동한다.
- "정적 웹사이트 호스팅" 섹션에서 "편집" 버튼을 클릭한다.
- "정적 웹사이트 호스팅 활성화"를 선택한다.
- 인덱스 문서(예: index.html)와 오류 문서를 지정한다.
- "변경 사항 저장" 버튼을 클릭한다.
- 버킷의 퍼블릭 액세스 차단 설정을 비활성화한다.
- 버킷 정책을 추가하여 객체에 대한 퍼블릭 읽기 액세스를 허용한다.
📝 S3 버킷 정책 예시 (웹사이트 호스팅용)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
설정이 완료되면 S3에서 제공하는 웹사이트 엔드포인트 URL을 통해 웹사이트에 접속할 수 있어. 일반적으로 URL 형식은 http://your-bucket-name.s3-website-region.amazonaws.com
이야.
S3 수명 주기 관리
S3에 저장된 객체의 수명 주기를 자동으로 관리할 수 있어. 예를 들어, 30일 후에는 Standard에서 Standard-IA로, 90일 후에는 Glacier로 자동 이동시키는 규칙을 설정할 수 있지.
이를 통해 스토리지 비용을 최적화할 수 있어. 2025년에는 AI 기반 수명 주기 추천 기능이 추가되어, 액세스 패턴을 분석하고 최적의 수명 주기 정책을 추천해줘!
🌱 S3 비용 절감 팁
S3를 사용하면서 비용을 절감하는 몇 가지 방법을 알아볼까?
- 적절한 스토리지 클래스 선택: 액세스 빈도에 따라 최적의 클래스 선택
- 수명 주기 정책 설정: 오래된 객체를 저비용 스토리지로 자동 이동
- S3 Intelligent-Tiering: 액세스 패턴에 따라 자동으로 스토리지 클래스 조정
- 불필요한 객체 버전 정리: 버전 관리 사용 시 오래된 버전 삭제
- S3 분석 도구 활용: 스토리지 사용 패턴 분석 및 최적화
S3는 단순한 파일 저장소를 넘어, 웹사이트 호스팅, 백업 및 복구, 빅데이터 분석, 콘텐츠 배포 등 다양한 용도로 활용할 수 있어. 재능넷에서도 많은 개발자들이 S3를 활용한 효율적인 데이터 관리 방법을 공유하고 있지. 다음으로는 서버리스 컴퓨팅의 핵심인 Lambda에 대해 알아보자!
4. Lambda: 서버리스 컴퓨팅의 혁명 ⚡
Lambda는 AWS에서 제공하는 서버리스 컴퓨팅 서비스야. 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있어. 코드가 실행된 시간만큼만 비용을 지불하므로, 사용량이 적은 애플리케이션에 매우 경제적이야!
🔑 Lambda의 핵심 특징
- 서버리스: 서버 관리 없이 코드 실행
- 자동 확장: 트래픽에 따라 자동으로 확장
- 이벤트 기반: 다양한 AWS 서비스의 이벤트에 반응
- 다양한 언어 지원: Node.js, Python, Java, Go, Ruby, .NET, Rust 등
- 사용한 만큼 지불: 실행 시간과 메모리 사용량에 따라 요금 부과
- 타임아웃 제한: 2025년 기준 최대 30분까지 실행 가능
Lambda 함수 생성하기
Lambda 함수를 생성하는 과정을 함께 알아보자. 2025년 AWS 콘솔에서는 함수 생성 과정이 더욱 간소화되었어!
- AWS 관리 콘솔에 로그인한다.
- Lambda 서비스로 이동한다.
- "함수 생성" 버튼을 클릭한다.
- 함수 생성 방법을 선택한다.
- • 처음부터 새로 작성
- • 블루프린트 사용
- • 컨테이너 이미지
- • 서버리스 앱 저장소
- 함수 이름을 입력한다.
- 런타임(프로그래밍 언어)을 선택한다.
2025년 기준 최신 런타임으로는 Node.js 20.x, Python 3.12, Java 21, .NET 8, Go 1.22, Ruby 3.3, Rust 1.75 등이 지원돼.
- 실행 역할을 설정한다.
- "함수 생성" 버튼을 클릭한다.
함수가 생성되면, 코드 편집기에서 함수 코드를 작성하거나 수정할 수 있어. 간단한 Python Lambda 함수 예시를 살펴볼까?
💡 간단한 Python Lambda 함수 예시
def lambda_handler(event, context):
# 이벤트에서 이름 파라미터 가져오기
name = event.get('name', 'World')
# 응답 생성
response = {
'statusCode': 200,
'body': f'Hello, {name}! Welcome to AWS Lambda in 2025!'
}
return response
Lambda 트리거 설정하기
Lambda 함수는 다양한 이벤트에 의해 트리거될 수 있어. 가장 일반적인 트리거 몇 가지를 살펴볼까?
- API Gateway: HTTP 요청에 응답하는 API 생성
- S3 이벤트: 파일 업로드/삭제 시 함수 실행
- CloudWatch Events: 일정에 따라 함수 실행
- DynamoDB Streams: 데이터베이스 변경 시 함수 실행
- SQS: 메시지 큐에서 메시지 처리
- SNS: 알림 처리
트리거를 설정하는 방법은 다음과 같아:
- Lambda 함수 페이지에서 "트리거 추가" 버튼을 클릭한다.
- 트리거 유형을 선택한다.
- 트리거 구성을 설정한다.
- "추가" 버튼을 클릭한다.
🔄 Lambda 함수 버전 관리와 별칭
Lambda 함수의 버전을 관리하고 별칭을 사용하면 안전하게 새 버전을 배포할 수 있어.
- 버전: 함수 코드와 구성의 스냅샷
- 별칭: 특정 버전을 가리키는 포인터
- 트래픽 이동: 별칭을 사용하여 점진적으로 트래픽 이동 가능
2025년에는 카나리 배포 기능이 강화되어, 새 버전으로 트래픽을 1%씩 점진적으로 이동시키는 것이 가능해졌어!
Lambda 함수 모니터링
Lambda 함수의 성능과 오류를 모니터링하는 것은 매우 중요해. AWS는 CloudWatch를 통해 Lambda 함수 모니터링을 위한 다양한 도구를 제공해.
2025년에는 Lambda Insights가 더욱 강화되어, 함수의 성능 병목 현상을 자동으로 감지하고 개선 방안을 제안해줘!
주요 모니터링 지표:
- 호출 수: 함수가 호출된 횟수
- 오류 수: 함수 실행 중 발생한 오류 수
- 지연 시간: 함수 실행에 걸린 시간
- 제한 수: 동시 실행 제한으로 인해 제한된 호출 수
- 메모리 사용량: 함수가 사용한 메모리 양
Lambda 함수 최적화
Lambda 함수의 성능을 최적화하고 비용을 절감하는 몇 가지 방법을 알아볼까?
🌱 Lambda 최적화 팁
- 메모리 설정 최적화: 메모리를 늘리면 CPU 성능도 향상되어 전체 실행 시간이 줄어들 수 있어. 2025년에는 자동 메모리 최적화 기능이 추가되었어!
- 콜드 스타트 최소화: Provisioned Concurrency를 사용하거나, 함수를 주기적으로 호출하여 웜 상태 유지
- 종속성 최소화: 필요한 라이브러리만 포함하여 패키지 크기 줄이기
- 연결 재사용: 데이터베이스 연결 등을 함수 핸들러 외부에서 초기화
- 임시 스토리지 활용: /tmp 디렉토리를 사용하여 임시 파일 처리
💡 Lambda 함수에서 데이터베이스 연결 최적화 예시 (Node.js)
// 전역 변수로 연결 객체 선언
let connection;
// 연결 초기화 함수
async function initializeConnection() {
if (!connection) {
connection = await mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
}
return connection;
}
// Lambda 핸들러
exports.handler = async (event) => {
// 연결 초기화 (컨테이너 재사용 시 기존 연결 활용)
const conn = await initializeConnection();
// 데이터베이스 쿼리 실행
const [rows] = await conn.execute('SELECT * FROM users');
return {
statusCode: 200,
body: JSON.stringify(rows)
};
};
Lambda는 서버리스 아키텍처의 핵심 구성 요소로, 개발자가 인프라 관리 없이 코드에만 집중할 수 있게 해줘. 특히 이벤트 기반 애플리케이션, 백엔드 API, 데이터 처리 파이프라인 등에 적합해. 재능넷에서도 많은 개발자들이 Lambda를 활용한 서버리스 애플리케이션 개발 노하우를 공유하고 있어. 다음으로는 이 세 가지 서비스를 연동하는 방법에 대해 알아보자!
5. 세 가지 서비스 연동하기 🔄
지금까지 EC2, S3, Lambda에 대해 각각 알아봤어. 이제 이 세 가지 서비스를 연동하여 더 강력한 애플리케이션을 구축하는 방법을 알아보자. 세 서비스의 장점을 결합하면 확장성, 비용 효율성, 유연성을 모두 갖춘 아키텍처를 구현할 수 있어!
시나리오 1: 이미지 처리 애플리케이션
사용자가 이미지를 업로드하면 자동으로 크기를 조정하고 워터마크를 추가하는 애플리케이션을 만들어보자.
- EC2: 웹 애플리케이션 호스팅 (사용자 인터페이스 및 API)
- S3: 원본 이미지와 처리된 이미지 저장
- Lambda: S3에 업로드된 이미지 자동 처리
작동 흐름:
- 사용자가 EC2에서 호스팅되는 웹 애플리케이션을 통해 이미지 업로드
- 웹 애플리케이션은 이미지를 S3 버킷의 "원본" 폴더에 저장
- S3 이벤트가 Lambda 함수 트리거
- Lambda 함수가 이미지를 처리하고 "처리됨" 폴더에 저장
- 웹 애플리케이션이 처리된 이미지 URL을 사용자에게 제공
💡 이미지 처리 Lambda 함수 예시 (Python)
import boto3
import PIL
from PIL import Image
import io
s3 = boto3.client('s3')
def lambda_handler(event, context):
# 이벤트에서 버킷 이름과 키 가져오기
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# 원본 이미지가 아닌 경우 처리하지 않음
if not key.startswith('original/'):
return
# 원본 이미지 다운로드
response = s3.get_object(Bucket=bucket, Key=key)
image_content = response['Body'].read()
# 이미지 처리
image = Image.open(io.BytesIO(image_content))
# 이미지 크기 조정 (예: 800x600)
resized_image = image.resize((800, 600))
# 처리된 이미지를 메모리에 저장
buffer = io.BytesIO()
resized_image.save(buffer, format=image.format)
buffer.seek(0)
# 처리된 이미지를 S3에 업로드
processed_key = key.replace('original/', 'processed/')
s3.put_object(
Bucket=bucket,
Key=processed_key,
Body=buffer,
ContentType=f'image/{image.format.lower()}'
)
return {
'statusCode': 200,
'body': f'Successfully processed {key}'
}
시나리오 2: 서버리스 웹 애플리케이션
EC2 없이 완전 서버리스 아키텍처로 웹 애플리케이션을 구축할 수도 있어.
- S3: 정적 웹사이트 호스팅 (HTML, CSS, JavaScript)
- Lambda + API Gateway: 백엔드 API
- S3: 사용자 업로드 파일 저장
작동 흐름:
- 사용자가 S3에서 호스팅되는 정적 웹사이트 접속
- 프론트엔드 JavaScript가 API Gateway를 통해 Lambda 함수 호출
- Lambda 함수가 비즈니스 로직 처리 및 데이터 반환
- 사용자가 파일을 업로드하면 S3에 직접 저장 (미리 서명된 URL 사용)
🔒 S3 미리 서명된 URL 생성 Lambda 함수 (Node.js)
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
// 요청에서 파일 이름과 타입 가져오기
const { fileName, fileType } = JSON.parse(event.body);
// 현재 타임스탬프를 사용하여 고유한 키 생성
const key = `uploads/${Date.now()}-${fileName}`;
// 미리 서명된 URL 생성 파라미터
const params = {
Bucket: process.env.UPLOAD_BUCKET,
Key: key,
ContentType: fileType,
Expires: 300 // 5분 동안 유효
};
try {
// 미리 서명된 URL 생성
const signedUrl = await s3.getSignedUrlPromise('putObject', params);
// 클라이언트에 URL과 키 반환
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify({
signedUrl,
key
})
};
} catch (error) {
console.error('Error generating signed URL:', error);
return {
statusCode: 500,
body: JSON.stringify({ error: 'Failed to generate signed URL' })
};
}
};
시나리오 3: 하이브리드 아키텍처
EC2, S3, Lambda의 장점을 모두 활용하는 하이브리드 아키텍처도 구현할 수 있어.
- EC2: 메인 애플리케이션 서버 (지속적인 연결이 필요한 기능)
- S3: 정적 자산 및 사용자 업로드 파일 저장
- Lambda: 비동기 작업 및 이벤트 처리
작동 흐름:
- 사용자가 EC2에서 호스팅되는 웹 애플리케이션 접속
- 정적 자산(이미지, CSS, JS)은 S3에서 제공
- 사용자 요청에 따라 EC2가 메인 비즈니스 로직 처리
- 시간이 오래 걸리는 작업은 EC2가 SQS를 통해 Lambda로 위임
- Lambda가 백그라운드 작업 처리 후 결과를 데이터베이스에 저장
⚖️ 서비스 선택 가이드
각 서비스를 언제 사용해야 할지 고민된다면 이 가이드를 참고해봐:
- EC2 사용 시기:
- • 지속적인 연결이 필요한 경우 (웹소켓, 게임 서버 등)
- • 특정 운영체제나 소프트웨어가 필요한 경우
- • 완전한 제어가 필요한 경우
- • 장기적으로 높은 사용량이 예상되는 경우 (예약 인스턴스로 비용 절감)
- Lambda 사용 시기:
- • 이벤트 기반 처리가 필요한 경우
- • 간헐적인 트래픽이 있는 경우
- • 15분 이내에 완료되는 작업
- • 서버 관리 오버헤드를 피하고 싶은 경우
- S3 사용 시기:
- • 정적 파일 저장 및 제공
- • 대용량 데이터 저장
- • 백업 및 아카이브
- • 정적 웹사이트 호스팅
2025년에는 AWS Step Functions가 더욱 강화되어, EC2, Lambda, S3 등 다양한 서비스를 쉽게 연동할 수 있는 시각적 워크플로우 도구로 발전했어! 복잡한 비즈니스 프로세스를 코드 없이도 구현할 수 있게 되었지.
세 가지 서비스를 연동하면 각 서비스의 장점을 최대한 활용하면서 비용 효율적인 아키텍처를 구축할 수 있어. 재능넷에서도 AWS 서비스 연동 경험이 풍부한 개발자들이 다양한 아키텍처 패턴과 모범 사례를 공유하고 있어. 다음으로는 실전 프로젝트를 통해 이 세 가지 서비스를 활용하는 방법을 더 자세히 알아보자!
- 지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.
© 2025 재능넷 | All rights reserved.
댓글 0개