[React] React + S3 + Github Action+ 가비아 + Route53 + ACM + CloudFront 배포

Narcoker·어제
0

React

목록 보기
33/33

AWS S3

AWS 로그인을 하고 오른쪽 상단의 Region에서 웹서비스를 하려는 지역을 선택한다.


검색챙에 S3를 검색하여 S3에 들어간다.


오른쪽 상단의 "버킷 만들기" 버튼 클릭


  1. 버킷 이름 작성
  2. 객체 소유권에서 "ACL 활성화됨" 선택
  3. 이 버킷의 퍼블릭 액세스 차단 설정에서 "모두 해제"
  4. "버킷 만들기" 버튼 클릭

버킷 생성 완료


  1. 생성한 버킷 이름을 누르고 속성 탭으로 이동
  2. 하단으로 내려와서 "정적 웹 사이트 호스팅" 의 편집 클릭

  1. 정적 웹 사이트 호스팅을 활성화로 변겅
  2. 인덱스 문서와 오류 문서에 index.html 입력
  3. "변경 사항 저장" 버튼 클릭

  1. 권한 탭으로 이동
  2. 버킷 정책 설정 -> daitgym 자리에 생성한 버킷 이름 으로 변경
    2.1 정책 복사해서 사용할 경우, 주석 반드시 제거
{
    "Version": "2012-10-17",
    "Id": "Policy1684149724250",
    "Statement": [
        {
            "Sid": "Stmt1684149718410",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::daitgym/*" // 본인 버킷 이름 설정
        }
    ]
}

AWS IAM 설정

AWS IAM(Identity and Access Management)이란
AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이다.
IAM으로 리소스의 인증 및 권한 부여된 대상을 제어한다.


AWS 홈 검색에서 IAM 검색 후 클릭


왼쪽 탭에서 "사용자" 클릭


"사용자 생성" 버튼 클릭


사용자 이름 입력 후 다음 버튼 클릭


  1. 권한 옵션에서 "직접 정책 연결" 선택
  2. 권한 정책 검색에서 "AmazonS3FullAccess" 검색 후 선택

"사용자 생성 버튼" 클릭


추가 설정을 위해서 생성된 IAM 클릭


액세스 키에서 "엑세스 키 만들기" 클릭


Command Line Interface(CLI) 선택
"위의 권장 사항을 이해했으며 액세스 키 생성을 계속하려고 합니다."를 체크 후 "다음" 클릭


액세스 키 만들기 클릭
설명 태그 값 입력 안해도됨


엑세스 키의 정보가 담긴 .csv를 파일을 다운 후 사용

Github Action 설정

CI(Continuous Integration, 지속 통합)와
CD(Continuous Deployment, 지속 배포)를 위한 Github 서비스


  1. 배포하고자하는 프로젝트 리포지토리에서 Settings 탭 클릭
  2. 왼쪽 탭에서 Secrets and variables 클릭
  3. New repository secret 클릭

AWS_ACCESS_KEY_ID 생성
AWS_SECRET_ACCESS_KEY 생성
Secret에는 각각 AWS IAM 설정에서 만들었던 키의 정보를 입력(CSV 파일에서 확인)


생성 완료


  1. 상단 Actions 탭으로 이동
  2. "set up a workflow yourself" (파란 글자) 클릭

name: React build
on: 
  push: # main Branch에서 push 이벤트가 일어났을 때만 실행
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    if: github.event.pull_request.head.repository.fork == false  # Fork된 레포지토리에서 실행되지 않도록 설정
    steps:
      - name: Checkout source code. # 레포지토리 체크아웃
        uses: actions/checkout@main

      - name: Cache node modules # node modules 캐싱
        uses: actions/cache@v1
        with:
          path: node_modules # 프로젝트의 node_modules가 있는 경로로 설정
          key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-build-
            ${{ runner.OS }}-
      - name: Install Dependencies # 의존 파일 설치
        run: npm install # npm install을 실행할 경로로 설정

      - name: Create .env file # 환경 변수 파일 생성
        run: |
          echo "VITE_KAKAO_ADMIN_API=${{ secrets.VITE_KAKAO_ADMIN_API }}" >> .env
          echo "VITE_KAKAO_JS_API=${{ secrets.VITE_KAKAO_JS_API }}" >> .env
          echo "VITE_KAKAO_REST_API=${{ secrets.VITE_KAKAO_REST_API }}" >> .env
          echo "VITE_API_URL=${{ secrets.VITE_API_URL }}" >> .env
          echo "VITE_SITE_URL=${{ secrets.VITE_SITE_URL }}" >> .env
      - name: Build # React Build
        run: npm run build # npm run build를 실행할 경로로 설정

      - name: Deploy # S3에 배포하기
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 cp \
            --recursive \
            --region ap-northeast-2 \
            dist s3://daitgym

상단 코드 입력 후 저장
vite를 사용했기 때문에 빌드 경로는 dist 이다.
cra를 사용한 경우 dist 대신 build 로 변경 (맨 마지막 줄 확인)

이후 main 브랜치에 merge가 된 경우 CI/CD 가능


가비아에서 도메인 구매

가비아에서 원하는 도메인을 검색 후 구매
store가 가격이 가장 저렴한듯..?
shop은 사용하지말라는 글을 봤는데 이유는 찾아봐야할 듯 하다.


구매 내역은 My가비아에서 확인 가능

AWS Route53 설정

가비아에서 구매한 도메인을 Route53에 등록한다.

AWS 검색 창에 Route53 검색 후 클릭


  1. 좌측 탭의 호스팅 영역 클릭
  2. 호스팅 영역 생성

도메인 이름에 구매한 도메인 이름 작성
"호스팅 영역 생성" 클릭


NS 유형의 값/트래픽 라우팅 대상의 총 4개의 값이 있는 걸 확인


  1. 가비아에서 구매한 도메인으로 이동
  2. 네임서버 "설정" 버튼 클릭
  3. 1차~4차의 값을 NS유형에서 확인한 4개의 값으로 수정
    3.1 맨 뒤의 . 은 반드시 제거

ACM으로 SSL 인증서 발급

Region은 반드시 버지니아 북부로 설정
AWS 검색 창에 Certificate Manager 입력 후 이동


"인증서 요청" 클릭

"퍼블릭 인증서 요청" 클릭 후 다음


  1. 완전히 정규화된 도메인 이름에 구매한 도매인 이름 입력
  2. DNS 검증 선택
  3. 키 알고리즘 RSA 2048 선택
  4. 요청

20~40분 혹은 2~3시간 정도 소요
검증이 완료되면 발급됨으로 변경


Route 53 에서 레코드 생성 클릭


Route53 에 등록된 도메인 레코드에 CNAME이 생성된 것을 확인할 수 있음


이전에 생성한 Route 53 호스팅 영역 선택
"레코드 생성" 버튼 클릭


레코드 유형: A-IPv4주소 및 일부 AWS 리소스로 트래핑 라우팅
트레핑 라우팅 대상: S3 웹 사이트 엔드포인트에 대한 별칭

"레코드 생성" 버튼 클릭


레코드 유형 A 생성 완료
A, NS, SOA, CNAME 4개 모두 있어야 한다.

AWS CloudFront 연동

CDN 서비스로 정적 파일들을 캐싱해줌으로써 빠른 로딩을 지원하고
HTTPS을 지원한다.

AWS CloudFront에서 CloudFront 배포 생성 클릭


  1. 원본 도메인은 방금 만든 S3 버킷 선택
  2. 원본 엑세스는 Legacy access identities 선택
  3. 새 OAI 생성을 눌러 원본 엑세스 ID 선택
  4. 버킷 정책 "예" 선택

Redirect HTTP to HTTPS 선택


  1. "대체 도메인 이름"에 가비아에서 구매한 도매인 이름 입력
  2. 인증서 선택에서 승인 받은 인증서 선택
  3. "기본값 루트 객체"에 /index.html 입력
  4. "배포 생성" 버튼 클릭

오류 페이지 탭으로 이동
사용자 정의 오류 응답 생성 클릭


403, 404에 대한 응답페이지 리다이렉트 설정이다.
따라서 사용자 정의 오류 응답 생성을 두번 해줘야한다.

HTTP 오류 코드 : 403: 금지됨
오류 응답 사용자 정의 : 예
응답 페이지 경로 : /index.html
HTTP 응답 코드 : 200: 확인
사용자 정의 오류 응답 생성 클릭

HTTP 오류 코드 : 404: 찾을 수 없음
오류 응답 사용자 정의 : 예
응답 페이지 경로 : /index.html
HTTP 응답 코드 : 200: 확인
사용자 정의 오류 응답 생성 클릭

참조

https://velog.io/@ladiolus/%ED%95%9C%EB%B2%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC-Feat.-AWS-S3-Github-Action

https://velog.io/@sunghun/react-S3-CloudFront-Route-53-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

profile
열정, 끈기, 집념의 Frontend Developer

1개의 댓글

comment-user-thumbnail
39분 전

CloudFront 캐시 무효화 추가 하기
github actions yml 파일 내용 수정하기

답글 달기