Skip to main content
[AWS] S3 정적 웹 호스팅하기
  1. Posts/

[AWS] S3 정적 웹 호스팅하기

·3 mins· ·
guide AWS S3 Static-Hosting ACM Route53 CloudFront
Juseok Oh
Author
Juseok Oh
DevOps Engineer @ Hamalab
Table of Contents

S3에 파일을 저장하면 파일(객체) 단위로 URL이 생성됩니다.
이를 활용하여 정적 콘텐츠 저장소로 사용할 수 있습니다.

동적웹 vs 정적웹

  • 동적웹은 DB와 상호작용한다. 기능은 많지만 보안 취약점이 존재할 수 있다.
  • 정적웹은 DB와 상호작용하지 않아 보안성이 높고 단순하다.
  • 보통 회사 소개 페이지나 브랜딩 사이트처럼 사용자와의 상호작용 기능이 없이 정적 콘텐츠 제공만을 원할 때, 정적 웹 호스팅을 구성한다.

1. 흐름도
#

static-flow

2. S3 - 정적 웹사이트 호스팅 설정
#

[버킷 > 속성] 에서 스크롤 최하단에 위치한 [정적 웹 사이트 호스팅 > 편집] 을 클릭합니다.

  • 정적 웹 사이트 호스팅 섹션에서 활성화를 체크하면 아래 옵션이 추가됩니다.
  • 호스팅 유형에서 정적 웹 사이트 호스팅을 체크 합니다.
  • 인덱스 문서오류 문서를 입력하고 변경 사항 저장을 클릭합니다.
    config-static

3. Route53 - 도메인 준비
#

도메인을 소유해야합니다. 도메인을 소유하고 있지 않다면 구매해야합니다.
도메인은 외부 도메인 등록사이트(GoDaddy, NameCheap, Cafe24, Gabia) 또는 AWS의 Route53 에서 구매할 수 있습니다.
AWS의 Route53 에서 구매했다면, 도메인과 같은 이름의 호스팅 영역(Hosted Zone) 을 생성합니다.

도메인을 AWS가 아닌 외부 도메인 등록사이트에서 구매했다면 도메인 네임서버(DNS)를 Route53에서 생성한 호스팅 영역에 생성된 네임서버(NS)로 수정하는 작업이 필요하다.

4. ACM - 인증서 발급
#

3번 과정이 완료되었다면 간단합니다.
[AWS Certificate Manager > 인증서 요청 > 퍼블릭 인증서 요청 > 도메인 이름 입력] 을 하고 [요청] 을 클릭합니다.
그리고 아래 화면에서 [Route53에서 레코드 생성] 을 누르고 5분정도 기다리면 인증서 생성이 완료됩니다.

acm-r53

5. CloudFront - 배포
#

[CloudFront > 배포] 를 클릭합니다.

5-1. 원본(Origin) 설정
#

1번 과정에서 설정했던 정적 호스팅 설정이 여기서 필요합니다.

  • Origin domain 에 1번에서 생성했던 버킷 주소를 선택합니다.
  • 아래 노란색 메시지박스가 생기면서 [웹 사이트 엔드포인트 사용] 버튼이 생깁니다. 클릭합니다.
    클릭하면 우측 이미지처럼 메뉴가 바뀌는것을 확인 할 수 있습니다.
  • 도메인이 website 문자열이 들어간 도메인으로 바뀌었다면 정상적으로 설정된 것입니다.
    cf-origin-endpoint

5-2. 캐시(Cache) 설정
#

  • 프로토콜 정책을 적절히 선택합니다.
  • HTTP 메소드를 적절히 선택합니다.
  • 캐시 정책을 적절히 선택합니다.
  • CORS 정책을 적절히 선택합니다.
    cf-cache

5-3. 일반 설정
#

  • WAF 보안사항을 적절히 선택합니다.
  • 가격 유형을 선택합니다.
  • 연결할 도메인 CNAME 을 입력합니다.
  • 4번 과정에서 생성했던 SSL 인증서를 선택하고 [배포생성] 을 클릭합니다.
    cf-conf
    이것으로 인프라 구성은 완료되었습니다.
    CloudFront 배포완료에 10 ~ 15분정도 소요됩니다.

6. GitLab 파이프라인 연결
#

6-1. CI/CD 환경변수
#

KeyValue
AWS_ACCESS_KEY_IDAWS IAM 액세스키(S3권한이 있는)
AWS_SECRET_ACCESS_KEYAWS IAM 시크릿키(S3권한이 있는)

6-2. 파이프라인 구성파일(.gitlab-ci.yml)
#

workflow:
  name: '정적 웹 호스팅 데모'
  auto_cancel:
    on_new_commit: interruptible

default:
  interruptible: true
  cache:
    key:
      files:
        - package.json
    paths:
      - ./.npm
  tags:
    - demo

stages:
  - build
  - deploy

build:
  image: node:18.16
  stage: build
  before_script:
    - npm i --cache .npm --prefer-offline
    - export NODE_OPTIONS=--max-old-space-size=4096
  script:
    - npm run build
  artifacts:
    paths:
      - ./dist
    expire_in: 10 mins
  rules:
    - if: $CI_COMMIT_REF_NAME == "demo"

deploy:
  image:
    name: amazon/aws-cli:arm64
    entrypoint: [""]
  stage: deploy
  script:
    - aws s3 sync ./dist s3://p373r-demo
  environment:
    name: demo
    url: https://demo.p373r.net
  needs: [build]
  when: on_success
  rules:
    - if: $CI_COMMIT_REF_NAME == "demo"
  • build:script 에서 소스코드를 빌드합니다.
  • deploy:script 에서 aws s3 sync ./dist s3://p373r-demo 커맨드로 빌드된 소스코드(dist)를 s3 버킷에 동기화해 변경된 소스코드를 반영합니다.

7. 전체 과정 요약
#

  1. 정적 콘텐츠를 저장할 저장소를 생성합니다. → S3
  2. 인터넷에 배포를 하기위한 도메인을 준비합니다. → Route53
  3. https 배포를 위한 SSL 인증서를 준비합니다. → ACM
  4. https 배포를 합니다. → CloudFront
  5. 소스코드를 S3 에 배포합니다. → GitLab

Related

[AWS] EC2 에 EFS 마운트하기
·1 min
guide AWS EC2 EFS
[AWS] EC2 신규 EBS 스토리지 추가
·3 mins
guide AWS EC2 EBS out-scale
[AWS] EC2 기존 EBS 스토리지 증설하기
·3 mins
guide AWS EC2 EBS up-scale
[SonarQube] 외부 플러그인 설치 방법
·1 min
guide SonarQube
[SonarQube] 설치 및 GitLab과의 연동 방법
·4 mins
guide Gitlab SonarQube Integration SAST
Installing k8s (with cilium)
·8 mins
study k8s object