들어가기 전에
기존에 Docker가 아닌, SpringBoot을 EC2에 직접 배포하는 Elastic Beanstalk 환경을 생성하는 과정을 포스팅한 적 있습니다. 해당 어플리케이션에 신규 환경을 만들어 세팅하였기 때문에 어플리케이션 생성이 필요하다면 해당 포스팅을 한 번 읽어보면 좋을 것 같습니다.
이번 포스팅에서는, Elastic Beanstalk 환경 세팅 및 RDS 생성을 진행해보도록 하겠습니다.
이번 포스팅은 하기 2가지 포스팅의 다음 순서입니다. 기존 포스팅을 보시지 않았다면 먼저 보고 오시는 것을 추천드립니다.
이전 포스팅
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 이미지 Docker로 배포하기(1) - - 왜 Amazon ECS가 아닌 Elastic Beanstalk을 선택했고, Docker를 사용하려 할까?
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 이미지 Docker로 배포하기(2) - ECR 리포지토리 생성 및 권한 설정
다음 포스팅
Elastic Beanstalk 환경 구성하기
먼저, AWS의 Elastic Beanstalk에 접속하여 하기와 같이 환경을 생성하고자 하는 어플리케이션에 접근하여 환경을 생성합니다.
Elastic Beanstalk 환경 구성의 요약본은 아래와 같습니다. 상세 내용이 보고 싶다면 바로 밑에 각각의 수정 항목을 표시해두었으니 체크하시면 됩니다. 참고로, RDS를 처음 Elastic Beanstalk 설정 시 함께 설치하면 이슈가 생기는 경우가 많아 먼저 EB 구성 후 환경에 다시 접근하여 RDS를 구성하는 것이 좋습니다.
Elastic Beanstalk 환경 구성 상세 내용
- 신규 생성하는 프로젝트이기 때문에, 현재 동시접속자 수가 얼마나 나올지 전혀 알 수 없는 상황입니다. 따라서, Auto Scaling은 최소/최대 모두 1로 지정한 뒤 추후 필요할 때에 늘려주는 방향으로 하겠습니다.
- 프록시 서버는 없음으로 설정했습니다. 이후 포스팅에서도 설명하겠지만, SpringBoot를 8080이라는 Elastic Beanstalk의 default port인 5000이 아닌 포트로 띄웠더니, Docker는 제대로 떴음에도 불구하고 제대로 SpringBoot에 다가가지 못해 5000 포트를 사용하면서 리버스 프록시를 제거했습니다.
- 이 서비스를 제외하고 추가 이미지를 띄워 사용할 일이 확률적으로 0%에 가까워 앞단에 리버스 프록시를 통해 한 번 더 거쳐와야 하는 것의 장점을 찾지 못했습니다(정적 컨텐츠 역시 SpringBoot가 처리함).
- 환경 속성 중
AWS_ECR_IMAGE
는 기존에 만든 ECR Repository에서 어떤 image를 가져올 지 정하는 부분입니다. (하기에 첨부한 사진 확인) 필자의 경우, 하기와 같이lastest 태그
가 붙은 이미지를 가지고 배포를 진행할 것이라 lastest 태그가 붙은 image의 URL을 복사하여 위 환경 속성의AWS_ECR_IMAGE
의 값으로 넣어주었습니다.- 만약, 아직 image를 생성해본 적이 없어 빈 ECR Repository를 가지고 있다면, 해당 레포지토리의 URI을 복사하여 뒤에 태그만 붙여주시면 됩니다(예:
{AWS계정명}.dkr.ecr.{ECR이 속한 region명}.amazonaws.com/earth-demo:{Image태그명}
).
- 만약, 아직 image를 생성해본 적이 없어 빈 ECR Repository를 가지고 있다면, 해당 레포지토리의 URI을 복사하여 뒤에 태그만 붙여주시면 됩니다(예:
- EC2 키 페어는 기존에 가지고 있던 키 페어를 적용해주었으며, 키 페어를 따로 가지고 있지 않다면 생성하시어 등록하면 됩니다.
생성된 Elastic Beanstalk 환경에 데이터베이스 추가하기
필자의 경우, EB를 처음 구성할 때에 데이터베이스를 추가하게 되면 항상 제대로 환경이 구축되지 않는 경우가 많아 하기와 같이 환경 구성이 완료된 후 다시 구성 탭에 들어가서 데이터베이스를 생성하고 있습니다.
RDS가 추가되면, 아래와 같이 Elastic Beanstalk 환경의 구성 탭에 다시 들어가서 RDS의 url을 복사합니다. 그 후, 소프트웨어 편집을 클릭하여 환경 속성을 추가해줍니다.
- Github Repository가 public인 관계로 github에 db 정보를 직접 올릴 수 없어
Elastic Beanstalk의 환경 속성
에 secret 값들을 저장하는 형식으로 진행하고 있습니다. - 환경 속성에 RDS관련 내용을 위와 같이 적은 이유는 SpringBoot의
application-ebprod.yml
파일 내 하기와 같이 작성되어 있기 때문입니다.- 이번에 만드는 프로젝트의
-Dspring.profiles.active=ebprod
이기 때문에 yml 파일이 ebprod용입니다.
- 이번에 만드는 프로젝트의
spring:
datasource:
url: jdbc:postgresql://${rds.hostname}:${rds.port}/${rds.dbname}
username: ${rds.username}
password: ${rds.password}
driver-class-name: ${rds.driver}
jpa:
hibernate:
ddl-auto: none
# application 실행 시점에 기존에 갖고 있던 테이블을 다 지우고 다시 생성합니다.
properties:
hibernate:
# show_sql: true
# 모든 로그는 가급적 로거를 통해 남겨야 합니다. show_sql의 경우 System.out에 hibernate 실행 sql을 남기므로, org.hibernate.SQL 옵션을 통해 logger로 실행 SQL을 남기는 게 좋습니다.
format_sql: true
logging.level:
org.hibernate.SQL: warn
# 로거를 통해 로그 남기려면 org.hibernate.SQL을 사용합니다.
# org.hibernate.type: trace
# trace로 hibernate type을 지정함으로써 로그에 SQL 실행 파라미터를 표시할 수 있습니다.
server:
port: 5000
생성한 RDS에 접속하여 신규 database 생성하기
현재 생성된 RDS는 깡통 DB이기 때문에 database를 생성해야 합니다. 필자의 경우 Elastic Beanstalk의 환경 속성의 RDS_DBNAME
을 beanstalk으로 작성하였기 때문에 하기와 같이 해당 RDS에 접속하여 create database
할 때 database명을 beanstalk
으로 지정해주었습니다.
이와 관련된 내용은 하기에 연결해둔 포스팅에서 자세히 설명하고 있으니 추가적으로 궁금한 점이 있다면 해당 포스팅을 보시면 좋을 것 같습니다.
Elastic Beanstalk의 서비스 역할에 ECR 접근 권한 추가하기
Elastic Beanstalk의 서비스 역할에 ECR 접근 권한을 추가하지 않으면 하기와 같이 The ECR service failed to authenticate your private repository
에러가 발생하여 제대로 Elastic Beanstalk에 배포를 할 수 없습니다. 따라서, 하기 과정을 통해 ECR 접근 권한을 추가해주어야 합니다.
먼저, 기존에 생성한 Elastic Beanstalk 환경에 접근하여 구성을 클릭합니다. 구성 항목들 중, 보안 > IAM 인스턴스 프로파일
이 어떤 것인지 확인합니다. 필자의 경우 aws-elasticbeanstalk-ec2-role
임을 확인할 수 있습니다.
그 후, IAM의 액세스 관리 > 역할
에 접근하여 Elastic Beanstalk의 IAM 인스턴스 프로파일에 해당하는 역할을 클릭합니다. 그 후 하기와 같이 정책 연결을 통해 AmazonEC2ContainerRegistryReadOnly
권한을 추가해줍니다.
마치며
여기까지 완료했다면, 이제 Github Action을 통해 Elastic Beanstalk에 배포하는 일만 남은 것입니다. 다음 포스팅을 통해 Github Action으로 Elastic Beanstalk에 Docker 배포를 어떻게 할 지 알아보도록 하겠습니다.