지난 글에서는 깃헙액션, 워크플로우에 대해 설정했다.
이번에는 aws 관련 설정들을 할 것이다.
이전 포스팅에서 다뤘던 것처럼
깃헙액션에서는 s3와 codedeploy, ec2를 이용한다.
s3에 파일을 압축해서 올리고 codedeploy를 이용해 ec2에 뿌려주는 것이다.
📌EC2 생성
ec2 인스턴스를 생성해야 한다.
📌S3 생성
생성시 주의할 점은 퍼블릭 설정은 따로 필요 없지만, 버킷 이름은 신경써서 지어주자
📌EC2에 Codedeploy 에이전트 설치
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
//밑에 주소 참조
//ex) wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto > /tmp/logfile
# 실행중인지 확인
sudo service codedeploy-agent status
# CodeDeploy 에이전트가 설치되어 실행 중이면 과 같은 메시지가 표시되어야 합니다.The AWS CodeDeploy agent is running.
# error: No AWS CodeDeploy agent running과 같은 메시지가 표시되면 서비스를 시작하고 다음 두 명령을 한 번에 하나씩 실행
sudo service codedeploy-agent start
sudo service codedeploy-agent status
📌EC2 IAM 설정
ec2가 s3와 codedeploy를 이용할 수 있도록 권한 설정을 해줘야 한다. 아래 링크를 들어가서 하면 된다.
https://console.aws.amazon.com/iamv2/home#/roles
사용 사례를 codedeploy로 설정하여 하나 더 만들어줌
이제 깃헙 액션이 s3에 접근하여 파일을 업로드할 수 있도록 IAM 사용자 추가 및 권한 설정을 한다.
https://console.aws.amazon.com/iamv2/home#/users
아까는 역할이고 이번에는 사용자다.
기존 정책 직접 연결에서 아까 선택한것처럼
1. AWSCodeDeployFullAccess
2. AmazonS3FullAccess
두 개의 권한 체크 후 생성
📌codedeploy어플리케이션 생성
이제 codedeploy어플리케이션을 생성하자
이름만 정하고 ec2 선택해서 만들어줌~~~
📌배포그룹(액세스 키) 생성
이제 배포 그룹을 생성하자
(❁´◡`❁)
서비스 역할에는 아까 만들어준 IAM 을 선택
Amazon EC2 인스턴스를 선택하고 태그에 Name, 값에 아까 만든 EC2 인스턴스 Name을 입력
배포구성은 그대로 두면 되고 로드밸런싱 활성화를 취소한다.
생성 후 IAM 사용자의 보안자격 증명에서 엑세스 키 만들기
엑세스 키에 주석처럼 태그를 설정할 수도 있다(선택)
엑세스 키 생성 완료~~~
비밀 엑세스 키는 다시 확인할 수 없으니 안전한 곳에 잘 보관하도록 하자!!!
엑세스 키 생성 완료 🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️🤸♀️
자 이제 Github Actions를 AWS 리소스와 연결하자
먼저 이전에 생성한 S3 버킷에 프로젝트 빌드한 결과물을 전송해보자
🗝️ 키 등록
받은 Access key ID, Secret access key를 github settings-secrets에서 추가
yml파일에 변수로 넣을 것이다.
왜 이렇게 하냐면! Github Actions에서 워크플로를 실행하는 과정에서 액세스 키가 필요하지만,
공개되면 보안 이슈가 발생할 수 있기 때문에 Github Secret을 이용해 액세스 키 값을 저장한 후 사용하는 것이다.
레포지토리의 Settings > Secrets > Actions 탭으로 이동한 후 [New repository secret] 버튼을 클릭
.Name에는 변수 이름을, Value엔 변수의 값을 저장
저장해야하는 변수는 두가지로, IAM User를 생성할 때 볼 수 있는 액세스 키 ID 값과, 비밀 액세스 키 값을 각각 저장
한 번 저장하면 값의 일부만은 수정할 수 없으니 주의하자! (덮어쓰기는 가능. 저장된 값을 확인하는 것은 불가능)
gradle.yml 파일 하단에 코드를 추가
# build한 후 webservice-deploy.zip 이라는 이름으로 프로젝트를 압축합니다.
- name: Make zip file
run: zip -r ./webservice-deploy.zip .
shell: bash
# Access Key와 Secret Access Key를 통해 권한을 확인합니다.
# 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않습니다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-region: ap-northeast-2
name: Configure AWS credentials: 워크플로우의 작업 이름을 정의
uses: aws-actions/configure-aws-credentials@v1: GitHub Actions 워크플로우에서 제공되는 AWS 액션 중 하나인 aws-actions/configure-aws-credentials를 사용하겠다. 이 액션은 AWS 자격 증명을 구성하기 위해 사용
with:액션에 전달되는 입력 변수들을 정의
저장된 secret의 이름이 위와 다를 경우, 알맞게 수정해주어야 한다.secrets.AWS_ACCESS_KEY와 secrets.AWS_SECRET_ACCESS_KEY는 이전에 등록한 Github Secret에서 값을 불러오므로 키 값을 yml파일에 바로 적지 않아도 된다.
📌참고로 ap-northeast-2 는 서울 리전을 의미한다
빌드파일 s3에 전달하는 코드도 추가
env:
S3_BUCKET_NAME: mutjaeng
.
.
.
# 압축한 프로젝트를 S3로 전송합니다.
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./webservice-deploy.zip s3://$S3_BUCKET_NAME/webservice-deploy.zip
전체 yml파일 코드
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: mutjaeng
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Add permission
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
# build한 후 webservice-deploy.zip 이라는 이름으로 프로젝트를 압축합니다.
- name: Make zip file
run: zip -r ./webservice-deploy.zip .
shell: bash
# Access Key와 Secret Access Key를 통해 권한을 확인합니다.
# 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않습니다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-region: ap-northeast-2
# 압축한 프로젝트를 S3로 전송합니다.
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./webservice-deploy.zip s3://$S3_BUCKET_NAME/webservice-deploy.zip
이제 커밋하고 성공적으로 빌드되기를 기다린다
두근세근네근...
성공하면 ! S3 버킷에 설정한 이름으로 압축파일이 전송된걸 확인할 수 있다!
다음 포스팅에서는 빌드파일을 배포하고 실행해 볼 것이다
도움이 많이 됐던 사이트❗❗❗❗
https://ms3864.tistory.com/382