개발

EB와 RDS 연결 및 환경변수 설정

시간의 효율화 2021. 12. 3. 17:32

많은 에러를 마주했다. 

 

RDS를 'RDS'탭에서 만들어서 EB에 연결 할 수 있지만, 여기서는 EB 구성에서 RDS를 만들어서 연결해서 붙여보겠다. 

만든 EB 왼쪽 탭 밑에 보면 "Configuration"이 있는데, 그걸 누른다. 

 

제일 아래에 보면 "Database"가 있는데 "Edit"을 부른다. 

 

여기서 RDS 생성 과정은 여기 링크를 참고한다. 

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.managing.db.html

 

Elastic Beanstalk 환경에 데이터베이스 추가 - AWS Elastic Beanstalk

Elastic Beanstalk 환경에 데이터베이스 추가 Elastic Beanstalk는 Amazon Relational Database Service(Amazon RDS)와의 통합을 제공합니다. Elastic Beanstalk를 사용하여 기존 환경 또는 새 환경 생성 시 새 환경에 MySQL, Pos

docs.aws.amazon.com

 

그 다음 "Software"에 "Edit"을 선택한다. 

환경변수 추가다. 

RDS_DB_NAME - db 이름. EB에서 생성한 db의 디폴트 이름은 'ebdb'다. 본인이 만든 거 해도 된다. 

 

RDS_USERNAME - RDS 만들 때 정한 이름. 

 

RDS_PASSWORD - RDS 비번

 

RDS_PORT - sql이면 쓰면 3306

 

RDS_HOSTNAME - RDS의 endpoint

 

나머지 SPRING_JPA_DATABASE_PLATFORM과 SPRING_JPA_HIBERNATE_DDL_AUTO는 스크린샷과 같이 추가해주면 된다. 

 

그리고 적용. 

 

다음은 application.properites 값 설정

spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

spring.datasource.url=jdbc:mysql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}
spring.datasource.username=${RDS_USERNAME}
spring.datasource.password=${RDS_PASSWORD}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

이렇게 추가해준다. 

 

헬스 상태 에러

 

 

만약 502에러가 뜨거나 하면, health문제가 생기면 (나 같은 경우 이미 해결이 되어서 'Ok' 뜬다) 

 

EB 왼쪽 탭 "Configuation"가서 "Load balancer"를 찾는다. 그리고 "Edit"을 눌러준다. 

 

 

 

"Processes"를 찾아서 해당 프로세스를 클릭한 다음 "Actions"에서 "Edit"을 누른다. 

 

 

여기서 "Port"는 "8080", "HTTP Code"는 "200", "Path"는 /actuator/health를 추가해준다. 그리고 확인. 

그리고 build.gradle에 다음 디펜던시를 추가해준다. 

 

    implementation 'org.springframework.boot:spring-boot-starter-actuator'

 

아래는 저의 build.gradle이다. 

plugins {
    id 'org.springframework.boot' version '2.5.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.heart-muscle'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

jar {
    enabled = false
}

이렇게 하면 헬스가 다시 "Ok"로 뜰 것이다. 

 

Load balancer가 서버 건강을 확인하기 위해 계속 GET 요청을 날리는데, 받을 수 있는 path를 설정 해주는 것이다. 

 

 

아래처럼 설정해줄 수도 있지만, 복잡해서 그냥 위에 방법을 썼다. 튜터님의 도움 받아서 해결했다. 이거 따라하다가 막히면 댓글 남겨주세요. 

https://jojoldu.tistory.com/509?category=635883 

 

Spring Boot에서 AWS 파라미터 스토어로 private 설정값 사용하기

이를 테면 DB의 접속정보나 암호화에 사용될 Salt Key 등은 프로젝트 코드 내부에서 관리하기엔 위험이 따릅니다. 누구나 볼 수 있기 때문이죠. 이건 사내 private 저장소를 사용해도 비슷합니다. 사

jojoldu.tistory.com

 

----------------------------------------------------------------------------------------------------------------

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///home/runner/work/heart-muscle-backend/heart-muscle-backend/build/reports/tests/test/index.html

깃 액션 중에 위와 같은 에러가 뜨면 

 

name: heart-muscle-backend

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v2
        with:
          java-version: '8'
          distribution: 'adopt'
          cache: gradle
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      - name: Build with Gradle
        run: ./gradlew build -x test
      - name: Get current time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - name: Generate deployment package # (1)
        run: |
          mkdir -p deploy
          cp build/libs/*.jar deploy/application.jar
          cp Procfile deploy/Procfile
          cp -r .ebextensions deploy/.ebextensions
          cp -r .platform deploy/.platform
          cd deploy && zip -r deploy.zip .

      - name: Deploy to EB # (2)
        uses: einaregilsson/beanstalk-deploy@v19
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          application_name: heart-muscle
          environment_name: Heartmuscle-env
          version_label: github-action-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2
          deployment_package: deploy/deploy.zip

 

 

- name: Build with Gradle
  run: ./gradlew build -x test

"./gradlew build -x test"로 설정해준다. 

 

build하는데 "test"는 건너뛴다는 이야기다.