1. AWS Credential
ref.) https://www.daleseo.com/aws-cli-configure/
aws cli를 통해서 AWS 콘솔이 아니라 terminal을 통해 여러 정보에 접근할 수 있다. AWS는 accessKey(=ID), SecretKey(=PW)를 통해 인증받는 방식을 택하고 있다. 대부분의 AWS 기능이나 AWS와 연동된 라이브러리들은 credentials로 설정된 값을 기반으로 인증이 작동한다. 따라서 기본적으로 어떻게 AWS 인증이 이루어지는지 알고 있어야한다.
aws cli의 인증 정보를 설정한다.
$ aws configure
인증 정보 확인
$ aws configure list
인증 정보 저장 위치에 접근하여 확인(이 방법이 제일 편함)
$ cat ~/.aws/credentials
마스킹(*) 정보 없이 확인하기
$ aws configure get {aws_access_key_id}
여러 인증 정보 등록하기
$ aws configure --profile {등록할 프로필 이름}
2. CI(Continuous Integration)
코틀린 - 스프링부트 - mysql 기준이다.
2-1. 배경 지식
1. github Actions는 github repository에 들어가서 확인하고, 등록할 수 있다. 또는 프로젝트 파일상 최상위에 .github/workflows/{something.yml} 파일을 만들고 코드를 레포지토리에 푸시하면 자동으로 action이 등록되고, 조건이 성립되면 실행된다.
2. AWS와 github을 연동하기 위해서 사용하고자하는 AWS Service에서 github의 접근에 대한 권한 및 정책을 등록해주어야한다. 뒤에서 자세히 다룬다.
2-2. 코드상 신경쓸 부분들
1. .env 의존성 삭제
이전 글(SpringBoot Kotlin 프로젝트 Docker, AWS로 서버 구성하기-1. docker image, ec2, 환경변수 .env 등)에서 dotenv를 사용하기 위해서 Main.kt 파일상 env를 주입하는 방식으로 작성했는데, 이 부분을 아래처럼 변경하여 env에 의존하지 않도록 해준다.
@SpringBootApplication
@ConfigurationPropertiesScan
open class Main
fun main(args: Array<String>) {
SpringApplicationBuilder(Main::class.java).run(*args)
}
2. application.yml 파일에 등록된 환경변수 값들 관리
아래 예시 코드처럼 application.yml 파일에 등록된 ${LOCAL_DB_URL}과 같은 환경변수 값들이 코드상 어느 부분에서 사용되고 있는지 점검한다. @Value와 같이 application.yml 파일에서 사용하는 부분은 없는지 점검한다.
# default = local
spring:
profiles:
default: local
datasource:
url: ${LOCAL_DB_URL}
username: ${LOCAL_DB_USERNAME}
password: ${LOCAL_DB_PASSWORD}
jpa:
database: MYSQL
show-sql: true
properties:
hibernate.format_sql: true
hibernate.use_sql_comments: true
hibernate.highlight_sql: true
hibernate:
ddl-auto: validate
3. Dockerfile 관리 및 runtime 환경변수 주입
Dockerfile에서 .env 파일을 COPY 한다거나, 의존하고 있는 부분이 있다면 이미지 빌드 전 제거해야한다. 그리고 docker run 명령어에서 -e 옵션을 통해서 위 application.yml 파일에 있는 환경 변수값을 직접 입력해주어야한다. 이후에는 로컬에서 실행하는 환경에서도 intellij IDE의 Edit configuration에서 아래 그림처럼 Program arguments, Enivonment variables에 local, 환경 변수 설정을 해주어야한다.
2-3.github action - ECR 연동하기
1. github Action에 secrets 등록
settings -> secrets and variables -> actions -> new repository secret 버튼으로 key-value를 등록하면 된다.
secret 값은 등록만 가능하고 조회는 불가하기 때문에, 보안이 보장되는 곳에 값을 기록해두는 것이 좋다!
2. AWS ECR에서 github 레포지토리 등록하기
상기 글을 참고하였다. AWS IAM에 접속해서 액세스 관리 > 자격 증명 공급자 > 공급자 추가를 눌러준다.
공급자 URL([지문 가져오기 버튼 클릭]), 대상을 아래 값들로 입력해준다.
- ProviderURL: https://token.actions.githubusercontent.com
- Audience: sts.amazonaws.com
이후 IAM > 역할 > 역할 생성에 들어가서 위에서 만든 자격 증명 공급자를 통해 웹 자격 증명으로 github의 역할을 추가해준다.
그리고 github 조직을 선택하게 되어있는데, github에서 레포지토리보다 상위에 있는 Organization 이름을 입력해주면 된다.
이후 해당 권한에 ECR로 검색하여 나오는 3가지 정책을 모두 적용해주었다. 어떤 Resource에게 부여할지 등 상세한 내용을 JSON으로 조정할 수 있고, SecretsManagerReadWrite는 AWS Secrets를 사용하지 않는다면 별 필요가 없어보이지만, 일단 다 넣었다.
3. workflow 파일 작성
여러 글들을 참조해서 작성했다.
//master 브랜치에 push가 오거나, PR merge가 실행되었을때 작동
name: Production API Deploy
on:
push:
branches:
- master
pull_request:
branches:
-master
//workflow에서 사용할 환경변수 설정. github action의 secrets로 등록한 값들을 참조할 수 있다.
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: ${{ secrets.IMAGE_TAG }}
//CI라는 이름으로 job을 진행한다.
jobs:
build:
// 우분투 최신 버전을 기반으로하는 github에서 제공해주는 서버(runs-on)으로 진행한다.
// checkout@v3로 미리 마련된 템플릿이 있다고 생각하면 된다.
name: CI
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Grant Execution for Gradlew
run: chmod +x gradlew
shell: bash
- name: Build with Gradle
run: |
./gradlew -version
./gradlew build -x test
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
//이 부분에서 애를 먹었었는데, uses를 사용하는게 아니라 직접 run 코드를 입력했다.
- name: Login to Amazon ECR
id: login-ecr
run: |
aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ env.ECR_REPOSITORY }}
//이미지를 빌드하고 푸시한다.
- name: Build Image and push to AWS ECR
id: build-image
run: |
docker build --platform linux/amd64 -t ${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} .
docker push ${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
중간중간 @v3 등으로 표시된 부분은 템플릿이다. 사람들이 많이 사용하는 부분은 github에서 최신 양식에 맞게 필요한 값과 과정들을 알아서 진행해주는 것 같았다. 실제 실행 후 action에 들어가서 어떤 내용들이 실행되는지 살펴보았다.
'Project > Poppin' 카테고리의 다른 글
S3 이미지 업로드 구현, Profile 설정 및 불러오기, Swagger 이미지 업로드(multipart) (0) | 2023.12.25 |
---|---|
Thymeleaf로 input 확인 및 수정 Admin 페이지 만들기(jquery, script) (0) | 2023.12.17 |
AWS EC2 다른 계정용 pem key 만들고 접속: Permission Denied error (1) | 2023.12.07 |
poppin (0) | 2023.12.04 |
ECR로 Docker Image 옮기기 (1) | 2023.12.03 |