AWS 로그인을 하고 오른쪽 상단의 Region에서 웹서비스를 하려는 지역을 선택한다.
검색챙에 S3를 검색하여 S3에 들어간다.
오른쪽 상단의 "버킷 만들기" 버튼 클릭
- 버킷 이름 작성
- 객체 소유권에서 "ACL 활성화됨" 선택
- 이 버킷의 퍼블릭 액세스 차단 설정에서 "모두 해제"
- "버킷 만들기" 버튼 클릭
버킷 생성 완료
- 생성한 버킷 이름을 누르고 속성 탭으로 이동
- 하단으로 내려와서 "정적 웹 사이트 호스팅" 의 편집 클릭
- 정적 웹 사이트 호스팅을 활성화로 변겅
- 인덱스 문서와 오류 문서에 index.html 입력
- "변경 사항 저장" 버튼 클릭
- 권한 탭으로 이동
- 버킷 정책 설정 -> 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(Identity and Access Management)이란
AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이다.
IAM으로 리소스의 인증 및 권한 부여된 대상을 제어한다.
AWS 홈 검색에서 IAM 검색 후 클릭
왼쪽 탭에서 "사용자" 클릭
"사용자 생성" 버튼 클릭
사용자 이름 입력 후 다음 버튼 클릭
- 권한 옵션에서 "직접 정책 연결" 선택
- 권한 정책 검색에서 "AmazonS3FullAccess" 검색 후 선택
"사용자 생성 버튼" 클릭
추가 설정을 위해서 생성된 IAM 클릭
액세스 키에서 "엑세스 키 만들기" 클릭
Command Line Interface(CLI) 선택
"위의 권장 사항을 이해했으며 액세스 키 생성을 계속하려고 합니다."를 체크 후 "다음" 클릭
액세스 키 만들기 클릭
설명 태그 값 입력 안해도됨
엑세스 키의 정보가 담긴 .csv를 파일을 다운 후 사용
CI(Continuous Integration, 지속 통합)와
CD(Continuous Deployment, 지속 배포)를 위한 Github 서비스
- 배포하고자하는 프로젝트 리포지토리에서 Settings 탭 클릭
- 왼쪽 탭에서 Secrets and variables 클릭
- New repository secret 클릭
AWS_ACCESS_KEY_ID 생성
AWS_SECRET_ACCESS_KEY 생성
Secret에는 각각 AWS IAM 설정에서 만들었던 키의 정보를 입력(CSV 파일에서 확인)
생성 완료
- 상단 Actions 탭으로 이동
- "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가비아에서 확인 가능
가비아에서 구매한 도메인을 Route53에 등록한다.
AWS 검색 창에 Route53 검색 후 클릭
- 좌측 탭의 호스팅 영역 클릭
- 호스팅 영역 생성
도메인 이름에 구매한 도메인 이름 작성
"호스팅 영역 생성" 클릭
NS 유형의 값/트래픽 라우팅 대상의 총 4개의 값이 있는 걸 확인
- 가비아에서 구매한 도메인으로 이동
- 네임서버 "설정" 버튼 클릭
- 1차~4차의 값을 NS유형에서 확인한 4개의 값으로 수정
3.1 맨 뒤의 . 은 반드시 제거
Region은 반드시 버지니아 북부로 설정
AWS 검색 창에 Certificate Manager 입력 후 이동
"인증서 요청" 클릭
"퍼블릭 인증서 요청" 클릭 후 다음
- 완전히 정규화된 도메인 이름에 구매한 도매인 이름 입력
- DNS 검증 선택
- 키 알고리즘 RSA 2048 선택
- 요청
20~40분 혹은 2~3시간 정도 소요
검증이 완료되면 발급됨으로 변경
Route 53 에서 레코드 생성 클릭
Route53 에 등록된 도메인 레코드에 CNAME이 생성된 것을 확인할 수 있음
이전에 생성한 Route 53 호스팅 영역 선택
"레코드 생성" 버튼 클릭
레코드 유형: A-IPv4주소 및 일부 AWS 리소스로 트래핑 라우팅
트레핑 라우팅 대상: S3 웹 사이트 엔드포인트에 대한 별칭
"레코드 생성" 버튼 클릭
레코드 유형 A 생성 완료
A, NS, SOA, CNAME 4개 모두 있어야 한다.
CDN 서비스로 정적 파일들을 캐싱해줌으로써 빠른 로딩을 지원하고
HTTPS을 지원한다.
AWS CloudFront에서 CloudFront 배포 생성 클릭
- 원본 도메인은 방금 만든 S3 버킷 선택
- 원본 엑세스는 Legacy access identities 선택
- 새 OAI 생성을 눌러 원본 엑세스 ID 선택
- 버킷 정책 "예" 선택
Redirect HTTP to HTTPS 선택
- "대체 도메인 이름"에 가비아에서 구매한 도매인 이름 입력
- 인증서 선택에서 승인 받은 인증서 선택
- "기본값 루트 객체"에 /index.html 입력
- "배포 생성" 버튼 클릭
오류 페이지 탭으로 이동
사용자 정의 오류 응답 생성 클릭
403, 404에 대한 응답페이지 리다이렉트 설정이다.
따라서 사용자 정의 오류 응답 생성을 두번 해줘야한다.
HTTP 오류 코드 : 403: 금지됨
오류 응답 사용자 정의 : 예
응답 페이지 경로 : /index.html
HTTP 응답 코드 : 200: 확인
사용자 정의 오류 응답 생성 클릭
HTTP 오류 코드 : 404: 찾을 수 없음
오류 응답 사용자 정의 : 예
응답 페이지 경로 : /index.html
HTTP 응답 코드 : 200: 확인
사용자 정의 오류 응답 생성 클릭
https://velog.io/@sunghun/react-S3-CloudFront-Route-53-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
CloudFront 캐시 무효화 추가 하기
github actions yml 파일 내용 수정하기