세번째로 GithubActions workflow를 생성하여야 한다. workflows는 github에 push가 되면 자동으로 프로젝트를 빌드하여 AWS S3에 업로드 하고 AWS CodeDeploy에 배포를 실행하도록 한다!
대강 이름설정을 해주고
직접 정책 연결
을 선택하여
AmazonS3FullAccess
와 AWSCodeDeployFullAccess
두가지 권한을 추가해준다.
이전에는 액세스키를 사용자 생성과 동시에 만들수 있었는데 최근에는 보안상 최대한 액세스 키를 만들지 않도록 유도하려는... 의도에서 액세스 키를 별도로 생성해 주어야 한다.
생성한 사용자 > 보안 자격 증명 > 액세스 키 > 액세스 키 만들기 에서
다음과 같이 AWS 외부에서 실행되는 애플리케이션
을 선택후
생성된 액세스 키
와 비밀 액세스 키
를 반드시 안전한 곳에 복사해둔다.
우선 레파지토리의 actions에서 새로운 workflow를 생성해준다.
퍼렇게 써져있는 set up a workflow yourself ->
를 눌러주면..
일단은 .github/workflows 경로로 생성해주었다. yml파일명은 알아서 지어주고
name: Deploy String boot
on:
push:
branches:
- main #main branch에 push 시 동작
env:
S3_BUCKET_NAME : s3버킷명
CODE_DEPLOY_APPLICATION_NAME: codedeploy application명
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: codedeploy group명
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11 #현재 프로젝트는 자바 11버전을 사용하고 있다.
- uses: actions/checkout@v2
- run: touch ./src/main/resources/application-security.properties
- run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application-security.properties
#보안 properties파일 생성
#필요하지 않다면 지워도 됨
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-action/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: |
aws deploy create-deployment \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
gradle 빌드 후 s3에 업로드 하고 code deploy를 동작 시킨다.
보안 properties 파일을 생성하는 과정은 밑에서 자세히..
name: Deploy React
on:
push:
branches: main
env:
S3_BUCKET_NAME : s3버킷명
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@master
- name: Cache node modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{ runner.OS }}-master-build-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.OS }}-build-
${{ runner.OS }}-
- name: Install Dependencies
run: yarn
- name: Build
run: yarn build
env:
CI: ""
- name: Configure AWS credentials
uses: aws-action/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: |
aws s3 cp \
--recursive \
--region ap-northeast-2 \
build s3://$S3_BUCKET_NAME
프론트는 s3의 정적 웹 호스팅만 필요하기 때문에 빌드 후 s3에 업로드만 하면 끝..!
Actions 수행시 보안이 필요한 내용들은 Action secrets에 별도로 저장해두고 가져다 사용해야한다.
해당 레파지토리 > Settings > Security > Secrets and variables > Actions > New repository secret
에서 생성해 주면 된다!
아까 발급받은 액세스 키
와 비밀 액세스 키
를 프론트와 백의 secrets에 생성해 줘야 한다.
yml파일에 작성해 뒀던 대로
AWS_ACCESS_KEY_ID
: 액세스 키AWS_SECRET_ACCESS_KEY
: 비밀 액세스 키AWS_REGION
: aws 지역들을
다음과 같이 각각 생성한다.
Sprint boot 프로젝트에서 보안이 필요한 properties는 application-security.properties
의 별도 properties 파일로 관리하고 있다.
이 파일의 내용도 secrets에 추가해주어 Actions 수행시에 application-security.properties
가 생성되도록 해주었다.
APPLICATION_PROPERTIES
로 secrets를 생성해 내용에는 application-security.properties
의 내용을 복사해 넣어 주었다.
이제 대부분의 세팅은 끝이 났다..!!!!
레파지토리에 푸시후 모든 과정이 정상적으로 동작하는지 확인해 보아야 한다