쉽고 간단한 백엔드 인프라, 배포부터 보안까지 (2) - AWS Elastic Beanstalk
https://github.com/fineman999/simple_spring_mvc
GitHub - fineman999/simple_spring_mvc: AWS Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD)으로
AWS Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD)으로 백엔드 인프라 구성 - GitHub - fineman999/simple_spring_mvc: AWS Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Action...
github.com
목차
서론
이번 Step에서는 AWS Elastic Beanstalk을 이용해 서버를 구축하는 방법에 대해 설명한다.
웹 서버 프레임워크로 Spring Framework를 이용하였다. Express.js, flask 등 다른 웹 서버 프레임워크를 이용해도 상관없다.
아키텍처
Simple Spring Boot
맨 위 두 번째 프로젝트를 git clone 하면 해당 프로젝트를 볼 수 있다.
프로젝트 생성
Jetbrains에서 제공해 주는 Intellij를 이용해 Spring 프로젝트를 쉽게 생성할 수 있다. Intellij 유료 버전에서만 제공해 줌으로 Intellij 무료 버전에서는 지원하지 않는다. https://start.spring.io/ 에서 스프링 부트 프로젝트를 생성할 수 있다. 만일 학생이라면 학생 인증만 하면 Jetbrains에서 제공하는 모든 서비스를 무료로 사용할 수 있다.
Spring Web를 주입하자.
HealthController
@RestController
public class HealthController {
@GetMapping("/health")
public ResponseEntity<String> health() {
return ok("OK");
}
}
HealthController 클래스를 만들어서 Health 상태를 체크하는 api를 작성하자.
@RestController
- 이 어노테이션은 클래스를 RESTful 웹 서비스의 컨트롤러로 지정한다. 컨트롤러 클래스는 HTTP 요청을 처리하고 HTTP 응답을 생성한다.
@GetMapping("/health")
- 이 어노테이션은 "/health" 경로로 들어오는 HTTP GET 요청을 처리하는 메서드를 정의한다. 즉, "/health" 엔드 포인트에 대한 GET 요청을 처리하기 위한 핸들러 메서드이다.
ok("OK")
- ResponseEntity 객체를 생성하여 HTTP 상태 코드를 200(OK)로 설정하고, 응답 본문으로 "OK"라는 문자열을 설정한다. 이를 통해 "/health" 엔드포인트에 대한 GET 요청에 대한 응답으로 "OK" 문자열이 포함된 응답이 생성된다.
즉, "/health" 엔드포인트에 대한 GET 요청을 처리하며 "OK"라는 문자열을 포함한 정상적인 HTTP 응답을 반환한다.
HeathControllerTest
@SpringBootTest
@AutoConfigureMockMvc
class HealthControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void health() throws Exception {
mockMvc.perform(get("/health"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").value("OK"));
}
}
컨트롤러가 정상적으로 작동하는지 테스트코드를 작성해보자.
@SpringBootTest
- 이 어노테이션은 해당 클래스의 SpringBoot 애플리케이션을 시작하고 테스트 환경을 설정하게 된다.
@AutoConfigureMockMvc
- 이 어노테이션은 Spring MVC(Mockito)의 'MockMvc' 객체를 자동으로 구성한다. 이 객체를 사용하여 HTTP 요청 및 응답을 Mock 한다.
@Autowired
- 이 어노테이션은 스프링 프레임워크에서 관리되는 Bean을 주입한다. MockMvc 객체를 주입받는다.
mockMvc.perform(get("/health"))
- MockMvc 객체를 사용하여 HTTP GET 요청을 수행한다. "/health" 엔드포인트에 대한 GET 요청을 보내는 것을 의미한다.
.andExpect(status().isOk())
- HTTP 응답 상태 코드가 200 (OK)인지 확인한다.
.andExpect(jsonPath("$").value("OK"))
- JSON 응답에서 "$" 위치의 값이 "OK"인지 확인한다.
테스트를 실행한다.
정상적으로 작동하였으면 초록색 체크 표시가 나온다.
Build
Gradle과 Intellij를 통해 쉽게 Build를 할 수 있다. 직접 터미널 창에 build를 입력 안 해도 된다.
Build가 성공적으로 완료되면 build/libs 파일에 Jar(executable jar)와 Plain Jar가 생성된다.
Jar(executable jar)는 실행 가능한 JAR 파일로, 독립적으로 실행할 수 있는 Java 애플리케이션을 패키징 하는 데 사용된다.
애플리케이션을 실행하기 위해 java -jar 명령어를 사용할 수 있다.
Plain Jar는 실행 가능한 JAR가 아니라, 클래스 파일과 리소스 파일만 포함하는 파일이다.
우리가 필요한 것은 Jar(executable jar)이다.
build.gradle 파일에서 원하는 version을 입력할 수 있다.
이제 AWS Elastic Beanstalk을 설정해 보자.
Amazon Elastic Beanstalk
AWS 검색창에 Elatic Beanstalk를 입력하면 위의 화면이 나온다.
그전에 회원가입 안되어 있으면 가입을 하자. 신용카드 입력을 해야 한다.
위의 Create application을 누르자.
Step 1 - Configure environment
Environment tier & Application information
Web 애플리케이션을 구성할 것이기 때문에 Web Server environment를 선택하자.
그다음 Application name을 입력하자. 원하는 이름을 설정하면 된다.
Environment information
Environment information은 Elastic Beanstalk 환경의 구성을 정의하는 데 사용되는 정보이다. 이 정보를 설정함으로써 Elastic Beanstalk 환경을 세부적으로 구성하고 조정할 수 있다.
Environment name은 Elastic Beanstlak 환경에 할당할 이름이다. 환경 이름은 고유해야 하며, 해당 환경을 식별하는 데 사용된다.
Domain은 Elastic Beanstalk 환경에 사용자 지정 도메인을 연결할 수 있다. {사용자지정도메인}.{region정보}.elasticbeanstalk.com으로 설정된다.
Check availability를 통해 지정한 도메인이 사용되는지 확인할 수 있다.
Platform
애플리케이션을 배포하는 방법으로 두 가지가 있다.
Managed Platform(관리형 플랫폼)과 Custom Platform(사용자 정의 플랫폼)이 있다.
Managed Platform은 AWS에서 사전에 구성한 환경을 제공한다. 이러한 환경은 특정 프로그래밍 언어, 프레임워크 또는 런타임에 최적화되어 있다. 예를 들어, Node.js, Java, Python과 같은 다양한 플랫폼을 지원한다.
CUustom Platform은 사용자가 직접 환경을 설정하고 관리해야 하므로 애플리케이션 실행 환경을 자체로 만들고 구성해야 한다.
우리는 Managed Platform을 선택하고 스프링 프로젝트이니 Java를 선택하자. 그리고 자바 버전을 맞추기 위해 17 버전을 선택했다.
Application code
처음에 Elastic Beanstalk을 구성할 때 Application code를 직접 넣을 것인지 Elastic Beanstalk가 샘플 코드를 만들어 줄 것인지 선택할 수 있다.
simple_spring_mvc 프로젝트를 이미 파일을 만들었으니 Upload your code를 선택하자.
그리고 Version lable을 입력해야 한다. Version을 통해 원하는 프로젝트를 선택할 수 있으므로 Unique 한 값이 들어가야 된다.
Local file을 선택하여 우리가 만든 jar 파일을 입력하자.
Presets
Use case에 맞는 인스턴스를 구성할 수 있다.
Single instance(단일 인스턴스)가 아닌 Custom configuration(사용자 지정 구성)을 선택해야 한다.
Single instance으로 설정 시 로드 밸런스와 health 체크, 리스너 설정을 할 수 없기 때문이다.
Step 2 - Configure service access
IAM 역할은 Elastic Beanstalk가 서비스 역할로 가정하며, EC2 인스턴스 프로필은 Elastic Beanstalk가 환경을 생성하고 관리할 수 있게 한다. IAM 역할과 인스턴스 프로필은 필요한 권한을 포함하는 IAM 관리 정책에 연결되어야 한다.
아직 존재하는 서비스 역할이 없으니 Create and use new service role를 선택한다.
EC2 Key pair를 통해 Key를 생성할 수 있다.
EC2에 직접적으로 접근이 필요할 때 SSH 프로토콜을 이용할 때 Key가 필요하다. Key를 통해 접근이 가능하게 된다. 만일 EC2에 직접적으로 접근이 필요 없을 때는 Key를 생성할 필요 없으니 'Key 생성'을 넘어가자.
EC2 instance profile를 설정하지 않으면 'The instance profile aws-elasticbeanstalk-ec2-role associated with the environment does not exist.' 같은 오류를 만날 수 있다. 아래와 같이 설정하자.
EC2 instance profile과 key를 생성 및 적용 후 Next를 누르자.
EC2 instance profile 생성
Create Role를 클릭하자.
EC2 인스턴스를 위한 역할이 필요하 EC2 use case를 선택하자.
AWSElasticBeanstalkMulticontainerDocker, AWSElasticBeanstalkWebTier, AWSElasticBeanstalkWorkerTier를 선택하자.
AWSElasticBeanstalkMulticontainerDocker는 다중 컨테이너 Docker환경을 나타낸다. 예를 들어, 웹 서버 컨테이너, 데이터베이스 컨테이너, 백그라운드 작업 컨테이너 등을 함께 실행한다.
AWSElasticBeanstalkWebTier는 웹 서버 역할을 수행하며 HTTP 및 HTTPS 트래픽을 처리한다.
AWSElasticBeanstalkWorkerTier는 백그라운드 작업을 실행하기 위한 환경을 나타낸다.
이름을 설정하고 Create role를 클릭하자.
Key 생성
AWS 검색창에 EC2를 입력하면 나오는 창이다.
Key pairs를 선택하자.
Create key pair를 통해 key를 생성하자.
유니크 한 이름을 입력하자.
Key pair type으로 RSA(Riverst-Shamir_Adleman)과 ED25519 중 하나를 선택할 수 있다.
RSA는 공개키 암호화 및 디지털 서명을 위한 알고리즘으로 가장 널리 사용되는 공개 키 암호화 알고리즘 중 하나이다.
SSL/TLS 인증서 및 데이터 전송에 널리 사용된다.
ED25519는 RSA 이후에 나온 알고리즘이다.
고속 및 안정성 측면에서 이점이 있다고 한다.
Private key file 포맷 방법으로 .pem과 .ppk가 있다.
.pem 파일은 일반적으로 Unix 및 Linux 시스템 및 대부분의 SSH 클라이언트와 호환되며 AWS에서 제공하는 Key Pair의 개인 키 포맷이다.
.ppk 파일은 Windows 환경에서 PuTTY와 같은 특정 SSH 클라이언트에 사용되는 포맷이다.
간단한 프로젝트이기 때문에 RSA를 선택하고 윈도우 환경이면 ppk 아니면 pem를 선택하자.
그리고 Create key pair를 선택하자.
Step 3 - Set up networking, database, and tags-optional
VPC
Amazon Virtual Private Cloud(VPC)는 Amazon Web Services (AWS)에서 제공하는 클라우드 컴퓨팅 환경에서 네트워크를 논리적으로 격리하고 사용자 지정 네트워크 환경을 구축하도록 도와주는 서비스이다.
VPC는 AWS 리소스를 배치하고 구성하는 데 사용되며, 네트워크 트래픽을 관리하고 보안을 강화하기 위한 다양한 옵션을 제공한다.
우리는 간단하게 만들어야 되기 때문에 처음에 회원가입하면 자동으로 생성된 VPC를 이용하자. 하지만 실제로는 VPC도 직접 구성해야 된다.
Instance settings
인스턴스 설정
애플리케이션을 실행하는 인스턴스를 위해 각 가용 영역(AZ)에서 서브넷을 선택한다. 인스턴스를 인터넷에 노출하지 않으려면 Public IP address를 선택 안 하면 된다.
우리는 EC2를 외부에서 접근 가능하게 해야 하기 때문에 Activated로 선택하자.
Instance subnets는 최소 2개를 설정해야 한다. 그러므로 원하는 subnets를 선택하자.
Database
Elastic Beanstalk에 미리 RDS SQL database를 선택할 수 있다.
추후에 RDS를 연결하기 때문에 나중에 설정하자.
Next를 누르자.
Step 4 - Configure instance traffic and scaling - optional
Instances
Container default가 제공되어 있다. 그대로 두자.
Amazon CloudWacth는 Amazon Web Services (AWS) 환경에서 애플리케이션, 리소스 및 서비스를 모니터링하고 관리하기 위한 서비스이다. Amazon CloudWatch의 비용은 사용자가 수집하고 유지하는 데이터 양, 보관 기간, 활용하는 기능 등에 따라 다양하게 변할 수 있다. 최대한 비용이 안 들게 5 minute로 하자.(비용이 아마 들지 않을 것이다.)
Security Group
Security Group은 네트워크 보안 그룹으로서, AWS 리소스에 대한 인바운드 및 아웃바운드 트래픽을 제어하기 위한 가상 방화벽 역할을 한다.
Security Group은 리소스의 네트워크 트래픽 허용 규칙과 거부 규칙을 정의하여 보안을 관리한다.
Security Group은 Stateful이므로 인바운드 HTTP 요청을 허용하면 해당 요청에 대한 응답도 자동으로 허용된다. 따라서 응답을 수동으로 허용 규칙으로 추가할 필요가 없다.
새로운 창을 켜서 AWS 검색창에 EC2를 검색하면 맨 왼쪽 사이드바 하단에 Security Groups를 클릭하자.
Create security group을 설정하자.
이름과 설명을 설정할 수 있다.
그리고 Elastic Beanstalk와 같은 VPC로 설정하자.
Inboud rules에는 허용할 Type만 설정하자. 현재는 HTTP만 필요하므로 HTTP 타입을 선택하고 모든 IPv4가 들어올 수 있도록 설정하자.
security group을 생성하고 Elasitc Beanstalk에서 해당 security group을 선택하자.
Auto scaling group
Auto Scaling gorup은 트래픽이 증가하면 인스턴스를 늘리고, 트래픽이 줄어들면 인스턴스를 줄일 수 있다. 조절 정책 CPU 사용률, 네트워크 트래픽 등과 같은 지표를 기반으로 작동한다. 또한 로드 밸런싱 기능을 통해 트래픽을 원하는 인스턴스로 라우팅 할 수 있다.
로드 밸런싱을 이용해야 하기 때문에 Load balanced를 선택하자.
instances를 1개로 유지해야 무료로 사용할 수 있기 때문에 Max를 1로 고정시키자.
인스턴스 유형으로 On-demand instance와 Spot instance를 선택할 수 있는데 On-demand 인스턴스는 사용한 만큼 비용을 지불하는 유형이고 Spot instance는 온디맨드 가격보다 저렴한 비용으로 제공되는 예비 EC2 용량을 사용하는 인스턴스이다. 우리는 실제적으로 움직이는 인스턴스가 필요하므로 On-demand instance를 선택하자.
Instance types
instace type으로 ec2 프리티어가 충족되는 t2.micro와 t3.micro를 선택하자.(비용이 발생하지 않기 위해 꼭 선택하자.)
Load Balancer Type & Listners
AWS에서 제공하는 로드 밸런스에는 두 가지 유형이 있다.(Classic load balancer는 권장 안 함)
Application Load Balancer는 애플리케이션 레이어(Layer 7)에서 동작하며 HTTP 및 HTTPS 트래픽을 관리한다. 트래픽을 기반으로 라우팅 및 분산을 수행할 수 있다.
Network Load Balancer는 네트워크 레이어(Layer 4)에서 동작하며 TCP 및 UDP 트래픽을 관리한다. 트래픽을 IP 주소 및 포트 기반으로 라우팅 및 분산을 수행할 수 있다.
웹 애플리케이션을 구성하므로 Application Load Balancer를 이용하자.
Linstner를 통해 클라이언트 트래픽을 받을 수 있는 프로토콜을 지정할 수 있다. 현재는 HTTP만 허용하자.
Processes
Processes는 애플리케이션의 health 체크를 할 수 있다.
default process를 수정하자.
이전에 확인한 Controller의 api endpoint로 설정하자.
Spring boot 생성 시 Port를 직접적으로 설정하지 않았기 때문에 기본 포트로 8080이므로 Elastic Beanstalk도 8080으로 입력하자.
Step 5 - Configure updates, monitoring, and logging - optional
Monitoring
개선된 health 기능은 환경 내의 인스턴스 및 기타 리소스의 실시간 애플리케이션 및 운영 체제 모니터링을 무료로 제공한다. 하지만 사용자 정의 메트릭을 이용하는 순간 요금이 부과되니 Basic을 눌러 요금 부하가 되지 않게 하자.
Managed platform updates
관리형 플랫폼 업데이트를 활성화하여 자동으로 플랫폼을 업데이트할 수 있다. 요금부하를 피하기 위해 지정하지 말자.
Email notifications
mail을 입력하면 어떠한 문제사항이나 업데이트가 되었을 때 알림이 온다. 유용하니 자신이 받을 이메일을 입력하자.
Rolling updates and deployments
Elasitc Beanstalk에서 제공하는 배포 전략으로 All at Once, Rolling, Rollng with an addtional batch, Immutable, Traffic splitting이 있다.
Rolling with addtional batch를 선택하고 100 percentage를 선택하자.
Rolling with addtional batch는 일정 persentage가 되면 추가로 새로운 인스턴스를 만들고 인스턴스의 health 체크가 완료되면 load balancer가 새로운 인스턴스로 라우팅 한다. 그리고 이전 인스턴스는 삭제한다. 이러한 방법으로도 추가적인 가격은 들지 않을 것이다. EC2 가격 측정 방식은 인스턴스의 개수에 상관없이 한 달에 720시간 미만으로 사용 시 무료기 때문에 문제없다.
다음을 누르자.
Step 6 - Review
Step 1~ Step 5까지 정한 규칙들이 정리해서 나온다. 만약 잘못 선택했을 시에 수정이 가능하니 확인해 보자.
문제가 없으면 Submit를 누르자.
Events
아직 Health 상태가 Gray일 것이다.
Events를 통해 Elastic beanstalk의 이벤트들을 볼 수 있다.
환경이 생성되고, Elasitc beanstalk에서 내부적으로 SNS, Amazon S3, Security group, Auto scaling, Load balancer, Cloudwatch, EC2 instance가 생성되는 것을 확인할 수 있다.
Health 상태가 Green이 되면 정상적으로 실행이 되었다는 것이다.
Next Step
https://ppaekkomlog.tistory.com/19
Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD) + Amazon RDS(MySQL)으로 백엔드 인프
https://github.com/fineman999/simple_spring_mvc GitHub - fineman999/simple_spring_mvc: Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(CI/CD) + Am Amazon Elastic Beanstalk + Amazon Route 53 + ACM + 가비아 + Github Actions(C
ppaekkomlog.tistory.com
참고
https://earth-95.tistory.com/108
[AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(1) - EB 기본 세팅
들어가기 전에 Elastic Beanstalk을 통해 Springboot CI를 진행하기 위해 Elastic Beanstalk 기본 설정을 진행하였습니다. 다음 포스팅에서는 Github Action을 통해 Elastic Beanstalk에 실 어플리케이션을 배포해볼 것
earth-95.tistory.com
[AWS] Elastic Beanstalk 상태 unknown 오류 해결방법
Elastic Beanstalk에서 애플리케이션을 생성하고 환경 생성을 하려고 하니 다음과 같은 오류가 발생하였다. The instance profile aws-elasticbeanstalk-ec2-role associated with the environment does not exist. 정상적으로 수
dangdangee.tistory.com