Post

오토에버 클라우드 2기 59일차

AWS S3를 이용한 정적 웹사이트 배포

오토에버 클라우드 2기 59일차

AWS S3를 이용한 정적 웹사이트 배포

AWS의 스토리지 서비스인 S3(Simple Storage Service)를 사용하여 서버 없이 간단한 정적 웹사이트를 배포할 수 있다

1. S3 버킷(Bucket) 생성하기

버킷은 파일을 저장하는 최상위 컨테이너(폴더)

  1. AWS Management Console에 로그인하여 S3 서비스로 이동

  2. [버킷 만들기] 버튼을 클릭

  3. 버킷 이름: 전 세계에서 유일한 이름으로 지정 일반적으로 웹사이트 도메인과 동일하게 만든다 (예: minnnning-example-page.com)

  4. AWS 리전: 사용자에게 가장 가까운 리전을 선택하여 빠른 속도를 보장 (예: ap-northeast-2 (서울))

  5. 모든 퍼블릭 액세스 차단체크를 해제합니다. 웹사이트는 인터넷의 모든 사용자가 접근할 수 있어야 하므로 퍼블릭 액세스를 허용. 경고 메시지를 확인하고 체크박스를 선택

  6. 나머지 설정은 기본값으로 두고 [버킷 만들기]를 클릭

 

2. 정적 웹사이트 호스팅 활성화

생성한 버킷이 웹사이트처럼 동작하도록 설정을 변경해야 한다

  1. 생성한 버킷의 이름을 클릭하여 세부 정보 페이지로 이동

  2. [속성] 탭을 클릭하고, 페이지 하단으로 스크롤하여 정적 웹 사이트 호스팅 섹션의 [편집] 버튼을 클릭
  3. 정적 웹 사이트 호스팅활성화로 변경

  4. 인덱스 문서: 사용자가 웹사이트 주소로 접속했을 때 가장 먼저 보여줄 파일의 이름을 입력합니다. 일반적으로 index.html
  5. (선택 사항) 오류 문서: 잘못된 경로로 접속했을 때 보여줄 오류 페이지의 이름을 입력 (예: error.html)

  6. [변경 사항 저장]을 클릭합니다. 저장이 완료되면 이 섹션에 웹사이트 엔드포인트(URL)가 생성된다 이 주소가 바로 웹사이트의 주소이다

지금 접속한다면 403에러가 발생한다

 

3. 버킷 정책(Bucket Policy) 설정으로 퍼블릭 읽기 권한 부여

웹사이트 호스팅을 활성화했더라도, 버킷 안의 파일들을 익명의 사용자가 읽을 수 있도록 명시적인 권한을 부여해야 한다

  1. 버킷의 [권한] 탭으로 이동

  2. 버킷 정책 섹션에서 [편집] 버튼을 클릭

  3. 정책 편집기에 아래의 JSON 코드를 넣는다 YOUR_BUCKET_NAME 부분은 실제 버킷 이름

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "PublicReadGetObject",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
            }
        ]
    }
    
    • "Effect": "Allow": 허용 정책
    • "Principal": "*": 모든 사용자(익명 포함)를 의미
    • "Action": "s3:GetObject": 버킷 내의 객체(파일)를 읽을 수 있는 권한
    • "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*": 이 정책이 적용될 범위를 지정 (해당 버킷의 모든 파일)

 

4. 웹사이트 파일 업로드하기

이제 웹사이트를 구성하는 파일(HTML, CSS, JavaScript 등)을 버킷에 업로드 해야한다

  1. 간단한 index.html 파일을 준비 index.html 예시:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <!DOCTYPE html>
    <html>
    <head>
        <title>My S3 Website</title>
    </head>
    <body>
        <h1>Hello, S3!</h1>
        <p>This website is hosted on Amazon S3.</p>
    </body>
    </html>
    
  2. 버킷의 [객체] 탭으로 이동

  3. [업로드] 버튼을 클릭

  4. [파일 추가]를 클릭하여 준비한 index.html 파일을 선택하거나, 파일을 브라우저 창으로 드래그 앤 드롭

  5. [업로드] 버튼을 클릭하여 파일 업로드를 완료

 

5. 웹사이트 접속 및 확인

브라우저에 index.html 파일의 내용이 정상적으로 표시되는지 확인한다

 

git action으로 배포하기

1. 배포용 AWS IAM 사용자 생성

GitHub Actions가 내 AWS 계정에 접근하여 S3 버킷에 파일을 올리려면, 보안을 위해 전용 IAM 사용자와 액세스 키를 생성해야 한다

  1. AWS Management Console에서 IAM 서비스로 이동

  2. 왼쪽 메뉴에서 [사용자]를 선택하고 [사용자 생성] 버튼을 클릭
  3. 사용자 이름을 지정 (예: github-actions-s3-deployer)

  4. 권한 설정 단계에서 [정책 직접 연결]을 선택하고, [권한 정책 생성] 버튼을 클릭

  5. JSON 탭을 선택 YOUR_BUCKET_NAME 부분은 실제 버킷 이름으로 반드시 수정해야 한다 이 정책은 지정된 버킷에 파일을 올리고, 목록을 보고, 삭제하는 최소한의 권한만 부여

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowS3WebsiteDeployment",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:ListBucket",
                    "s3:DeleteObject",
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::YOUR_BUCKET_NAME",
                    "arn:aws:s3:::YOUR_BUCKET_NAME/*"
                ]
            }
        ]
    }
    
  6. 정책 이름을 지정(예: AllowS3DeployPolicy)하고 정책을 생성

  7. 다시 사용자 생성 화면으로 돌아와 방금 만든 정책을 검색하여 체크하고 [다음]을 클릭

  8. 사용자 생성을 완료한 후, 생성된 사용자 이름을 클릭하여 세부 정보 페이지로 들어간다

  9. [보안 자격 증명] 탭으로 이동하여 [액세스 키 만들기] 버튼을 클릭
  10. [명령줄 인터페이스(CLI)]를 선택하고 다음 단계로 진행하여 액세스 키를 생성

  11. 생성된 액세스 키 ID비밀 액세스 키를 즉시 복사하여 안전한 곳에 보관

 

2. GitHub에 AWS 액세스 키 등록

보안을 위해 AWS 액세스 키를 코드에 직접 넣지 않고, GitHub의 암호화된 비밀 정보(Secrets) 기능에 등록

  1. 웹사이트 코드가 있는 GitHub 리포지토리로 이동

  2. [Settings] 탭 > [Secrets and variables] > [Actions] 메뉴로 이동
  3. [New repository secret] 버튼을 클릭하여 아래 두 개의 비밀 정보를 생성

    • Name: AWS_ACCESS_KEY_ID
      • Secret: 위에서 복사한 액세스 키 ID를 붙여넣는다
    • Name: AWS_SECRET_ACCESS_KEY
      • Secret: 위에서 복사한 비밀 액세스 키를 붙여넣는다

 

3. GitHub Actions 워크플로우 작성

이제 push 이벤트가 발생했을 때 수행할 작업들을 정의하는 워크플로우 파일을 작성한다

  1. 리포지토리의 코드 편집기(VS Code 등)에서 프로젝트 최상위 경로에 .github/workflows 디렉터리를 생성

  2. 해당 디렉터리 안에 deploy.yml과 같은 이름으로 YAML 파일을 생성

  3. YOUR_BUCKET_NAMEYOUR_AWS_REGION을 실제 버킷 이름과 리전(예: ap-northeast-2)으로 수정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    # .github/workflows/deploy.yml
       
    name: Deploy static website to S3
       
    # main 브랜치에 push 이벤트가 발생했을 때 이 워크플로우를 실행합니다.
    on:
      push:
        branches:
          - main
       
    jobs:
      deploy:
        runs-on: ubuntu-latest # 작업은 최신 우분투 환경에서 실행됩니다.
       
        steps:
          # 1. GitHub 리포지토리의 코드를 runner로 가져옵니다.
          - name: Checkout repository
            uses: actions/checkout@v4
       
          # 2. GitHub Secrets에 저장된 AWS 자격 증명을 설정합니다.
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v4
            with:
              aws-access-key-id: $
              aws-secret-access-key: $
              aws-region: YOUR_AWS_REGION # 예: ap-northeast-2
       
          # 3. AWS CLI를 사용하여 S3 버킷에 파일을 동기화합니다.
          - name: Sync files to S3
            run: |
              aws s3 sync . s3://YOUR_BUCKET_NAME --delete
    
    • on: push: branches: [ main ]: main 브랜치에 push될 때마다 이 액션을 실행하라는 의미
    • aws s3 sync . s3://...: 현재 디렉터리(.)의 모든 파일을 S3 버킷과 동기화
    • --delete: 리포지토리에서 삭제된 파일은 S3 버킷에서도 함께 삭제하는 옵션

 

4. 자동 배포 실행 및 확인

  1. 로컬 컴퓨터에서 deploy.yml 파일을 포함한 모든 변경 사항을 git commit 하고 main 브랜치로 git push

  2. GitHub 리포지토리의 [Actions] 탭으로 이동하면, 방금 푸시한 커밋으로 인해 워크플로우가 실행되는 것을 실시간으로 확인할 수 있다

이제부터 main 브랜치에 코드를 push할 때마다 이 모든 과정이 자동으로 실행되어 웹사이트가 항상 최신 상태로 유지된다

This post is licensed under CC BY 4.0 by the author.