AWS는 외부 서비스의 접근을 기본적으로 허용하지 않는다. 따라서 IAM(Identify & Access Management)를 사용하여 접근 권한을 획득해야 한다.
AWS IAM에서 사용자 그룹에서 **‘사용자 추가’**를 한다. 여기서 사용자란 AWS 외부에서 접속할 수 있는 권한을 줄 대상을 말한다.
해당 페이지에서 ‘AmazonS3FullAccess’, ‘AWSCodeDepolyFullAccess’ 두 가지 요소를 활성화 시킨다.
해당 권한을 가진 사용자가 생성되고 ACCESSKEY와 SECRET KEY가 발급이 된다.
권한 설정을 했으니 실제로 S3에서 저장될 버킷을 생성해야 한다.
이제 github repository에서 해당 키 값들을 세팅한다. action에 키 값을 그대로 노출하는 것은 보안상 문제가 되므로 repository의 ‘Settings -> Secret’에서 해당 키 값을 등록해준다.
workflow에 S3로 파일을 옮기는 job을 추가해 준다.
# This workflow will build a Java project with Gradle
# For more information see: <https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle>
# Repo Action 페이지에 나타날 이름
name: Spring Boot & Gradle CI/CD
# Event Trigger
# master branch에 push 또는 pull request가 발생할 경우 동작
# branch 단위 외에도, tag나 cron 식 등을 사용할 수 있음
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
# 실행 환경 지정
runs-on: ubuntu-latest
# Task의 sequence를 명시한다.
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Build
- name: Build with Gradle
run: ./gradlew clean build
# 전송할 파일을 담을 디렉토리 생성
- name: Make Directory for deliver
run: mkdir deploy
# Jar 파일 Copy
- name: Copy Jar
run: cp ./build/libs/*.jar ./deploy/
# 압축파일 형태로 전달
- name: Make zip file
run: zip -r -qq -j ./springboot-intro-build.zip ./deploy
# S3 Bucket으로 copy
- name: Deliver to AWS S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws s3 cp \\
--region ap-northeast-2 \\
--acl private \\
./springboot-intro-build.zip s3://springboot-intro-build/
workflow 동작은 프로젝트 파일을 압축하고 S3로 파일을 이관하는 작업이 추가되었고, 이로써 github action을 사용한 S3 Bucket 파일 이관이 완료되었다.