-
AWS에 프로젝트 올리기playground(개인블로그pj) 2024. 7. 18. 22:55
java spring boot + react 조합으로 작성한 프로젝트이다.
작년 작품발표회에서 라즈베리파이에 호스팅해보려다가 실패해서 결국 localhost로만 보여줘야 했는데 너무 아쉬웠던 기억이 있다.
내내 계획에 두고 있었지만 실천하지 못했던 aws+rds 호스팅을 해보려고 한다.아래 사이트를 참고하여 진행하면서 생긴 에러들을 해결한 과정을 이 포스트에 정리해본다.
사용한 환경
로컬 : Apple Macbook pro M1
EC2 : amazon linux 2
RDS DB : mysql
IDE : Intelli Jaws 호스팅하는 과정을 참고한 사이트
mysql관련
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
mysql 서버가 꺼져있어서 뜬 에러였다. mysql 켜주기~
DB 재시작 (mysql, homebrew)
$ brew services restart mysql
mysql을 실행시키고 난 후 에러가 발생하였다.
ERROR! The server quit without updating PID file
PID key를 저장해놓은 디렉토리로 이동하여 실행해야 한다.
ssh 접속
$ ssh -i PEM_KEY_FILE_NAME ec2-user@ENDPOINT
Permissions 0644 for 'key.pem' are too open.
private key에 대한 권한을 너무 open했다는 의미이다. 644였던 권한을 600으로 바꿔주면 해결이 된다.
참고 사이트$ sudo chmod 600 ./key.pem
chmod로 권한 바꾸기에 대한 간단 정보
리눅스에서는 파일 및 디렉토리에 대한 권한을 read/write/execute 로 분류해 부여한다.
또한 각 기능에 대해 파일 소유 사용자/특정 그룹에 소속된 사용자/그 외 사용자 로 분류해 부여할 수 있다.
참고 사이트- 644 권한 : 110 / 100 / 100 ; 파일 소유자(r/w) + 그룹 소속자(r) + 그 외 사용자(r)
- 600 권한 : 110 / 000 / 000 ; 파일 소유자(r/w)
위 경우에서는 파일 소유자만이 읽고 쓸 수 있도록 600으로 설정하면 644보다 보안이 강화되므로 해결된다.
GPGkey 이슈로 mysql 설치 안되는 이슈
참고 사이트
Amazon Linux 2에서 지원하지 않는 버전으로 mysql을 설치하려고 했기 때문에 발생한다.$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm $ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 $ sudo yum install mysql-community-server
위와 같이 해결할 수 있다.
참고 사이트에서는 RPM-GPG-KEY-mysql-2022로 나오는데 나의 경우에는 2023으로 해야 해결되었다.
참고 사이트2기존 db -> rds db에 dump
mysqldump로 sql 파일 만들기 참고
해당 sql 파일을 ec2로 복사 (ec2의 home/ec2-user 로 복사됨)
$ sudo scp -i key.pem SQL_FILE EC2_PUBLIC_IP:/home/ec2-user
ec2에서 db로 dump 수행 (실행 전에 해당 덤프해줄 DB는 비어있어야 함)
$ mysql -u jeju -p PW SHEMA < SQL_FILE_ROOT -h DB_ENDPOINT
EC2 관련
JDK 설치
$ wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm 가 안될 경우 $ sudo yum install java-17-amazon-corretto
jar 파일을 ec2에 복사
로컬 안에 파일 f를 외부 컴퓨터 B로 복사한다고 하면
$ sudo scp -i key.pem FILE_f B_PUBLIC_IP
위 경우, key.pem이 있는 디렉토리에서 실행하는 경우도 있지만, 다른 터미널일 경우 각 키와 파일의 절대경로로 명시해주면 어느 곳에서도 원하는 파일을 복사할 수 있게 된다.
spring boot 실행한 뒤의 문제
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
보안 그룹 id를 rds 인바운드 규칙에 추가하지 않아서 발생한 문제로 추정된다
rds 인스턴스 > 인바운드 규칙 편집 > 새 규칙 추가 > ec2 private IP로 변경 > IP/32 붙여서. > 재부팅
으로 해결할 수 있다. 위 같은 문제가 로컬에서 발생할 때는 인바운드 규칙에 로컬 컴퓨터의 현재 IP를 추가하면 접근 가능해진다.
카페 같은 곳에서 와이파이를 사용해 인터넷을 이용하고 접속하려 하면 해당 에러가 뜰 수 있다. 그때는 당시의 IP를 추가하면 되긴 하지만, 보안상 위험할 수 있으니 지양하는 것이 좋다.ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
비밀번호가 일치하지 않거나, 비밀번호를 아예 설정해주지 않은 경우에 발생할 수 있는데, 나의 경우는 바보같은 실수로부터 생긴 문제였다.
"rds와 ec2를 연결한다"라는 것의 개념을 ec2의 로컬에 rds를 연결한다고 이해하고 있었다. 그래서 ec2 로컬에서 계속 rds에서 설정한 user와 비밀번호로 접속하려고 했는데 발생한 에러였다. 반복되다보니 애초에 연결이 안되어있는 것은 아닐까 라는 합리적 의심을 하게 되었고, 결국 구글링 끝에 -h 태그와 함께 엔드포인트로 접속해야 된다는 것을 알게 되었다.$ mysql -u USER -p -h DB_ENDPOINT
알맞은 USER와 DB_ENDPOINT를 적으면 바로 접속 가능하다.
my-project.jar에 기본 Manifest 속성이 없습니다.(no main manifest attribute, in jar)
java spring boot에서 생성된 jar 파일을 실행하려고 하니 발생한 문제였다. jar 파일 내에 함수들에 대한 위치를 알려주는 manifest 속성이 원래는 포함되어있어야 되는데 포함되어있지 않은 상태였다. 제대로 build하는 방법이 무엇인지도 모르고 마냥 빌드 버튼만 누르고 있었는데, 많은 검색 끝에
gradle 로 들어가서 bootJar 를 눌러 jar 파일을 생성할 수 있다는 것을 알게 되었다. build > build artifact로 들어가 지우고 bootJar를 다시 실행해보자.gradle > bootJar
를 통해 jar 파일을 새로 생성한 후 실행하였더니 해결되었다.
The request client is not a secure context and the resource is in more-private address space `local`
CORS_ERROR로 인해 발생된 문제이다. WebConfig 수정을 통해 해결할 수 있다.
public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/\**") .allowedOriginPatterns("*") //...생략 }
'playground(개인블로그pj)' 카테고리의 다른 글
🛠️playground 프로젝트는 유지보수중~🛠️ (0) 2024.07.12