본문 바로가기

Dot Programming/DevOps

[Spring 배포 #0-1] AWS EC2 인스턴스 생성 후 접속하기

    AWS EC2 인스턴스 생성 및 환경 설정 

    EC2(Elastic Compute Cloud)는 AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버이다. 

     

    AWS에서 무료로 제공하는 프리티어 플랜에서는 EC2 사용에 다음과 같은 제한이 있다.

    • 사양이 t2.micro만 가능하다.
    • 월 750시간의 제한이 있다. 초과하면 비용이 부과된다.
    • 24*31 = 744시간이다. 즉 1대의 t2.micro만 사용한다면 24시간 사용할 수 있다.
    • 저번에 2~3개 프리티어 인스턴스를 1달 24시간 돌리니깐 20불정도 부과된 기억이 있다.
      • 탄력적 IP 비용 포함. 탄력적 IP는 1개가 초과되면 비용이 부과되기 시작한다. (요금 정책)

     

    1. EC2 인스턴스 생성 & 탄력적 IP 연결

    1) 본인의 리전을 '서울'로 변경해준다.

     

    리전 변경

     

     

    2) ec2에 접속 >  인스턴스 시작 버튼 클릭

     

    인스턴스 시작

     

     

    3) AMI : Amazon Linux 2 AMI 선택

    책에서는  Amazon Linux AMI를 사용하였지만 해당 버전은 2020년 12월 31일 종료되었다. (참고)

     

    Linux 2 AMI

    Amazon Linux2는 Centos 7버전 자료들을 그대로 사용할 수 있다. 그럼 굳이 Centos AMI를 사용하지 않고 아마존 리눅스 AMI를 사용한 이유는 다음과 같다.

    • 아마존이 개발하고 있기 때문에 지원받기 쉽다.
    • 레드햇 베이스이므로 레드햇 계열의 배포판을 많이 다뤄본 사람일수록 문제없이 사용할 수 있다.
    • AWS의 각종 서비스와의 상성이 좋다.
    • Amazon 독자적인 개발 레포지토리를 사용하고 있어 yum이 매우 빠르다.

     

     

    4) 인스턴스 유형 t2.micro 선택 > 인스턴스 세부 정보 구성은 패스

     

    t2.micro

     

     

    5) 스토리지 구성 > 크기(GiB) 30으로 설정 

    서버의 용량의 기본값은 8GB이다. 모르고 넘어가는 분들이 있는데 30GB까지 프리티어로 가능하다. 물론 그 이상은 비용이 청구된다.

     

    스토리지 구성

     

     

    6) 태그 추가  > (Name) , 값 (인스턴스 표현할 이름) 입력

    웹 콘솔에서 표기될 태그인 Name 태그를 등록한다. 태그는 해당 인스턴스를 표현하는 여러 이름으로 사용될 수 있다.

     

    태그 추가

     

     

    7) 보안 그룹 추가 > [내 IP 설정, 기본 8080 포트 설정] > 검토 및 시작 클릭

    보안 그룹은 방화벽을 이야기한다. '서버로 80포트 외에는 허용하지 않는다'는 역할을 하는 방화벽이 AWS에서는 보안 그룹으로 사용된다.

    • SSH이면서 포트 항목에서 22인 경우
      • AWS EC2에서 터미널로 접속할 때를 이야기한다. pem키가 없으면 접속이 안 되니 전체 오픈(0.0.0.0/0, ::/0)하는 경우가 종종 있는데 이렇게 되면 이후 파일 공유디렉토리나 깃허브 등에 실수로 pem키가 노출되는 순간 서버에서 가상화폐가 채굴되는 것을 볼 수 있을 것이다.
      • 지정된 IP만 접속이 가능하도록 설정하고 다른 장소에서 접속할 경우 해당 장소 IP를 다시 능동적으로 SSH 규칙에 추가하는 것이 안전하다.

     

    보안 그룹 설정

     

     

    8) 인스턴스 검토 > 시작하기 > pem키 생성 혹은 선택  > 인스턴스 시작

    인스턴스로 접근하기 위해서는 pem키가 필요하다. 그래서 마지막 단계는 할당할 pem키를 선택해준다. 일종의 마스터 키이기 때문에 절대 유출하면 안된다. 잘 관리할 수 있는 디렉토리로 저장한다. 기존에 생성된 pem키가 있다면 선택하고 없으면 생성한다.

     

    pem키 생성 혹은 선택

    9) 인스턴스 생성 완료

     

    인스턴스 생성 완료

     

    10) EIP 할당하기

    인스턴스도 결국 하나의 서버이기 때문에 IP가 존재한다. 인스턴스 생성 시에 항상 새 IP를 할당하는데, 한 가지 조건이 더 있다. 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당된다. 즉, 요금을 아끼기 위해 잠깐 인스턴스를 중지하고 다시 시작하면 IP가 변경되는 것이다. 

     

    매번 접속해야 하는 IP가 변경돼서 매우 번거로우므로 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 가지게 해야 한다. 그래서 고정 IP를 할당해준다.

     

    10-1) 메뉴 : 탄력적 IP 클릭 > 탄력적 IP 주소 할당 버튼 클릭 > 할당 버튼 클릭

     

    탄력적 IP 할당

     

    10-2) 생성된 탄력적 IP 클릭 > 작업 > 탄력적 IP 주소 연결 클릭

    탄력적 IP 주소 연결

     

    10-3) 생성한 EC2 인스턴스(spring-deploy-test) 선택 > 연결

     

    인스턴스 연결

     

    EC2 인스턴스로 돌아가 확인해보면 탄력적 IP가 할당되었음을 확인할 수 있다.

     

    인스턴스 확인

     

     

    2. EC2 서버 접속하기

    Mac에서 EC2로 접속해보자. 만약 오랜 시간 접속이 안 되거나, 권한이 없어서 안 된다고 메시지가 나온다면 다음을 확인해보자.

    • HostName 값이 정확히 탄력적 IP로 되어있는지 확인
    • EC2 인스턴스가 running 상태인지 확인
    • EC2 인스턴스의 보안그룹 → 인바운드 규칙에서 현재 본인의 IP가 등록되어 있는지 확인

     

    AWS와 같은 외부 서버로 SSH 접속을 하려면 다음과 같이 긴 명령어를 입력해야 한다.

    • ssh -i pem 키 위치 EC2의 탄력적 IP 주소

     

    1) pem키 ~/.ssh 로 복사하기

    매번 입력하기 상당히 귀찮으므로 쉽게 접속할 수 있도록 설정하자. 좀 전에 받은 키페어 pem 파일을 ~/.ssh/로 복사한다. ~/.ssh/ 디렉토리로 pem 파일을 옮겨 놓으면 ssh 실행 시 pem 키 파일을 자동으로 읽어 접속을 진행한다.

     

    이후부터는 별도로 pem 키 위치를 명령어로 지정할 필요가 없게 된다.

    • cp pem 키를 내려받은 위치 ~/.ssh/

     

    pem키 복사

     

    2) ~/.ssh로 이동 및 파일 목록 확인하기

    pem 키가 잘 복사되었는지 ~/.ssh 디렉토리로 이동해서 파일 목록을 확인해 보자.

    • cd ~/.ssh/
    • ll

     

    ~/.ssh/

     

    3) pem키 권한 변경

    복사되었다면 pem 키의 권한을 변경해주자.  chmod는 [file | directory][user (rwx)][group (rwx)][others (rwx)]로 구성 된다. 각 권한은 r= 4, w= 2, x=1으로 나타내진다. 만약 user와 group에게 read 권한을 부여하려면 chmod 440으로 적용하면 된다.

    • chmod 600 ~/.ssh/{pem 키 이름}

     

    pem 키 권한 변경

     

    4) config 파일 생성 및 권한 설정

    권한을 변경하였다면 config 파일 생성 후 본인이 원하는 Host로 등록한다. Host를 앞으로 접속할 키 값으로 보면 된다. Host 외에 HostName은 탄력적 IP 주소를 사용하면 된다. 해당 파일 설정 완료 후 실행 권한이 필요하므로 권한 설정을 해준다.

    • vim ~/.ssh/config
      • i : 입력, :wq: 저장 후 종료
    • chmod 700 ~/.ssh/config

     

    config 설정
    권한 설정

     

    5) EC2 접속

    이제 ssh {Host 이름}으로 EC2에 접속해보자. yes를 입력하면 다음과 같이 EC2 접속에 성공한다.

    • ssh test

     

    EC2 접속 성공

     

    SSH 접속시 RSA 공유키 충돌 문제 해결 방법

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    SHA256:lFi0HDC+/hyK+vQeKOl/miBLaCfLKA0B5EDdg2VQMpU.
    Please contact your system administrator.

    해당 충돌 발생 이유는 기존에 접속한 적이 있는 서버와 RSA 공유키를 교환한 상태에서 또 다른 서버로 접속을 시도해서 그렇다. 경고 메시지는 Man in the Middle Attack 이라는 일명 '중간자 공격'에 대해 경고한다. 즉, 기존에 서버가 알고있던 정보를 찾아서 따라갔더니- 기존과는 전혀 다른 서버로 접속되었다는 것이다.

     

    하지만 이 경우는 운영자인 내가 고의적으로 변경한 것이기 때문에 해킹 당한 것은 아니다. (스푸핑)

     

    이를 해결하기 위해 간단하게 명령어를 통해 초기화 시켜주면 된다.

    • ssh-keygen -R [ IP or DomainName]

     

    ssh-keygen 초기화

     

     

    3. AWS EC2(Linux) 서버 생성시 꼭 해야 할 설정들

    3-1. Java 8 또는 Java 11 설치

    yum으로 설치 가능한 Java는 버전 8까지 가능하다. 설치 가능한 jdk를 확인해보면 7, 8버전이 있다.

    •  yum list java*jdk-devel

     

    설치 가능한 jdk 확인

     

    Java 8 설치하기

    Java 8을 사용하려면 다음 명령어를 실행해주면 된다. 설치 후 버전을 확인해주면 다음과 같이 나온다.

    • sudo yum install -y java-1.8.0-openjdk-devel.x86_64
    • java -version

     

    java 8 설치 및 확인

     

     

    Java 11 설치하기

    Java 11은 직접 설치를 해줘야 한다. 설치 방법은 두 가지가 있다. 나는 아마존에서 제공하는 AWS Corretto를 이용해서 다운을 받을 것이다. 왜냐하면 오라클에서는 ec2에 파일을 직접 받아 .sh파일 수정 후 직접 실행해줘야 되어서 좀 더 귀찮기 때문이다.

    • 아마존에서 제공하는 OpenJDK인 AWS Corretto를 다운받아 설치 (check)
    • 오라클에서 직접 OpenJDK 파일을 받아 설치 후 실행 (check)

     

    AWS Corretto 다운 방법은 다음과 같다.

     

    Corretto 설치

     

     

    JDK 11를 설치해준다. yes를 입력하면 설치가 완료된다.

    • sudo yum localinstall jdk11.rpm

     

    jdk11 설치

     

     

    해당 명령어로 jdk 버전을 11로 변경해준다. 

    • sudo /usr/sbin/alternatives --config java
    • java -version

    jdk 11 설치 완료

     

     

    3-2. 타임존 변경

    EC2 서버의 기본 타임존은 UTC이다. 이는 세계 표준 시간으로 한국의 시간대가 아니다. 즉, 한국의 시간과는 9시간 차이가 발생한다. 이렇게 되면 서버에서 수행되는 Java 애플리케이션에서 생성되는 시간 모두 9시간씩 차이나기 때문에 꼭 수정해줘야 한다. 수정 후 date로 타임존이 KST로 변경된 것을 확인할 수 있다.

    • sudo rm /etc/localtime
    • sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
    • date 변경된 타임존을 확인해본다.

     

    타임존 변경하기

     

     

    3-3. hostname 설정

    여러 서버를 관리 중일 경우 IP만으로 어떤 서비스의 서버인지 확인이 어렵기 때문에 각 서버가 어느 서비스인지 표현하기 위해 HOSTNAME을 변경해주는 것이 좋다.

    • sudo hostnamectl set-hostname {변경할 hostname}
    • cat /etc/hostname 으로 변경된 hostname확인
    • sudo reboot 변경한 후 서버를 재부팅시켜준다

     

    hostname 변경하기

     

    재부팅 후 재접속하면 변경된 HOSTNAME을 확인할 수 있다.

     

    재부팅 후 Hostname 변경 확인

     

     

     


    [Spring 배포 #0-1] AWS EC2 인스턴스 생성 후 접속하기

    [Spring 배포 #0-2] AWS RDS 인스턴스 생성하기 및 EC2와 연동하기

    [Spring 배포 #1] AWS EC2 서버에 스프링 프로젝트 수동으로 배포하기

    [Spring 배포 #2-1] Travs-ci, S3 생성 및 연동하기

    [Spring 배포 #2-2] CodeDeploy 생성 및 연동하기 (Travs-ci, S3)

    [Spring 배포 #3] 스프링 프로젝트 실제 배포 자동화하기

    [Spring 배포 #4] Nginx로 스프링 프로젝트 블루-그린 무중단 배포하기


    참고

    스프링 부트와 AWS로 혼자 구현하는 웹 서비스