본문 바로가기
관리자

Project/Poppin

AWS Credential(AcceesKey, SecretKey), github Actions - ECR CI 설정하기

728x90
반응형

 

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 레포지토리 등록하기

ref.) https://velog.io/@jeongmin78/CICD-Github-Action-AWS-IAM-Role-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-ECR%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B8%B0-8n3fmmgn

 

상기 글을 참고하였다. AWS IAM에 접속해서 액세스 관리 > 자격 증명 공급자 > 공급자 추가를 눌러준다.

 

 

공급자 URL([지문 가져오기 버튼 클릭]), 대상을 아래 값들로 입력해준다.

 

이후 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에 들어가서 어떤 내용들이 실행되는지 살펴보았다.

 

728x90
반응형