좋은 기회로 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도 참 재미있다! 유지보수는 즐거워~
'개발 끄적끄적' 카테고리의 다른 글
| [Spring] Security - OAuth 2.0 (3) | 2025.08.01 |
|---|---|
| [GitHub Actions + AWS] IAM role 접근 권한에 따른 오류 해결 + GitHub Actions 성공 기준 (1) | 2025.07.15 |
| [Spring] S3 url 한글 인코딩 이슈 해결 (2) | 2025.06.26 |
| [AWS] AWS Certified Cloud Practitioner 자격증 취득 (0) | 2025.04.26 |
| [Python] embedded python 설치 및 c#에서 python process 돌리기 (0) | 2024.08.30 |