https://github.com/lhoju0158

개발 끄적끄적

[GitHub Actions] 엑세스 키 없을 때 S3, Cloudfront 배포 자동화

lhoju0158 2025. 7. 12. 22:31

좋은 기회로 AWS 자원을 지원받는 일이 있었다. 근데.. S3와 Cloudfront에 대한 엑세스 권한을 주지 않아, 배포 자동화가 힘들었다.

 

그래서 생각해 낸 편법이 EC2에 접근해서, S3와 Cloudfront에 배포하는 방법이다. 

 

우선 자원을 가장 많이 사용하지 않은 radis용 EC2를 이용하기로 결정했다. 현재 radis용 EC2는 IAM역할이 따로 부여되어 있지 않다. 현재 가지고 있는 IAM이 일단 S3에 접근할 수 있는지 확인한다.

 

 

SafeBaseRolePollicy는 커스텀 권한으로 해당 정책이 S3 접근을 포함하고 있는지 확인은 불가하다.

 

그래서 CLI로 접근하니 가능하다. (확인은 멋진 팀원분이 해줬다.)

 

1. EC2 세팅

명령어를 통해서 ssh로 접근한다. EC2 - 인스턴스 - 인스턴스 ID - 인스턴스에 연결 을 통해서 ssh 클라이언트 명령어는 쉽게 확인할 수 있다. 다음 명령어는 모두 Ubuntu EC2 기반이다. 

 

1. 시스템 패키지 업데이트

sudo apt update && sudo apt upgrade -y

 

2. Node.js & npm 설치

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

 

3. Git 설치

sudo apt install -y git

 

4. AWS CLI 설치

 

sudo apt update
sudo apt install unzip curl -y
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

 

5. 내 github 프로젝트 clone

 

cd ~
git clone [해당 git url] [폴더명]
cd 폴더명

 

6. 빌드 및 S3 업로드

npm install
npm run build
aws s3 sync ./dist [S3 URL] --delete

 

 

7. Cloudfront 초기화

 

여기서 문제가 또 있다.. 현재 Cloudfront는 배포 문제로 다른 계정의 것을 사용중이다. 그래서 cloudfront는 접근 권한이 아닌 access key로 초기화 해야한다

 

8. Github Actions SSH 키 등록


먼저 로컬에 다음 명령어를 쳐서 공개키, 비밀키를 생성한다

ssh-keygen -t rsa -b 4096 -C "github-actions"

 

 

이후 공개키인 id_rsa.pub는 EC2에 다음과 같은 내용으로 저장하고

ssh-keygen -t rsa -b 4096 -C "github-actions"
echo [공개키 내용] >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

 

비밀키인 id_rsa는 전체 내용을 Github Secrets에 저장한다. github action에서 EC2로 접근이 가능하다,

 

이러면 EC2의 준비는 완료다.

 

2. GitHub Action .yml 파일 작성

yml 파일을 작성한다

 

name: PROD용 S3에 업로드 및 CLOUDFRONT 초기화

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: GitHub 코드 체크아웃
        uses: actions/checkout@v4

      - name: EC2에 SSH 접속 후 배포
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          port: 22
          script: |
            cd ~/client
            git pull origin main
            npm install
            npm run build

            # S3 업로드
            aws s3 sync ./dist ${{ secrets.S3_URL }} --delete

            # CloudFront 초기화
            mkdir -p ~/.aws
            cat > ~/.aws/credentials <<EOL
            [default]
            aws_access_key_id=${{ secrets.AWS_ACCESS_KEY_ID_PROD }}
            aws_secret_access_key=${{ secrets.AWS_SECRET_ACCESS_KEY_PROD }}
            region=${{ secrets.AWS_REGION_PROD }}
            EOL

            aws cloudfront create-invalidation \
              --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID_PROD }} \
              --paths "/*"

 

3. 결과

 

잘 배포됐음을 확인할 수 있다.

 

4. 후기

현업에서도 이리 애매하게.. 엑세스 권한을 줄 경우가 있을지 모르겠지만.. 그래도 재미있는 경험이었다. CICD도 참 재미있다! 유지보수는 즐거워~