본문 바로가기

Public Cloud/AWS

AWS 자습 노트 - 2. 가상머신 EC2 Service Instance 생성 및 활용 (1)

반응형

About AWS EC2

AWS에서 가장 최초로 제공했던 2개의 서비스 중 1개이며(다른 하나는 S3 ; Simple Storage Service) 가상 Computing 기능을 제공한다. 이번 Posting과 다음 Posting에 걸쳐 EC2 Instance를 생성해서 WEB Server와 Application Server를 구성하는 실습을 정리하려고 한다.

Create WEB Application Example

필자는 Spring Boot (v2.1.4) + Gradle 조합으로 Project를 하나 생성했고 Gradle Build를 통해 만들어지는 jar 파일을 실행시켜 WEB Application을 구성하였다.  WEB Application은 아래의 Controller Code를 추가하여 Root Path로 오는 GET request에 대해 응답을 하게 만들었다. (input parameter 존재 여부에 따라 Response String이 약간 달라지게 되어 있다.)


[ DemoController.java ]

...
@RestController
@RequestMapping(value="/")
public class DemoController {
	
	@Value("${visitor.name}")
	String	defaultVisitor;
	
	@RequestMapping(value="/")
	public String demoAPI(@RequestParam(required=false) String input) {
		
		if (input != null && !input.isEmpty())
			return new StringBuilder("Hello. ").append(input).append(". Welcome to Brown-Dwarf World.").toString();
		else 
			return new StringBuilder("Hello. ").append(defaultVisitor).append(". Welcome to Brown-Dwarf World.").toString();
	}
}
...

향후 기능 확장을 위한 외부 설정 File을 basic.properties라는 이름으로 따로 관리하였고 현재는 Test용으로 한개의 Property만 사용했다.


[ basic.properties ]

...
visitor.name=Red-Dwarf
...

실행한 후에 Browser에서 localhost:8080으로 접속 하면 아래와 같은 결과를 확인할 수 있고 input이라는 인자의 값에 따라 Return되는 String이 다르게 된다. (입력 값이 없을 경우에는 basic.properties에 있는 visitor.name 값을 사용하게 된다.)


[input에 SUN을 입력했을 경우]


[input에 입력 값이 없는 경우]

Create EC2 Instance

이제부터는 AWS Console을 이용해서 EC2 Instance를 만들고 거기에 앞서 만들었던 예제 웹서비스를 올리려고 한다.


  • Step 1 : AWS Management Console에 로그인 한 후 상단에 서비스를 선택 후, '컴퓨팅' > 'EC2'를 선택하면 아래와 같은 화면이 나오고  중간에 위치한 '인스턴스 시작''을 클릭하면 EC2 Instance 생성을 위한 페이지로 진입하게 된다.


  • Step 2 : 제일 처음에는 AMI(Amazon Machine Image)라고 OS가 포함된 가상 머신을 선택해야 합니다. 크게는 Linux와 Window 중 하나를 선택하는 것이고, 필자는 Redhat Linux 계열이 다소 익숙하기 때문에 Redhat Linux를 선택했습니다.



  • Step 3 : AMI를 선택한 후에는 EC2 Instance가 어떤 성능에서 동작할 지 선택하게 되는데, 필자는 돈이 없기 때문에 프리 티어로 사용 가능한 t2.micro 유형을 선택했습니다. (1 CPU, 1GB 메모리)


  • Step 4 : 여기까지 선택했으면 바로 '검토 및 시작' 버튼을 클릭해서 EC2 Instance를 생성할 수 있지만, 좀 더 세부 설정을 할 경우에는 '다음:인스턴스 세부 정보 구성'을 선택해 좀 더 자세히 인스턴스를 구성할 수 있다. 필자는 세부 구성 사항 중 '6. 보안 그룹 구성' 단계에서 8080 Port가 Public한 접근을 허용해서 위에서 만든 예제가 동작할 때 외부 Browser에서 접근할 수 있게 하였습니다.


  • Step 5 : EC2 Instance 생성의 마지막 단계에서 설정 사항을 검토한 후 '시작하기' 버튼을 클릭하면 아래와 같이 Key-Pair 설정에 관련된 Pop-up이 보여집니다. 여기서 정의된 Key Pair를 통해 향후 SSH 접근을 하게됩니다. (필자는 이전에 만들어진 Key-Pair 가 없기 때문에  aws-browndwarf-keypair 라는 이름의 Key-Pair를 생성해서 다운로드 받았습니다.



위의 과정이 끝나면 약간의 시간이 지난 후 EC2 Instance가 Running 상태가 되고, 이 때 아래 그림과 같이 Domain Name과 Public IP를 확인할 수 있습니다. 이 Domain-Name과 IP Address는 EC2 Instance를 중지 시키게 되면 날라가게 되고 다시 시작하더라도 다른 값으로 재설정하게 됩니다. (Restart일 경우에는 기존 설정 유지) 만약 이 값을 항상 동일하게 유지하려면 AWS의 다른 서비스와 연결해야 합니다.



EC2 Instance에 WEB Service 올리기

만들어진 EC2 Instance 상태를 확인하기 위해 SSH로 접속해보자. SSH로 접속하는데 사용하는 Keyword는 다음과 같다.

ssh -i [key pair 파일 위치] [EC2 instance의 Domain name or IP Address]

...
[browndwarf@localhost ~]$ ssh -i ./Downloads/aws-browndwarf-keypair.pem ec2-user@ec2-13-209-15-0.ap-northeast-2.compute.amazonaws.com
Last login: Thu May  2 02:15:21 2019 from 121.136.189.225
[ec2-user@ip-172-31-22-117 ~]$ ls
[ec2-user@ip-172-31-22-117 ~]$ 
...

SSH로 접속해서 파일을 확인해 보니 위와 같이 아무 파일도 존재하지 않는 상태임을 알 수 있다. 여기에 SFTP를 통해 위에서 만든 WEB Service의 Jar 파일과 basic.properties 파일을 올렸습니다. SFTP는 SSH Protocol을 이용하기 때문에 SSH 접속 방법과 비슷하게 Key-pair File을 활용해야 합니다.

sftp -i [key pair 파일 위치] [EC2 instance의 Domain name or IP Address]

...
[browndwarf@localhost ~]$  sftp -i ./Downloads/aws-browndwarf-keypair.pem ec2-user@ec2-13-209-15-0.ap-northeast-2.compute.amazonaws.com
Connected to ec2-13-209-15-0.ap-northeast-2.compute.amazonaws.com.
sftp> ls
sftp> lcd ~/work/webappdemo/build/libs    <-- Source Device의 Path 변경
sftp> put web*.jar                                     <-- File Upload
Uploading webappdemo-0.0.1-SNAPSHOT.jar to /home/ec2-user/webappdemo-0.0.1-SNAPSHOT.jar
webappdemo-0.0.1-SNAPSHOT.jar                 100%   18MB   8.6MB/s   00:02    
...    
sftp> lcd ~/work/webappdemo       <-- Source Device의 Path 변경
sftp> put basic.properties               <-- File Upload
Uploading basic.properties to /home/ec2-user/basic.properties
basic.properties                              100%   22     4.4KB/s   00:00  
...
[ec2-user@ip-172-31-22-117 ~]$ ls -l
total 18052
-rw-rw-r--. 1 ec2-user ec2-user       22  5월  2 02:28 basic.properties
-rw-rw-r--. 1 ec2-user ec2-user 18480026  5월  2 02:27 webappdemo-0.0.1-SNAPSHOT.jar
...

위에서 2개의 파일이 EC2 Instance에 Upload된 것을 확인할 수 있다.

Upload된 Jar 파일을 실행시키려 하는데 아래와 같이 JDK Library가 설치되지 않은 것이 확인되었고, (AMI에 따라 기본 설정 상태가 다른 것으로 추정된다. 어떤 예에서는 이미 JDK가 설치되어 있는데 Redhat Linux Instance의 경우에는 JDK가 설치되어 있지 않았다.) yum을 통해 JDK를 설치하였다. 그 후에 webappdemo-0.0.1-SNAPSHOT.jar를 실행시켰더니 정상적으로 Log가 출력 되면서 WebappdemoApplication이 실행되었다는 Message가 나왔다.

...
[ec2-user@ip-172-31-22-117 ~]$ java -version
-bash: java: command not found

[ec2-user@ip-172-31-22-117 ~]$ sudo yum install java-1.8.0-openjdk.x86_64
...
Complete!

[ec2-user@ip-172-31-22-117 ~]$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
...
[ec2-user@ip-172-31-22-117 ~]$ java -Denvpath=./ -jar webappdemo-0.0.1-SNAPSHOT.jar 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.4.RELEASE)
...
2019-05-02 02:51:24.760  INFO 8996 --- [           main] c.b.webappdemo.WebappdemoApplication     : Started WebappdemoApplication in 6.155 seconds (JVM running for 7.235)
...


실행되는 EC2 Instance의 Public IP를 이용해서 일반 Browser에서 접근하였더니 Local Machine에서 실행할 때와 동일한 Message를 확인할 수 있었다. (즉, Web Service가 정상적으로 동작함을 확인하였다.)