들어가며


 여러 이유가 있지만, RDBMS를 사용하며 DB 커넥션을 확인해줘야 할 때가 있습니다. 이번 포스팅에선 여러 RDBMS중에 mysql의 커넥션을 확인하는 방법과 프로세스를 죽이는 방법에 대하여 알아보도록 하겠습니다.


query로 확인하기

 

 서비스를 운영하다 보면 개발 뿐만 아니라 DB에서도 체크해야 할 많은 부분이 있습니다. 우선적으로, DB에서 커넥션을 확인하고 임시적으로 조치를 취하는 방법에 대하여 알아보도록 하겠습니다.


# db 커넥션 최대값

show variables where Variable_name = 'max_connections';

# 해당 DB의 맥시멈 커넥션 값을 알 수 있습니다. 이 이상으로 커넥션은 맺어지지 않습니다.



# 현재 맺어진 커넥션 풀 갯수

show status like 'Threads_connected';

# 현재 DB에 맺어진 커넥션 수 입니다. 최대값보단 적거나 같게 유지됩니다. 

# 만약 이 수가 같거나 비슷하다면 DB의 성능을 스케일링 할 필요가 있습니다.



# 커넥션이 맺어져 있는 프로세스 리스트 (필요 칼럼만)

show full processlist;

# 커넥션의 리스트를 볼 수 있습니다. 아래와 같이 나오며 'TIME'과 'COMMAND' 상태를 유심히 보아야 합니다.

+-------+------+-----------------+--------+---------+------+-----------+----------------------------------------------------------+
| ID    | USER | HOST            | DB     | COMMAND | TIME | STATE     | INFO                                                     |
+-------+------+-----------------+--------+---------+------+-----------+----------------------------------------------------------+
|     5 | ssss | localhost:41060 | somedb | Sleep   |    3 |           | NULL                                                     |
| 58169 | root | localhost       | somedb | Query   |    0 | executing | select * from sometable where tblColumnName = 'someName' |



# 문제가 있는 쿼리에 대해서는 조치를 취해야 합니다

select * from information_schema.processlist where command!='sleep' and time>10;

# 여기서 나오는 쿼리는 실질적으로 10초 이상 걸리는 쿼리입니다. 인덱싱을 확인해보고 튜닝을 하는게 좋습니다.

# 하지만 이러한 쿼리들이 동시다발적으로 프로세스를 선점하고 있어서 문제가 발생시키고 있다면 임시적으로 조치를 취해야 합니다.

kill 해당프로세스ID


우선적으로 서비스 되고 있다면 해당 쿼리가 수행되지 않게 막고 튜닝하는게 좋습니다.



# 커넥션이 맺어져 있는 프로세스 리스트 (자세히)

SELECT * FROM information_schema.processlist;



# ip 별 커넥션 수

SELECT tmp.ipAddress

     , COUNT(*) AS ipAddressCount

     , tmp.db

     , tmp.USER

  FROM (

        SELECT pl.id

             , pl.user

             , pl.host

, pl.db

, pl.command

, pl.time

, pl.state

, pl.info

, LEFT( pl.host, ( LOCATE( ':', pl.host ) - 1 )) AS ipAddress

  FROM INFORMATION_SCHEMA.PROCESSLIST pl ) AS tmp

GROUP BY tmp.ipAddress

ORDER BY ipAddressCount DESC;

# 여러 서버에서 DB에 접근할 경우 커넥션을 적절히 분배해야 합니다. 해당 서버의 커넥션을 확인하고 트래픽 대비 커넥션이 많거나 적게 잡혀 있다면 조절해야 합니다!!

 

임시 조치를 취한것은 다음에도 반드시 재현되는 문제이므로 DB를 향상시키거나 프로그램 로직상의 문제를 개선하는 것이 중요합니다!!


참조

https://mariadb.com/kb/en/show-processlist/

https://mariadb.com/kb/en/kill/

https://mariadb.com/kb/en/thread-command-values/

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


  이번 포스팅에선 AWS 파일서버인 S3에 대하여 알아보고, S3의 생성, 연결 및 관리 방법에 대하여 알아보도록 하겠습니다.




S3란?

 

  S3란 Simple Storage Service의 약자입니다. 아마존에서 사용하는 파일 서버로 용량에 관계없이 파일을 저장할 수 잇고 웹에서 HTTP 프로토콜을 이용하여 파일에 접근할 수 있습니다. S3를 써야 하는 이유는 성능과 비용에 있습니다. 대용량의 파일 저장을 EC2와 EBS를 통해 구축한다면 상당히 많은 비용이 청구됩니다. (EC2는 RDS와 함께 AWS에서 많은 비용을 차지하는 부분중에 하나이기 때문에 EC2서버와 파일서버를 분리하는 것을 권장합니다) S3는 저장 용량이 무한대이고 파일저장에 최적화 되어 있습니다. 


 따라서, 동적 웹페이지를 EC2에 구축하고, 이미지 관련 정적 파일 등은 S3에 업로드 하여 구축합니다. S3는 흔히 웹하드와 비교하곤 하지만 HTTP를 이용한 파일 업로드/다운로드를 처리하기에 사용하기에 쉽습니다.


* S3 기본 개념


- 객체 (Object)

: S3에 데이터가 저장되는 최소 단위입니다. 객체는 파일과 메타데이터로 구성됩니다.

: 기본적으로 키(Key)가 객체의 이름이며 값(Value)이 객체의 데이터입니다.

: 객체 하나의 크기는 1 바이트부터 5TB까지 지원됩니다.


-  버킷(bucket)

: S3에서 생성할 수 있는 최상위 폴더입니다.

: 버킷은 리전(지역) 별로 생성해야 합니다. 버킷의 이름은 모든 S3 리전 중에서 유일해야 합니다

: 폴더 생성이 가능하고 버킷안에 객체가 저장됩니다.

: 저장 가능한 객체의 개수와 용량은 무제한입니다.

: 접속 제어 및 권한 관리가 가능합니다.


S3 버킷생성




먼저, S3 대쉬보드에서 버킷을 누른후 '버킷 만들기'를 클릭합니다.




 다음으로 버킷이름과 리전을 선택하여 줍니다. 리전은 지역 위치에 따라 속도가 차이가 많이 나므로, 운영할 서버 EC2에 위치한 리전으로 선택 해주는게 좋습니다. 버킷이름은 유니크 하기 때문에 이미 리전에 생성된 이름이 있으면 사용할 수 없습니다.



 생성된 버킷에 들어가면 다음과 디렉토리를 만들고 업로드, 다운로드를 대쉬보드내에서 진행 할 수 있습니다. 하지만, 이렇게 사용하려고 S3를 구성한 것은 아니니 코드(Java)로 제어하는 방법을 알아보도록 하겠습니다. Java 이외에 python, node.js, kotlin, .net 등의 언어로도 지원 가능합니다.



코드로 S3 다루기 feat Java

 

 먼저, S3를 다루는 몇가지 방식이 있습니다. 


1) IAM 계정 추가 방식

- 계정에는 access_key와 secret_key가 부여됩니다.

- s3 full access라는 정책을 계정에 부여합니다.

- s3 client에 access_key, secret_key를 부여한 credential 정보를 부여하고 bucket에 접근하여 업로드, 변경, 다운로드를 수행합니다.

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(region)
.build();


2) EC2에 역할 부여

- EC2에 S3에 대한 full access 정책을 할당합니다.

- s3 client를 할당하여 api를 통해 업로드, 변경, 다운로드를 수행합니다.

AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
엑세스 권한이 부여된 1) key 접근 방식은 보안적인 측면에서 여러 문제가 발생할 소지가 있기 때문에, AWS에서는 2번째 방법으로 S3의 파일 데이터를 다루는 것은 추천하고 있습니다!!

간단히 API를 보겠습니다.

- bucket_name : 버킷 이름 (유니크한 이름)
- key_name : 저장될 파일 이름 (해당 경로에 위치될 이름입니다)
- file : 파일

* upload 

try {
s3.putObject(bucket_name, key_name, new File(file_path));
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}

* download

try {
S3Object o = s3.getObject(bucket_name, key_name);
S3ObjectInputStream s3is = o.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File(key_name));
byte[] read_buf = new byte[1024];
int read_len = 0;
while ((read_len = s3is.read(read_buf)) > 0) {
fos.write(read_buf, 0, read_len);
}
s3is.close();
fos.close();
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
} catch (FileNotFoundException e) {
System.err.println(e.getMessage());
} catch (IOException e) {
System.err.println(e.getMessage());
}

* move, copy

try {
s3.copyObject(from_bucket, object_key, to_bucket, object_key);
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}

* delete

try {
s3.deleteObject(bucket_name, object_key);
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}


* 정리
s3 Object API 다루기 (bucket도  API 코드로 다룰수 있지만 혹시 모르니 버킷은 대시보드 내에서 작업 하시는걸 추천드립니다)
1) aws 클라우드 내 작업
- s3에 대한 엑세스 권한 부여

2) Java code 내 작업
- credential 부여 (1번, 2번 방법에 따라 optional)
- amazones3 client 주입
- api 수행


출처


AWS는 문서화가 잘 되어 있기에 공식 문서를 많이 찾아 보는걸 추천드립니다!!


AWS 공식 개발 document

AWS s3 Object Java API

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


 이전 포스팅에서 ELB를 이용해 보았고, 그중에서도 application 로드밸런서를 구성하여 사용하는 방법을 알아 보았습니다.

AWS - ELB(Elastic Load Balancing) application loadbalancer 사용


이번 포스팅에선 network 로드밸런서 구성과 사용 방법을 알아보도록 하겠습니다.



ELB란?

 


  ELB는 Elastic Load Balancing의 줄임말입니다. 서버의 부하를 분산하여 주는 스위치 역할을 수행합니다.


"Elastic Load Balancing은 들어오는 애플리케이션 트래픽을 EC2 인스턴스, 컨테이너, IP 주소, Lambda 함수와 같은 여러 대상에 자동으로 분산시킵니다. ELB는 단일 영역 또는 여러 가용 영역에서 부하를 처리할 수 있습니다. ELB는 세가지 종류의 부하분산 장치를 제공하고 모두 고가용성, 자동 확장/축소, 강력한 보안 기능을 갖추고 있습니다."


  Elastic Load Balacing은 아래 3개의 로드밸런서를 제공합니다.


  * Application Load Balancer - L7 계층 (http/https) 프로토콜

  * Network Load Balancer - L4 계층 (TCP/UDP) 프로토콜

  * Classic Load Balancer - 전통적인 방식의 로드밸런서 (이제 지향하는 방식이 아님)







* network loadbalancer를 어떤 경우에 사용할까요??

- 소켓을 이용하여 tcp 통신을 할 경우

- 내부망과 외부망이 분리 되어 있고, tcp 서버가 내부에 있을 경우


저의 경우에는 전문통신을 위해 소켓을 이용하였는데 AWS VPC 내부(EC2) / 외부업체 통신이 이루어져야 하는 경우 였습니다.

내부(EC2) + RDS로 VPC가 구성되었기 때문에 http 프로토콜이 방식이 아니기에 소켓의 연결을 이루어져야 할 매개체가 필요하였고


network loadbalancer (VPC public) => EC2 (VPC private) 의 연결로 서버를 구성하여 문제를 해결하였습니다.




Network 로드밸런서 사용해보기

 


EC2 선택후 왼쪽메뉴에서 로드밸런스를 찾아 클릭하여 줍니다. 다음으로 Load Balancer 생성 버튼을 눌러줍니다.

 



Load Balancer 유형 선택 화면이 나옵니다. 유형은 3종류가 있습니다.


  * Application Load Balancer - L7 계층 (http/https) 프로토콜

  * Network Load Balancer - L4 계층 (TCP/UDP) 프로토콜

  * Classic Load Balancer - 전통적인 방식의 로드밸런서 (이제 지향하는 방식이 아님)


여기서 tcp 프로토콜을 이용하여 ELB를 생성할 것이므로 'Network 로드밸런서' 생성 버튼을 눌러 줍니다. 




먼저, 로드밸런서의 이름을 지정하여 줍니다.


다음으로, 체계의 경우 인터넷과 내부가 있습니다. 여기서는 인터넷 경계로 선택하여 줍니다. (내부의 경우 public ip가 존재하지 않습니다. vpc와 subnet 관련 내용인데 이번 포스팅에서는 넘어가도록 하겠습니다)


마지막으로 리슨할 port를 지정하여 줍니다. 일반적으로 80, 8080, 443 등을 사용합니다. 여기서는 9999을 이용하도록 하겠습니다.

만약, 대외기관이나 타업체와 연동을 할경우 EIP를 할당해주시면 됩니다. 

public ip의 경우 변동 가능성이 있기에 외부 연동이 들어가게 된다면 꼭 사용하여 주세요. (이외에도 route53에 묶어서 사용하는 방법도 있습니다)





다음으로 라우팅 구성을 하여 줍니다. 9999 포트와 대상유형으로 인스턴스를 설정하고 elb와 연결될 ec2를 대상으로 등록하여 만들어 줍니다.




대상그룹이 잘 만들어 졌는지 확인해 봅니다.





대상그룹이 잘 만들어 졌으니 'Register targets'을 눌러 elb와 ec2를 연결하여 줍니다.

등록후, 상태검사를 통과하면 'healthy' 통과하지 못하면 'unhealthy'가 Status로 나옵니다. 






참조


https://aws.amazon.com/ko/elasticloadbalancing/

https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html


블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


 이전 포스팅에서 EC2를 만들어 사용하는 법을 알아 보았습니다. 이번 포스팅에선 EC2를 2대 이상 사용시 트래픽을 부하 분산하여 운영하는 방법을 알아 보도록 하겠습니다.


AWS - EC2 생성/시작



ELB란?

 


  ELB는 Elastic Load Balancing의 줄임말입니다. 서버의 부하를 분산하여 주는 스위치 역할을 수행합니다.


"Elastic Load Balancing은 들어오는 애플리케이션 트래픽을 EC2 인스턴스, 컨테이너, IP 주소, Lambda 함수와 같은 여러 대상에 자동으로 분산시킵니다. ELB는 단일 영역 또는 여러 가용 영역에서 부하를 처리할 수 있습니다. ELB는 세가지 종류의 부하분산 장치를 제공하고 모두 고가용성, 자동 확장/축소, 강력한 보안 기능을 갖추고 있습니다."


  Elastic Load Balacing은 아래 3개의 로드밸런서를 제공합니다.


  * Application Load Balancer - L7 계층 (http/https) 프로토콜

  * Network Load Balancer - L4 계층 (TCP/UDP) 프로토콜

  * Classic Load Balancer - 전통적인 방식의 로드밸런서 (이제 지향하는 방식이 아님)





* 이번 포스팅에선 Application Load Balancer를 이용하여 서버의 트래픽을 부하분산 하도록 하겠습니다.



ELB 사용해보기

 


EC2 선택후 왼쪽메뉴에서 로드밸런스를 찾아 클릭하여 줍니다. 다음으로 Load Balancer 생성 버튼을 눌러줍니다.

 



Load Balancer 유형 선택 화면이 나옵니다. 유형은 3종류가 있습니다.


  * Application Load Balancer - L7 계층 (http/https) 프로토콜

  * Network Load Balancer - L4 계층 (TCP/UDP) 프로토콜

  * Classic Load Balancer - 전통적인 방식의 로드밸런서 (이제 지향하는 방식이 아님)


여기서는 http 프로토콜을 이용하여 ELB를 생성할 것이므로 'Applicaion 로드밸런서' 생성 버튼을 눌러 줍니다. (추후, TCP 방식을 이용한 Network 로드밸런서 사용 방법도 포스팅 하도록 하겠습니다.)



먼저, 로드밸런서의 이름을 지정하여 줍니다.


다음으로, 체계의 경우 인터넷과 내부가 있습니다. 여기서는 인터넷 경계로 선택하여 줍니다. (내부의 경우 public ip가 존재하지 않습니다. vpc와 subnet 관련 내용인데 이번 포스팅에서는 넘어가도록 하겠습니다)


마지막으로 리슨할 port를 지정하여 줍니다. 일반적으로 80, 8080, 443 등을 사용합니다. 여기서는 80을 이용하도록 하겠습니다.




마지막으로 타겟그룹(대상)을 지정하여 줍니다. 

대상 유형은 인스턴스(EC2)를 지정하여 주고, 프로토콜은 위에서 생성한 리스너(80)을 지정하여 줍니다.


ELB는 대상그룹을 바라보고, 대상그룹에서 n개의 서버를 등록할 수 있습니다. 대상그룹에 등록된 n개의 서버에 트래픽을 분산시켜 주는데,

상태검사를 통해 정상적으로 운영중인 서버에 트래픽을 분산시켜 줍니다. 따라서 아래와 같이 상태검사를 할 url을 등록 시켜 줍니다.


Java Spring을 예로 들면, 

@RestController > @GetMapping("/health/check") 를 통해 status code 200을 return 하여 주면 됩니다.


(url은 예시이므로 프로젝트에 맞춰 등록시켜주면 됩니다)



대상그룹이 잘 만들어 졌는지 확인해 봅니다.




대상그룹이 잘 만들어 졌으니 'Register targets'을 눌러 트래픽을 분산시켜줄 서버들을 등록하여 줍니다.


등록후, 상태검사를 통과하면 'healthy' 통과하지 못하면 'unhealthy'가 Status로 나옵니다. 트래픽은 'healthy' 상태에 서버로 분산됩니다.





참조


https://aws.amazon.com/ko/elasticloadbalancing/

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-backend-instances.html

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


  AWS는 클릭 몇번으로 쉽게 인프라 설정을 할 수 있습니다. 이번 포스팅에선 Route 53, Elastic Load Balancer를 이용하여 http -> https 리다이렉트 설정 방법을 알아보도록 하겠습니다.




Route 53

 

 먼저 Domain 구입이 이루어져 합니다. 이번 DNS 구입이 완료 되었다는 가정하에 진행하도록 하겠습니다.

 ex) yhmane.com [DNS 구입 완료 및 등록)


 DNS 구입이 완료 되었다면, sub 도메인을 등록하고 ELB에 연결 하도록 하겠습니다.



  위와 같이 DNS 등록후, 서브도메인을 등록하여 줍니다. ex) web.yhmane.com , 등록후 생성한 elb를 routing 대상으로 등록하여 줍니다. ELB는 L4스위치 역할을 수행하여 줍니다. 즉, 해당 도메인으로 들어온 연결을 적절히 분산하여 포워딩 시켜줍니다.



ELB


웹을 연결하여 때는 일반적으로 생략이 가능한 80, 443 포트를 연결하여 줍니다. 가능하기 때문에 역할을 수행하여 줍니다. 즉, 해당 도메인으로 들어온 연결을 적절히 분산하여 포워딩 시켜줍니다. 아래와 같이 80, 443 포트의 연결을 추가하여 주었습니다.


 


하지만, http 프로토콜은 안전하지 않기 때문에 보안의 문제가 있습니다. 따라서 위에서 설정한 web.yhmane.com:80 연결을 web.yhmane.com:443 포트로 이동시켜 주어야 합니다. 


즉, http://web.yhmane.com -> https://web.yhmane.com으로 데이터 이동을 ssl로 감싸 주어야 합니다. AWS에서는 이 redirection을 아래와 같이 쉽게 설정할 수 있습니다. 80 리스너의 규칙 보기/편집을 클릭하여 줍니다.


위와 같이 80 리스너의 요청이 들어왔을 경우 redirection 대상을 지정하여 줄 수 있습니다. 다음과 같이 설정후 저장을 눌러 주시면 80 -> 443 redirection을 쉽게 설정할 수 있습니다.


블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


 이전 포스팅에선 EC2 인스턴스를 프리티어로 생성하였고  SSH를 이용하여 터미널에 접속해 보았습니다. 이번 포스팅에선 EC2의 저장소(Storage) EBS, Snapshot, AMI에 대하여 알아보도록 하겠습니다.




가상 스토리지

 

  

 EBSElastic Block Storage의 약자로 EC2 인스턴스에 장착하여 사용할 수 있는 가상 저장 장치입니다. EBS는 EC2 기본 인스턴스에 제공하는 기본 용량보다 추가적으로 더 사용할 때, 운영체제를 중단시키지 않고 용량을 자유롭게 조절하고 싶을때 등에 사용 됩니다.


* EBS 기본 용어


- Volume : EBS의 가장 기본적인 형태로, OS에서 바로 가능한 형태

- Image : AMI (Amazone Machine Image) 의 약자이며 OS가 설치된 형태입니다. AMI로 부터 인스턴스를 생성합니다.

- Snapshot : EBS의 특정 시점을 그대로 복사하여 저장한 파일을 뜻합니다. 스냅샷으로 부터 EBS, AMI를 생성할 수 있습니다.




EBS

 


  EBSHDD/SSD라고 생각하시면 됩니다. 가상 디스크로, 일반적으로 8에서 100기가 정도 사이의 용량을 할당하여 줍니다. 다만, EBS의 경우 일차적인 저장소로 사용 되기에 용량을 낮게 잡는게 일반적이고, 백업이나 파일디스크의 역할은 S3에게 위임합니다.

 EC2 생성시 기본적으로 OS가 설치된 EBS 볼륨이 함께 생성됩니다, 프리티어의 경우 30GB까지 무료로 제공 되니, 30GB로 할당하여 사용하면 됩니다. 가상 디스크 (HDD/SSD) 이다보니, 디스크를 필요에 의해 마운트/언마운트 하여 사용할 수 있습니다.



Snapshot & Image

 


  스냅샷은 EBS의 특정 시점을 복사하여 저장한 파일입니다. 다음과 같은 용도로 사용합니다.


* 스냅샷으로 EBS 볼륨 추가 생성

* 스냅샷으로 AMI 샹성

* 스냅샷을 다른 리전으로 복사


보통 서버를 EC2로 서버를 구성하게 되면, 최소 2대 이상의 서버를 구성하게 됩니다. 

먼저, EC2를 구성후 새로운 서버를 구축해야 할 경우, Snapshot 생성 -> AMI 생성 -> EC2 추가 생성의 단계로 서버를 구성하게 됩니다.

또한, 한국 이외에 서버를 구성할 경우, 새로운 리전에 추가로 EC2를 구성해 주어야 하는데 Snapshot를 생성하여 리전복사를 해줄때 사용하게 됩니다!!



* Snapshot 생성



EC2 > Volume > Snapshot 생성 

태그의 경우 Name과 ClientName도 마찬가지로 지정 해주시면 됩니다.



* AMI 생성



EC2 > Snapshot > 이미지 생성 

태그의 경우 Name과 ClientName도 마찬가지로 지정 해주시면 됩니다.


주의할 점은 AMI 생성시 Snapshot을 기준으로 생성 해주어야 합니다. EC2에서 바로 AMI를 생성할 수도 있지만, EC2에서 이미지를 바로 생성시 서버가 중지 되기 때문에 꼭 Snapshot을 기준으로 이미지를 생성해야 합니다!




출처

 


https://aws.amazon.com/ko/ebs/?ebs-whats-new.sort-by=item.additionalFields.postDateTime&ebs-whats-new.sort-order=desc

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


  이번 포스팅에선 AWS 가성서버인 EC2에 대하여 알아보고, 인스턴스 생성, 접속, 관리 등 기본적인 운영에 대하여 알아보도록 하겠습니다.




EC2란?

 


  EC2란 Amazone Elastic Compute Cloud의 약자로 아마존에서 제공하는 인터넷에 연결된 가상 서버를 의미합니다. 또한, AWS 제품군 중에서 가장 널리 쓰이는 인프라이며 기본이 되는 인스턴스로 EC2만의 장점과 특성이 있습니다. 


 EC2는 가상 서버이기 때문에 클릭 몇번으로 쉽게 서버를 구축할 수 있다는 장점이 있습니다. 또한, 사용한 만큼만 요금을 지불하면 되므로 비용 절감의 효과도 누릴 수 있습니다. EC2 인스턴스튼 우리가 일반적으로 보는 PC나 서버와 똑같은 형태이며 Linux나 Windows가 설치 되어 있습니다. 하지만, 가상 서버이기 때문에 모니터에 직접 연결할 수는 없고 터미널이나 원격 데스크탑 연결로 접속을 해야 합니다.


* EC2 기본 개념


- 시작 : EC2 인스턴스를 시작합니다. 운영체제가 부팅되고 사용할 수 있습니다. 시작하는 순간부터 요금이 과금되며 1시간 단위로 요금으로 책정됩니다.

- 정지 : EC2 인스턴스를 정지합니다. 운영체제를 종료해 시스템이 종료된 상태이며 요금이 과금되지 않습니다.

- 삭제 : EC2 인스턴스를 삭제합니다. 삭제가 된 후 시간이 지나면 EC2 목록에서 사라집니다.

- 재부팅 : EC2 인스턴스를 재시작합니다.




EC2 인스턴스 생성하기

 


 다음으로 아마존 가성 서버를 생성 해보도록 하겠습니다. 순서는 아래와 같이 진행하며, 프리티어 (무료 요금제) 기준으로 설명 하도록 하겠습니다.


- 리전선택

- 유형선택

- 보안그룹 적용

- 키생성

- EC2 접속해보기

- EIP 할당


* 리전 선택




먼저, 상단의 리전(지역)을 선택 해주어야 합니다. 간혹, 미국 버지니아가 선택된 경우가 있는데 서울을 선택하여 주세요!! 거리에 따라 속도가 다르니 한국에서 운영/테스트 한다면 한국 리전을 선택해주시면 됩니다. 서울이 선택되었다면 인스턴스 시작 버튼을 눌러주세요!



* Image 선택



인스턴스에 사용될 이미지를 선택합니다. 리눅스, 윈도우 등의 운영체제를 제공합니다. 여기서는 Amazone Linux를 선택합니다. (아마존 리눅스는 CentOS 계열입니다)


* 유형 선택




다음으로, 인스턴스 유형을 선택해야 합니다. 인스턴스는 가상 서버의 cpu수, 메모리에 따라 요금이 다릅니다. 이 부분은 우선 프리티어(무료)를 선택하도록 하겠습니다. (접속자 수, 네트워크 유입량  등에 따라, 유형을 선택하면 됩니다)



* 인스턴스 구성




서브넷과 가용 영역을 선택하는 부분입니다. 이 부분은 VPC를 알아야 값을 선택할 수 있습니다. 여기서는 기본 선택값 그대로 유지하도록 하겠습니다.



* 스토리지 추가



EC2의 용량을 선택할 수 있습니다. 일반적으로 EC2의 용량을 낮게 잡고, 파일 서버를 S3를 추가하여 사용합니다. 프리티어의 경우 30GB 까지 무료로 제공하니 30GB를 선택하여 주세요



* 태그 추가



 AWS에서는 여러 태그가 있습니다. 태그는 키/VALUE의 쌍으로 구성됩니다. 여기서는 Name과 ClientName 두개만 사용하도록 하겠습니다. Name은 인스턴스의 이름을 주는 것이고, ClientName으로 요금 청구시 항목을 구별해주는 값입니다.



* 보안 그룹 구성



 AWS에서는 보안 그룹이라는 서비스를 제공합니다. in/out bound의 port를 관리하는 것입니다. 여기에서는 22, 80, 443의 포트만 허용하도록 하겠습니다. 또한, 보안상의 문제로 22(ssh) 터미널 접속 포트만 내 IP/회사 IP만 추가 해주시기 바랍니다.



* 키 생성 & 인스턴스 시작


 AWS에서는 EC2에 접속하기 위해서는 키(pem) 파일이 필요합니다. '새 키페어 생성'을 하여 주시고, 키파일을 안전하게 보관하여 주시기 바랍니다. 외부로 유출될 경우 서버가 악용될 소지가 있으니, 키파일은 private한 저장소에 보관하는게 제일 좋습니다.


이제 인스턴스 시작 버튼을 누룬후 2~3분이 지나면 새로운 인스턴스가 생성됩니다!!



* SSH 접속



 

 인스턴스가 생성 되었다면 목록에서 '실행중' 이라는 것을 볼 수 있습니다. 마우스 오른쪽을 클릭하여 '연결' 버튼을 눌러주세요!




* SSH 접속



맥 기준으로, 이전에 생성한 키파일(pem)파일의 권한을 수정하여 줍니다. chmod 400 '키파일'

다음으로 터미널을 이용하여 가상 서버에 접속하여 줍니다. ssh -i '키파일' ec2-user@ip


ip의 경우 ec2-172-12-33-6 이런식으로 시작하는 숫자를 똑같이 입력하여 주면 됩니다!! 

다만 22번 포트의 접속 권한을 내 IP로 지정하였기 때문에, 해당 IP 대역에서만 터미널에 접속할 수 있습니다.



* EIP 설정



위에서 터미널 접속시 꽤 긴 ip를 이용하여 가상 서버에 접근하였습니다. 이러한 문제를 공인 IP를 할당하여 해결할 수 있습니다.

왼쪽 목록에서 탄력적IP를 눌러주세요. 다음으로 탄력적 IP 주소 할당 -> 탄력적 IP 주소 연결을 하게 되면

 ssh -i '키파일' ec2-user@EIP를 이용하여 쉽게 가상 서버에 접근할 수 있습니다. 다만, EIP를 할당 받은 후에 인스턴스에 매칭하여 주지 않으면 과금되니 주의하시기 바랍니다.


EIP 해제 방법

: EIP 주소 연결 해제 -> EIP 주소 릴리즈




출처


[aws] https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html


다음 포스팅에선 AWS의 파일 서버인 S3에 대해서 포스팅 하도록 하겠습니다!

블로그 이미지

사용자 yhmane

댓글을 달아 주세요


들어가며


  이번 포스팅에선 AWS RDS를 이용하여 mysql 인스턴스를 생성하고, 타임존이나 한글 설정하는 방법을 알아보도록 하겠습니다.



RDS란?

 


  RDS는 Relational Database Service의 약자입니다. 관계형 데이터베이스 서비스라는 말인데, aws aurora, mysql, mariadb, oracle, posgresql, mysql-server 엔진을 제공합니다. [aurora/mysql/mariadb] / [oracle] / [postgresql] / [mysql-server] 이런식으로 그룹 제품군을 나누면 됩니다. 


 RDS를 이용하면 여러 이점들이 존재하는데 간편한 관리와 확장/백업의 용이성 등이 있습니다. 가격에 있어서는 비싸다고 생각하지만, aurora의 경우 성능대비 싸다고 생각합니다. 특히 클릭 몇번으로 DB를 간편히 생성할 수 있어서 관리가 용이하다는 장점이 있습니다.



mysql DB 인스턴스 생성


 

 먼저, mysql DB 인스턴스를 생성하는 방법은 두가지가 존재합니다.

  • 1) EC2 인스턴스에 직접 mysql 설치 & 운영

  • 2) RDS를 이용한 DB 인스턴스 생성

 첫번째 방법의 경우에는 직접 수동으로 설치하고 관리하여 백업을 해야하는데, 관리 포인트가 많아지고 성능이나 가격적인 부분에서 좋은 선택지는 아닙니다. 솔루션 패키지를 이용하여 db와 어플리케이션을 한 서버에 설치하는 것 이외에는 추천하지 않습니다.

 두번째 방법~!! 이번 포스팅에선 두번째 방법에 대하여 알아보도록 하겠습니다. RDS 설정 순서는 아래와 같습니다. 설정은 프리티어를 기준으로 하겠습니다.

  • Region 선택

  • DB 엔진 & 세부 버전 선택

  • DB 인스턴스 크기 선택

  • DB 식별자 설정 & 마스터 사용자 이름/암호 설정

  • 스토리지 선택

  • 다중 AZ 배포 선택

  • 연결설정 (VPC, 서브넷, 퍼블릭 엑세스, 포트)

  • 파라미터그룹 선택

  • 백업/모니터링/삭제방지 등 설정



1) Region 선택



Region은 아시아태평양-서울 ap-northeast-2로 이동해주시고, 데이터베이스 생성을 눌러줍니다.

(몇년 전까지만 해도 서울이 없어서 도쿄를 선택을 하였습니다. 그만큼 AWS에서 한국시장을 중요한 곳이라 생각하는 것이겠죠 ^^)



2) DB 엔진선택 & 세부버전 선택



AWS에서는 6개의 DB 엔진을 제공합니다. 위에서도 언급했듯이 Aurora, Mysql, MariaDB를 같은 제품군이라 생각하시면 됩니다. 

여기서는 프리티어를 위해 Mysql 엔진을 선택하여 줍니다.

(Aurora의 경우에는 성능이 매우 뛰어납니다!! 다만 상대적으로 가격이 비싸다는 점이 있습니다.)


버전의 경우 최신껄로 깔아주도록 합니다. 버전마다 조금씩의 차이는 있지만, 지금은 RDS 설정을 위한 시간이므로 default 버전을 선택하겠습니다.



3) DB 인스턴스 크기 선택



DB 인스턴스 크기는네트워크 트래픽과 접속자수를 고려하여 선택하여 줍니다. 클래스별로 시간당 측정 요금이 상이하고 상용으로 갈 수록 cpu-core와 memory가 증가하는 것으로 보시면 됩니다. 여기서는 프리티어를 이용할 것이기 때문에 t2.micro를 선택하여 줍니다. 



4) DB 식별자 설정 & 마스터 사용자 이름/암호 설정



DB 인스턴스 이름을 설정하고, 마스터 계정의 이름과 암호를 설정해줍니다.



5) 스토리지 선택



기본적으로 SSD/20 으로 설정되어 있습니다. 프리티어의 해당하는 설정이니 기본선택값으로 유지하여 줍니다.




6) 다중 AZ 배포 선택 (선택 X)



Region내에는 최소 2개 이상의 가용영역AZ(Availability Zone)이 분포하고 있습니다. 프리티어의 경우 다중 AZ를 지원하지 않지만, 장애 복구를 위해 Region내 AZ에 분포시켜 놓는다고 생각하시면 됩니다.




7) 연결설정 (VPC, 서브넷, 퍼블릭 엑세스, 포트)




VPC, 서브넷, 가용용역은 기본 설정으로 두시면 됩니다. 나중에 보안을 위해 설정이 필요하겠지만, 이번 포스팅에선 생략하도록 하겠습니다. 포트의 경우 mysql 그룹의 경우 3306을 기본으로 사용합니다. 다른 포트를 원하실 경우에만 수정하시면 됩니다.

퍼블릭 엑세스의 경우 '예'를 선택해야 tool을 이용해 접속할 수 있습니다.


권한, 계정 설정의 경우 예시

grant all privileges on 스키마.테이블 to '계정'@'localhost' identified by '비밀번호';

grant all privileges on 스키마.테이블 to '계정'@'%' identified by '비밀번호';


[참고] https://yhmane.tistory.com/73?category=783933




8) 파라미터 설정



스키마를 설정하고 파라미터그룹을 설정하여 줍니다. 일단 default 값으로 설정하겠습니다. aws RDS에서 mysql을 설정하게 되면 timezone과 character-set을 다시 설정해줘야 합니다. 이 부분은 DB를 생성후 다시 설정하도록 하겠습니다. 백업이나 로그 부분은 상용단계가 아닌이상 필요 없으니 모두 꺼주셔도 됩니다. 


이제 DB 생성을 누르면 10분 정도 소요후 인스턴스가 생성됩니다.



파라미터 설정


왼쪽 좌측의 파라미터 그룹이 있습니다. 선택하여 각 요소를 설정해주시면 됩니다.


log_output= TABLE 

log_slave_updates = 1 

relay_log_info_repository = TABLE 

relay_log_recovery = 1

slow_query_log  = 1

character_set_server    utf8mb4

character_set_database    utf8

init_connect    SET SESSION time_zone = 'Asia/Seoul';

innodb_lock_wait_timeout    60

interactive_timeout    1800

lock_wait_timeout    60

long_query_time    780

time_zone    Asia/Seoul

explicit_defaults_for_timestamp    1

group_concat_max_len    10240

max_allowed_packet    10247680

max_binlog_size    134217728    

max_connections    {DBInstanceClassMemory/12582880}    

collation_server utf8mb4_general_ci


확인 방법은 아래와 같습니다. 

다만, 확인하기 전에 DB에 적용을 해야 하기 때문에 생성된 DB 인스턴스를 재실행 해주시기 바랍니다!!


use 스키마;


show variables like 'c%'; # 캐릭터셋 확인


select now() # 시간 확인



출처


[aws] https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html


aws 문서는 깔끔하게 잘 정리 되어 있어서, 보고 쉽게 따라할 수 있는거 같습니다

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

아마존은 클라우드의 개념이다 보니 서버를 따로 설정하지 않으면 모두에게 오픈 되어 있습니다.


따라서, 승인 되지 않은 사람의 접속을 제한 해야 하는데

간단하게 나마, aws 서버를 보호 하는 방법을 알려 드리겠습니다.

1) 계정 로그인의 경우 mfa 코드를 설정



30초마다 바뀌는 6자리 인증 코드를 로그인시 제출


2차 비밀번호(mfa) 설정

https://yhmane.tistory.com/7?category=773048

2) pem.key의 경우 git에 등록하지 않기 


가장 많이 저지르는 실수가, github에 key를 올리는 것입니다.


키의 경우 ssh로 접근하기 위해 필요한 열쇠입니다.

키는 따로 보관을 해야 하고, public하게 공개하면 안 됩니다.

3) ssh의 접속 ip 설정

ssh를 통해 서버에 접근할 수 있습니다.

위치 무관으로 할 경우, 0.0.0.0/0 으로 설정되어

어느 ip에서나 접근 가능하므로 지양해야 합니다.


따라서, 자신이 자주 가는 곳의 ip(집, 회사 등등)로 접속 권한을 설정 해야 합니다.





블로그 이미지

사용자 yhmane

댓글을 달아 주세요

배포하기

이번에는 드디어 spring_sample 프로젝트를

세팅 해놓은 아마존 서버에 배포해보도록 하겠습니다.

먼저, git을 설치한 후 간단한 sample을 clone 해보도록 하겠습니다.


1
2
mkdir github_project
git clone https://github.com/yhmane/sample_springPJ.git
cs

이제, 서버에 clone을 받아 줍니다.

다음으로, war 파일을 만들기 이전에 CREATE_TABLE.sql의 내용을 복사하여 workbench에서 실행하여 줍니다.

spring이라는 스키마를 사용했기 때문에 

CREATE DATABASE spring;

use spring;

CREATE_TABLE.sql 문을 차례로 실행시켜 줍니다.



다음으로, 해당 위치로 이동하여 local에 맞춰져 있는 db 세팅을 자신의 서버 세팅으로 바꾸어 줍니다.

여기서 spring은 데이터베이스 스키마

root는 계정

비밀번호는 자신의 db 비밀번호를 차례대로 입력하여 줍니다.

다음으로, 메이븐으로 war 파일을 만들어 줍니다.

target에 war 파일이 생성 되기 때문에 pwd의 위치를 잘 확인하시고

1
2
mvn clean
mvn package
cs

위의 명령어를 차례로 입력하여 줍니다. (또는, mvn clean package)
배포를 수동으로 하였기 때문에, 꼭 서버에서 진행하지 않아도 됩니다.

start-1.0.0 Build로 생성된 war 파일 이름을 spring_sample.war로 변경하여 줍니다.

다음으로 /usr/share/tomcat8/conf/server.xml의 context를 바꾸어 줍니다.

sudo vim server.xml

1
<Context docBase="spring_sample" path="/" reloadable="true" source="org.eclipse.jst.jee.server:spring_sample"/>
cs


다음으로 /usr/share/tomcat8/webapps에 생성 하였던 spring_sample.war root 권한으로 옮겨 줍니다.

다음으로 sudo service tomcat8 start

curl http://localhost:8080로 서버가 정상적으로 동작하는지 확인하여 줍니다.

끝났다면, ip:8080으로 접속하여 줍니다!!


이제 배포가 끝났습니다. 지금까지 깡통 linux에 java와 was를 설치하여 배포까지 해보았습니다.

간략하게 나마 linux를 세팅하고 application을 배포해 보았는데요,

일반적으론 웹서버(apache, nginx)와 was를 같이 사용합니다!!

여기에 추가적인 세팅 (https, load 밸런서 등) 을 붙여 사용하는데 

저의 포스팅이 조금이나마 서버 기본세팅을 이해하는데 도움이 되셨으면 좋겠습니다!!






블로그 이미지

사용자 yhmane

댓글을 달아 주세요

  • 윤동현 2019.09.21 21:46  댓글주소  수정/삭제  댓글쓰기

    포스팅 잘봤습니다. 도움 많이 되었습니다. 감사합니다.
    저 근데 질문드려도 될까요? 저도 스프링 프로젝트 aws에 올리고 오라클을 설치했는데요. root-context.xml을 어떻게 설정하셨나요? 전 다음처럼 하니까 에러가 자꾸 나서요....
    에러메시지: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- 드라이버 클래스 이름이 변경됨 -->
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
    <!-- 연결문자열에 log4jdbc가 추가됨 -->
    <property name="url"
    value="ip주소:1521:orcl" />
    <property name="username" value="아이디" />
    <property name="password" value="비번" />
    </bean>

    • 사용자 yhmane 2019.09.29 00:16 신고  댓글주소  수정/삭제

      제가 최근에 바빠서 지금 확인했네요...
      에러 로그를 보니 서버 구동시 DB 커넥션이 맺어지지 않아서 생기는 오류로 보이네요.

      찾으시는 내용이
      https://idlecomputer.tistory.com/153
      여기에 정리되어 있어 보이는데 한번 적용해보세요!

  • 덴버 2020.10.13 23:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. spring 프로젝트 배포하는데 정말 많은 도움을 받고 있습니다.

    다름이 아니라 아래
    "/usr/share/tomcat8/webapps에 생성 하였던 spring_sample.war root 권한으로 옮겨 줍니다."
    이 부분은 리눅스 명령어로 어떻게 처리해야 할지 궁금해서 댓글 남깁니다.

    • 사용자 yhmane 2020.10.14 08:45 신고  댓글주소  수정/삭제

      리눅스에서는 1024번 이하 포트에 대하여 root의 권한을 가진 프로세스만이 포트를 선점할 수 있습니다. 따라서 해당 예제는 8080 포트를 사용하기 때문에 소유권에 대하여 변경을 하지 않아도 될거 같네요 .. (완전 주니어때 작성한 글이라 양해 부탁드려요 ,,ㅎㅎ)

      만약 소유권 변경을 원하신다면, 다음 설명을 참고해주세요.
      리눅스에는 파일 소유권이라는 것이 있는데, chown으로 소유권을 변경할 수 있습니다.

      우선, 커맨드에 ll or ls -l을 검색해 보시면 drwxrwxrwx 2 ec2-user ec2-user 이런식으로 파일 옆에 써있는 것이 있을거에요.
      앞에 ec2-user는 소유계정, 뒤는 그룹계정을 의미합니다.

      chown root:root 파일 로 커맨드를 입력하시면 root의 소유권으로 변경하실 수 있습니다.

    • 덴버 2020.10.14 13:22  댓글주소  수정/삭제

      오.. 그렇군요.. 답변 정말 감사합니다.

      그럼 모든 리툭스 커맨드를 root 권한으로 해도 문제는 없는 건가요?

      그리고 현재 Tomcat 9 으로 위의 과정을 따라하고 있는데요. 작성자분께서는 Tomcat 실행을 'sudo service tomcat8 start'로 하셨는데 전 도통 찾아봐도 ./startup.sh 로만 실행하는 방법 밖에 없네요.

      Tomcat 9에서war 파일을 webapps 디렉토리에 옮기고 실행하는 방법이 있는지 어쭙고 싶습니다.

      너무 물어보는게 많아 죄송하네요.. 초보는 웁니다..ㅜㅜ

    • 사용자 yhmane 2020.10.14 13:54 신고  댓글주소  수정/삭제

      그럼 모든 리툭스 커맨드를 root 권한으로 해도 문제는 없는 건가요?
      => 문제는 없습니다. 다만 정책을 어떻게 정하냐에 차이겠죵ㅎㅎ?

      그리고 현재 Tomcat 9 으로 위의 과정을 따라하고 있는데요. 작성자분께서는 Tomcat 실행을 'sudo service tomcat8 start'로 하셨는데 전 도통 찾아봐도 ./startup.sh 로만 실행하는 방법 밖에 없네요.
      => bin 디렉토리에서 sh startup.sh로 시작하셔도 무방합니다. systemctl, service에 대하여 검색 해보시는게 좋을거 같아요~!

      Tomcat 9에서war 파일을 webapps 디렉토리에 옮기고 실행하는 방법이 있는지 어쭙고 싶습니다.
      => 이 질문은 무얼 여쭙고자 하는지 이해가 안되네요? Tomcat9는 써보질 않았지만 똑같이 wepapps 디렉토리에 war 파일을 옮겨서 실행하면 문제 없어 보입니다~

      * 음 추가적으로 아래와 같이 CentOS 계열에서 특정 톰캣을 받아서 실행시킬수도 있어요.
      sudo yum install wget
      wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz

      직접 봐드릴 순 없으니 , 짧게나마 도움이 되었으면 하네요 ^^

    • 덴버 2020.10.14 14:20  댓글주소  수정/삭제

      답변 감사드려요.

      어찌저찌해서 서버 실행은 방금 완료 했네요...

      systemctl, service 방식에 대한 실행 방법은 알아보면 좋을거 같네요. 좋은 팁 감사합니다~