[AWS] Elastc Beanstalk으로 ec2생성 및 배포~1.EB생성~(아마존 엘라스틱 빈스톡 신촌 더조은 학원 )__-EB 사용법-++
~1.EB생성~
0. 사용하지 않는 기존 AWS 서비스 제거
# EC2 제거
- EC2 > 인스턴스 > 인스턴스 상태> ec2 인스턴스 삭제(종료)
# RDS 제거
- rds 데이터베이스 > 레코드 상세 > 작업 > 삭제
- RDS > 스냅샷 > 종료된 스냅샷 삭제
- RDS > 자동백업 > 레코드 있으면 삭제
1. AWS Elastic BeanStalk 생성 (첫번째 시도 : 오류발생)
- Elastic Beanstalk > 환경 > 환경생성
# 환경구성
- 환경티어 : 웹서버환경
- 어플리케이션 정보
어플리케이션이름 : springex
애플리케이션 태그 키 : Name
값 : springex-beanstalk
- 환경정보
환경이름 : Springex-env
도메인 : springex001 > 가용성확인 (도메인서버이름 확인가능)
- 플랫폼
플랫폼 선택 : 톰캣 지정
플랫폼 브랜치 : 톰캣9 correto 17 (플랫폼버전 기본선택)
- 어플리케이션 코드 : 샘플 어플리케이션
- 사전 설정
단일 인스턴스(프리티어 사용가능)
* (고가용성 : 오토스케일링 트래픽에 따라 서버가 늘었다 줄었다함)
- 다음
# 서비스 엑세스 (이 설정에서 오류가 많이남)
- 서비스 역할 : 새 서비스 역할 생성 및 사용
- EC2 키페어 AWS_TEST_KEY(EC2처음 생성할 떄 만들어놓은 키페어) 지정
- EC2 인스턴스 프로파일 없으면 다음
# 네트워킹, 데이터베이스 및 태그 설정
- vpc : input 눌러서 나오는 것 선택
-인스턴스설정
퍼블릭 ip주소 활성화 체크
인스턴스 서브넷 : 가용영역 c 선택 (b는 일부서비스 제한될수있음)
- 데이터베이스
데이터베이스 서브넷 : c선택
데이터베이스 활성화
스냅샷 : 없음
엔진 : mysql
엔진 버전 : 버전 8.0.35
인스턴스 클래스 : db.t3.small
스토리지 : 10GB
사용자 이름 : springex
암호 : password0729
데이터베이스 삭제 정책 : 보통은 스냅샷 생성해야지만 지금은 삭제
> 다음
# 인스턴스 트래픽 및 크기 조정 구성
- 인스턴스
EC2보안그룹 : default로 선택 (만들때 디폴트에 만듬 추후수정가능)
- 용량
오토 스케일링 그룹
환경 유형
- 단일인스턴스
* ( 밸런싱된 로드 최소 최대(4대) 가능)
* ( 최소값 2이상 선택시 로드밸런서 옵션 나옴 )
* ( 인스턴스는 EC2를말함 )
- 인스턴스 유형
필요 시 t3.small 체크해제 (돈나감)
- 나머지 default 설정
# 업데이트, 모니터링 및 로깅 구성
- 전체 default 설정 > 다음
(환경속성은 집어넣을수있지만 이번엔 선택 안함)
# 검토
- 서비스 엑세스 확인 > 제출
( 완료까지 잠시 대기 > 완료 후 도메인 누르면 브라우저가 접속이 되어야함 )
# 오류 발생
- 환경 생성 중 오류발생
(환경과 연결된 aws-elasticbeanstalk-ec2-role 인스턴스 프로파일이 존재하지 않습니다.)
2. AWS IAM 정책 및 역할 생성
## EC2 인스턴스 프로파일 만들기
# 정책 생성
- IAM > 엑세스관리 > 정책 > 정책 생성
- 권한지정
JSON 탭 선택 > 아래 내용으로 대체 ( 와일드카드로 전채 정책에 대한 권한 지정 ) > 다음
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
* ( 와일드카드로 전체 권한이 아니게 설정 하려면 아래 링크 참고 )
https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/iam-instanceprofile.html
- 검토 및 생성
정책 이름 : testPolish
> 정책 생성
# 역할 생성
- IAM > 역할 > 역할 생성
- AWS 서비스 > 서비스 또는 사용사례 : EC2 > 다음
- 권한 정책 : test 검색 > testPolish (생성한 정책) 선택 > 다음
- 역할 이름 : testCustomerProfile > 역할 생성
- IAM > 역할 > 생성한 역할 선택 > 권한
- 권한추가
AmazonEC2RoleforSSM
AWSElasticBeanstalkEnhancedHealth
AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
- 권한 경계
AdministratorAccess
- 신뢰 관계
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"elasticbeanstalk.amazonaws.com",
"ec2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
3. AWS Elastic BeanStalk 생성 (두번째 시도 : 다른부분만 체크)
- 어플리케이션 > 새환경생성
# 환경 구성
애플리케이션 이름 : springex01
도메인 springex1 > 다음
# 서비스 엑세스 구성
서비스 역할 : aws-elasticbeanstalk-service-role
EC2 키페어 : AWS_TEST_KEY
EC2 인스턴스 프로파일 : testCustomerProfile (생성한 역할) 선택
# 네트워킹 및 데이터베이스
퍼블릭 IP 주소 : 활성화 체크
인스턴스 서브넷 전부선택
데이터베이스 서브넷 전부선택
데이터베이스 활성화
# 나머지 기본설정 > 검토 > 제출
4. AWS Elastic BeanStalk 테스트
# 대기 (대기 중 만들어졌는지 궁금하면 EC2에서 인스턴스 뜨는지 확인) > 완료 후 도메인 선택
# 상태 ok 확인
상태탭에서는 향상된 인스턴스 상태를 보면 ok가 있는데
주기적으로 신호를 보내서 응답이 200이 떨어지면 살아있다고 판단함
# 완료되면 도메인아래 링크로 들어가서 파란색 화면이 뜨는지 확인
5. DB 연결
# 디비서버 연결설정
- 엘라스틱 빈스톡 > 환경 들어가기 > 구성
네트워킹 및 데이터베이스 편집
엔드포인트 복사 (포트빼고 복사)
awseb-e-wgvgx6ebvp-stack-awsebrdsdatabase-4oxwabdh9w1f.cjyiuckgsss2.ap-northeast-2.rds.amazonaws.com
server01 접속
root-context.xml 수정
url에 jdbc:mysql:/엔드포인트집어넣기:3306 ~~~
user springex
paaswd paassord
bash ./gradlew build
생성된 war파일 로컬에 저장
환경 > 레코드선택 > 업로드 배포
war파일 선택 > 배포
도메인 링크 선택
404에러 나옴 (테이블이 없다)
로그확인
로그탭 선택
로그요청 > 마지막 100줄 (로그다운로드 생김)
- 엘라스틱빈으로 생성한 ec2 인스턴스에 원격연결 및 db설치 및 db설정
리모트하나추가 (엘라스틱빈 환경도메인 : 생성된 ec2 private ipv4 )
호스트네임 : 환경개요 도메인
Host EB-EC2
HostName springex001.ap-northeast-2.elasticbeanstalk.com
User ec2-user
Port 22
IdentityFile C:\key-pair\EC2forLinux.pem
ping 테스트 root-context에서 복사
ping awseb-e-wgvgx6ebvp-stack-awsebrdsdatabase-4oxwabdh9w1f.cjyiuckgsss2.ap-northeast-2.rds.amazonaws.com
sudo yum search mariadb105
sudo yum install mariadb105 -y
mysql -u springex -p -h awseb-e-wgvgx6ebvp-stack-awsebrdsdatabase-4oxwabdh9w1f.cjyiuckgsss2.ap-northeast-2.rds.amazonaws.com
비번 password0729
use webdb
지난번에 주신 dump파일 sql 전부 실행
show tables 확인
엘라스틱 빈스톡 > 환경 > 작업 > 앱서버 다시시작
도메인 접속 > http://springex001.ap-northeast-2.elasticbeanstalk.com/todo/register
# 요금 나가니 삭제하기
* EB-EC2
ifconfig
172.31.45.175 (ec2 인스턴스 private ipv4)
* 생성된 rds 주소 ip는? 아마존 서울리전에 설치되어있으며, 엔드포인트는(출발지혹은 도착지)
awseb-e-wgvgx6ebvp-stack-awsebrdsdatabase-4oxwabdh9w1f.cjyiuckgsss2.ap-northeast-2.rds.amazonaws.com
설치되어있는 아마존서버의 서브넷
subnet-0c32ba16cef28d23a
subnet-0c623302dc9aff629
subnet-00cfb8084170e2205
subnet-0067563e2bb46bb6c
* 왜 퍼블릭ip가없는가?
db는 퍼블릭ip설정 없음 ec2 내부ip로만 통신함
통신할때 dns 도메인을 사용 (엘라스톡빈 서비스 > 환경 > 레코드선택 > 도메인)
springex001.ap-northeast-2.elasticbeanstalk.com (ex2 퍼블릭 dns 주소)
rds 데이터베이스 > 레코드선택 > 엔드포인트
awseb-e-wgvgx6ebvp-stack-awsebrdsdatabase-4oxwabdh9w1f.cjyiuckgsss2.ap-northeast-2.rds.amazonaws.com (rds dns주소)
* (ex2 퍼블릭 dns 주소) 와 (rds dns주소) 가 통신함
# 서버02 배포 테스트(aws 아님)
- 서버01
- 서버01에서 jdbc설정
<property name="jdbcUrl" value="jdbc:mysql://192.168.100.178/webdb?serverTimezone=Asia/Seoul"></property>
<property name="username" value="spring"></property>
<property name="password" value="spring"></property>
- HealthController 생성
package com.zerock.springex.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HealthController {
@GetMapping("/") //GET방식일 때...
public String health() {
return "this server is running";
}
}
user1@myserver01:~/springex-main$ sudo ./gradlew test
user1@myserver01:~/springex-main$ sudo ./gradlew build
user1@myserver01:~/springex-main$ scp ./build/libs/springex-1.0-SNAPSHOT.war user1@192.168.15.102:~
서버02
- ll로 war파일확인
- 기존배포파일삭제
sudo rm -rf /usr/local/lib/tomcat/webapps/*
- war파일 이동
sudo mv springex-1.0-SNAPSHOT.war /usr/local/lib/tomcat/webapps/ROOT.war
- 톰캣 중지
sudo /usr/local/lib/tomcat/bin/shutdown.sh
- 톰캣 재시작
sudo /usr/local/lib/tomcat/bin/startup.sh
* 톰캣 오류 확인 시
cd /usr/local/lib/tomcat/logs/
ll
sudo vim localhost.2024-07-31.log
sudo vim catalina.out
netstat -antup | grep 80
#돈안나갈려면 삭제필요
eb에서 환경만 중지하면 다른것도 중지됨 (다음날확인필요)
댓글
댓글 쓰기