개인서버

AWS S3와 EC2 설명 및 S3연결 방법

데이빗제이2 2024. 9. 25. 07:25

S3와 EC2 중 무엇을 사용해야 할지는 프로젝트의 특성과 요구사항에 따라 다름.

두 가지 방법을 비교:

1. AWS S3를 사용하는 경우

  • 적합한 상황: 정적인 웹사이트를 배포할 때
  • 장점:
    • 간단한 배포: S3 버킷에 빌드 파일을 업로드하는 것만으로 웹페이지를 호스팅할 수 있습니다.
    • 저렴한 비용: S3는 정적인 파일 호스팅에 대해 매우 저렴한 비용을 제공합니다.
    • 자동 스케일링: 트래픽이 증가해도 S3가 자동으로 처리해주므로 서버 관리가 필요 없습니다.
    • CloudFront 사용 가능: S3에 배포한 웹사이트에 CDN 서비스를 적용하여 전 세계 사용자에게 더 빠른 응답을 제공합니다.
    • HTTPS 지원: CloudFront와 함께 사용하면 무료 SSL 인증서를 쉽게 적용할 수 있습니다.
  • 단점:
    • 정적 콘텐츠에만 적합: S3는 서버 측 렌더링이나 API와의 연동을 위한 동적 콘텐츠를 직접 제공하지 않습니다.

2. AWS EC2를 사용하는 경우

  • 적합한 상황: 동적인 웹사이트 또는 서버 측 렌더링이 필요한 경우
  • 장점:
    • 동적 웹사이트 호스팅: 백엔드 서버를 실행하고 프론트엔드와 통합할 수 있습니다.
    • 유연한 설정: 서버에 대한 모든 설정을 직접 관리할 수 있어 다양한 환경에 맞게 구성할 수 있습니다.
    • 보안 및 접근 제어: SSH를 통한 접근 제어 및 설정이 가능합니다.
  • 단점:
    • 비용: EC2 인스턴스는 S3보다 비용이 더 높습니다. 특히 트래픽이 적은 경우에는 S3에 비해 비효율적일 수 있습니다.
    • 서버 관리 필요: 서버의 보안, 업그레이드, 유지보수 등을 직접 관리해야 합니다.

추천 방법:

  • 정적 웹사이트 (예: HTML, CSS, JavaScript만으로 이루어진 페이지 또는 프론트엔드만 존재하는 경우): AWS S3를 사용하는 것이 좋습니다. 비용이 저렴하고, 관리가 간단하며, CloudFront와 함께 사용하면 빠르고 안전하게 배포할 수 있습니다.
  • 동적 웹사이트 또는 백엔드가 필요한 프로젝트 (예: Node.js, Express, MySQL 등): AWS EC2를 사용하세요. EC2 인스턴스에서 백엔드 서버와 프론트엔드를 함께 운영할 수 있습니다.

 

하지만 프로젝트가 프론트엔드와 백엔드가 분리된 구조로 되어있고,

사용자가 프론트엔드에서 정적인 파일을 제공받기만 하면 되는 경우라면

프론트엔드를 S3에 배포하고,

백엔드는 EC2에 배포하는 방식을 채택하면

비용도 절약하면서 서비스의 안정성과 확장성을 확보할 수 있음.

 

 

프론트엔드를 S3에 배포하는 방법

1. S3 버킷 생성

  1. AWS 콘솔에 로그인하고, S3 서비스로 이동합니다.
  2. "Create bucket"을 클릭하고 버킷 이름을 입력하세요 (예: blahblah-frontend).
  3. AWS 리전은 가까운 곳으로 선택하세요.
  4. Public access를 허용하기 위해 "Block all public access" 옵션을 해제하세요.
  5. 버킷을 생성합니다.
더보기

1. 기본 암호화 설정

  • Amazon S3 관리형 키(SSE-S3)를 사용하는 서버 측 암호화: 선택해 두신 옵션이 적합합니다. 이 설정은 S3에서 데이터에 대한 기본적인 암호화를 제공하며, 특별한 보안 요구 사항이 없다면 이 옵션을 선택하는 것이 좋습니다.
  • 버킷 키 비활성화/활성화: 버킷 키는 비용 절감 측면에서 유리합니다. 기본적으로 '비활성화'로 두는 것이 안전하며, 이후 비용을 고려해 '활성화'할 수 있습니다.

2. 고급 설정 - 객체 잠금

  • 비활성화: 일반적으로 객체 잠금은 규제 준수 또는 데이터 변경 방지가 필요한 경우에만 사용합니다. 일반적인 웹사이트 호스팅의 경우 '비활성화'를 유지하시면 됩니다.

3. 객체 소유권

  • ACL 비활성화 (권장): 이 설정은 버킷 소유자에게만 모든 권한을 부여하고 ACL을 사용하지 않도록 설정하는 것입니다. 보안 및 권한 관리가 더 간단해지므로 일반적인 웹사이트 배포에는 이 설정을 유지하는 것이 좋습니다.

4. 퍼블릭 액세스 차단 설정

  • 모든 체크박스를 체크하여 모든 퍼블릭 액세스 차단을 적용할 수 있습니다. 그러나 웹사이트 배포를 위해서는 일부 퍼블릭 액세스가 필요하므로 아래와 같이 설정하세요:
    • 모든 퍼블릭 액세스 차단 해제: 이 옵션을 해제하지 않으면 웹사이트가 퍼블릭으로 접근 불가능합니다.
    • S3 관리 콘솔에서 사용 가능한 액세스 설정에 따라 필요한 설정만 남겨두세요. 예를 들어, 버킷에 있는 파일을 공개적으로 제공하려면 "새 객체에 대한 공용 액세스 허용"은 차단하지 않아야 합니다.

5. 버킷 버전 관리

  • 비활성화: 웹사이트 배포의 경우 버전 관리는 필요하지 않으므로 '비활성화'를 선택하는 것이 좋습니다.

 

2. S3 버킷을 정적 웹사이트 호스팅으로 설정

  1. 생성한 버킷을 클릭하고, "Properties" 탭으로 이동합니다.
  2. "Static website hosting" 섹션을 찾고 "Edit"를 클릭합니다.
  3. "Use this bucket to host a website"를 선택하고 다음을 입력합니다:
    • Index document: index.html
    • Error document: index.html (SPA인 경우 필요)
  4. 저장합니다.

3. 빌드 파일 준비

1. 난독화 및 빌드

blahblah/                         # 메인 프로젝트 루트 폴더
│
├── blahblah-frontend/             # 프론트엔드 원본 코드 서브모듈
│
├── blahblah-backend/              # 백엔드 원본 코드 서브모듈
│
├── blahblah-frontend-obfuscated/  # 난독화된 프론트엔드 코드 서브모듈
│
├── blahblah-backend-obfuscated/   # 난독화된 백엔드 코드 서브모듈
│
├── .gitmodules                       # 서브모듈 정보가 포함된 설정 파일
├── root_update.sh                         # (선택) 프로젝트 업데이트용 스크립트 파일
├── obfuscated_update.sh              # (선택) 난독화 업데이트용 스크립트 파일
└── .gitignore                        # Git에서 무시할 파일/폴더 목록

이런 구조로 작성

 

4. S3 버킷에 파일 업로드

  1. S3 콘솔에서 버킷으로 이동하여 "Upload"를 클릭합니다.
  2. 빌드된 build 폴더의 모든 파일과 폴더를 드래그하여 업로드합니다.
  3. 업로드가 완료되면 S3 버킷에 파일이 저장됩니다.
  4. 혹은 aws cli로 작성(하단에 작성법)
cd /~
sudo apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

cd ~/blahblah
더보기

AWS CLI에 자격 증명 설정

1. AWS CLI 설정

터미널에서 다음 명령어를 입력하여 자격 증명을 설정합니다:

aws configure

이 명령어를 실행하면 다음과 같이 입력하라는 요청이 나타납니다:

  1. AWS Access Key ID: AWS 계정의 액세스 키 ID
  2. AWS Secret Access Key: AWS 계정의 비밀 액세스 키
  3. Default region name: 사용할 AWS 리전 (예: ap-northeast-2는 서울 리전)
  4. Default output format: 기본 출력 형식 (json, text, table 중 선택 가능, 일반적으로 json 추천)

2. AWS Access Key 및 Secret Access Key 생성 방법

  • AWS Management Console 에 로그인합니다.
  • 오른쪽 상단의 프로필 메뉴에서 SeAWS Management Consolecurity Credentials를 클릭합니다.
  • Access keys 섹션에서 Create New Access Key를 선택합니다.
  • 생성된 Access Key IDSecret Access Key를 복사하고 aws configure 명령을 통해 입력합니다.

3. 설정 확인

설정이 완료되면 다음 명령어를 실행하여 제대로 설정되었는지 확인할 수 있습니다:

aws sts get-caller-identity

이 명령어는 현재 인증된 사용자의 정보를 반환합니다. 성공적으로 정보를 반환하면 자격 증명이 제대로 설정된 것입니다.

이제 다시 aws s3 sync 명령을 실행하면 S3 버킷에 파일이 업로드될 것입니다:

aws s3 sync ./blahblah-frontend-obfuscated s3://blahblah.com --delete


aws s3 cp ./blahblah-frontend-obfuscated s3://blahblah.com

버킷은 도메인과 이름이 같아야함

 

aws s3 sync는 동기화 명령으로, 지정된 로컬 디렉토리(./blahblah-frontend-obfuscated)와 S3 버킷(s3://blahblah-frontend) 간의 차이점을 비교하여, 변경된 파일만 업로드 또는 삭제하여 양쪽을 동기화합니다.
--delete 옵션을 사용하면, 로컬 디렉토리에 없는 파일은 S3 버킷에서 삭제됩니다. 즉, 로컬 디렉토리와 S3 버킷을 완전히 일치시키는 역할을 합니다.

aws s3 cp는 복사 명령으로, 단일 파일 또는 디렉토리를 지정된 위치로 복사하는 데 사용됩니다.

 

주의사항

  • AWS Access Key IDSecret Access Key는 중요한 정보이므로 다른 사람과 공유하지 않고 안전하게 보관하세요.
  • 잘못된 자격 증명을 입력하면 S3에 접근할 수 없으므로 정확하게 입력해야 합니다.

 

5. 버킷 정책 설정 (퍼블릭 액세스 허용)

1. S3 버킷에서 "Permissions" 탭으로 이동합니다.

2. "Bucket Policy"에서 "Edit"을 클릭하고 다음 정책을 추가합니다: 
로컬 환경에서 프로젝트 디렉터리로 이동하여 npm run build 명령을 실행해 프론트엔드 프로젝트를 빌드합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::blahblah.com/*"
        }
    ]
}

 

3. "blahblah-frontend" 부분은 생성한 버킷 이름으로 변경하세요.

4. 저장합니다.

6. 배포 확인

  1. "Properties" 탭의 "Static website hosting" 섹션에서 Endpoint URL을 확인할 수 있습니다.
  2. 이 URL을 통해 웹사이트가 제대로 배포되었는지 확인합니다.

7. 도메인 연결 (선택 사항)

  1. 가비아에서 도메인을 구매하셨으므로, Route 53에서 해당 도메인에 대한 호스팅 영역을 생성합니다.
  2. Route 53에서 S3 버킷을 A 레코드로 연결합니다.
  3. S3 버킷의 웹사이트 엔드포인트를 도메인과 연결하여 사용자들이 www.blahblah.com으로 접속할 수 있도록 설정합니다.

이렇게 하면 프론트엔드가 S3에 성공적으로 배포되어 www.blahblah.com 도메인을 통해 접근할 수 있게 됩니다. CloudFront를 통해 SSL 인증서를 적용하고 HTTPS로 서비스할 수도 있으니 참고하세요.