DevOps

[AWS]EMR 접속해서 실습환경 구축하기

Hazel_song 2022. 5. 27. 16:40
728x90

[AWS]EMR 시리즈

1. EMR 세팅하기(링크)
2. EMR 접속하기(현재글)

EMR에 접속해서 작업하기

일반적으로 EMR도 하나의 서버이기 때문에 private subnet내에서 구성될 것이고 따라서 외부에서 직접적인 접속이 불가능하다.

이를 위해서는 내부망이나 VPN이 깔려야 하는데, 현재는 (인프라,보안 팀에서) VPN이나 사무실 네트워크 관련해서 추가 작업을 진행 중이라서, 별도의 방법으로 접속해서 작업을 하고 있다. 

 

trouble shooting EMR 생성 시, ec2spot role 관련 에러

링크에 따라서 role 만들어주고 iam policy에서 필요한 policy 생성해줌

aws cli로 role 만들어준 다음에 해당 role을 복붙해서 emr role안에 그대로 add permission해서 만들어주었다.

serviced link role은 attach가 불가능하기 때문에 별도로 만들어서 attatch하는 것이 아니라, 별도로 만들어진 role과 동일한 역할을 복붙해서 role 내에 create policy 해주어야 한다.

이렇게 하고 나니까 public/ private emr이 문제없이 만들어졌다.

 

 

check 만들때 개발 테스트용이라서 마스터 노드까지 다 spot으로 만들었다.

 

public subnet으로 test emr 만들어서 기능 테스트 해보기 

-> 우선 내부적인 기능 파악 및 인프라보다는 데이터 가공 등에 대해서 테스트를 해보기 위해서 public subnet에도 test emr cluster를 구축했다.

 

1. ssh 쉘 접속하기

trouble shooting master node에 접속이 안된다.

port 22: Operation timed out

-> 링크에 따라서 emr master node의 보안 그룹 inbound rule에 원하는 IP(다 열어줘도되지만, 내 사무실 IP만 열어둠)

그리고 다시 접속하니까 ssh로 들어가짐

type : ssh / protocol : TCP / port: 22 / source : 내 ip주소(0.0.0.0/0을 주로 하긴 하지만, 그래도 혹시 모르니까 모든 ssh에 대해 열어두진 않았다.)

 

2. ssh 접속해서 텍스트 기반 브라우저로 ssh 클라이언트의 웹 사이트 보기

emr console로 master node에 작업하는 것에 대해서 웹 UI를 제공하는데 웹 인터페이스에 대한 인바운드 엑세스를 허용해야한다.

그리고 텍스트 기반 웹 브라우저는 lynx URL을 활용햇다. 해당 링크 참고해서 작업

lynx  "master node에서 제공하는 하둡 프레임 워크의 웹 URL"

 

3. 동적 포트 포워딩으로 웹 인터페이스 접속하기

브라우저를 통해 emr에 설치된 프레임 워크들의 웹인터페이스에 접속하기 위한 방법이다.

hue나 jupyterhub, zepplin을 사용해서 좀 더 간편하게 데이터 가공 작업을 하기 위해서는 해당 방법이 가장 효율적이다.

물론 배치작업을 위한 가공 보다는 일시적인 on-demand 가공 작업을 위해서 사용할 예정이고, 특히나 엔지니어 입자에서 데이터 가공 테스트를 위한 작업 환경으로 활용할 예정이다. aws에서 제공하는 문서를 보고 그대로 따라했다! 링크 참고

 

해당 방법은 동적 포트 전달을 통해 내부망에 접속하는 것이다.

SSH 클라이언트를 사용하여 마스터 노드에 연결하고, 동적 포트 전달로 SSH 터널링을 구성하고, Firefox용 FoxyProxy 또는 Chrome용 SwitchyOmega와 같은 추가 기능을 사용하여 관리하도록 인터넷 브라우저를 구성합니다.

SOCKS 프록시 설정하는 방법을 사용하면 텍스트 패턴을 기반으로 URL을 자동으로 필터링하고 프록시 설정을 마스터 노드의 DNS 이름 형식과 일치하는 도메인으로 제한할 수 있습니다.

즉 emr의 master node 서버슬 프록시 서버로 활용하여, 가상의 port를 열어서 포트 포워딩을 하여, 클라이언트 브라우저에서 바로 emr cluster내의 서버에 접속할 수 있게 하는 방식이다.

 

프록시가 뭐길래?

두 서버 간의(주로 client, server) 통신을 위해 대리 응답을 해주는 대체 통신용 서버이다.

 

https://brownbears.tistory.com/191

 

프록시란?

프록시란? 프록시(Proxy)란 '대리'라는 의미로,네트워크 기술에서는 프로토콜에 있어서 대리 응답 등에서 친숙한 개념입니다. 보안 분야에서는 주로 보안상의 이유로 직접 통신할 수 없는 두 점

brownbears.tistory.com

 

 

포트 포워딩 즉 동적 포트 전달이란?

여러 port로 통신하게 되는 것을, 하나의 port를 거쳐서 통신되도록 중간 다리 하나를 열어주는 것.

 

https://ooeunz.tistory.com/104

 

[Network] Port와 포트 포워딩(Port-Forwarding)이란?

Port란 예를 들어 하나의 서버가 있을 때 이 서버는 다양한 역학을 하게 되는 경우가 있습니다. 웹사이트를 전달해주는 역할, 그리고 파일을 요청하는 역할이 있다고 해보겠습니다. 이럴 경우 클

ooeunz.tistory.com

 

 

trouble shooting 8157로 동적포트 전달 할랬는데 자꾸 사용중이래서  링크 참고해서 확인하고 죽임.

 

trouble shooting 위의 과정 다 거치고 나서, jupyter hub 관련해서는 아래 화면이 뜨면서 웹인터페이스 접속이 안됨.

해당 화면에 있는 상태에서 허공에 thisisunsafe를 입력하고 스페이스바를 누르면 들어가진다...뭐야 핵신기

 

trouble shooting jupyter hub 회원 가입 버튼이 없다. 

 

초기 접근 정보는 아래와 같다

The username is "jovyan" and the password is "jupyter"

 

 

private subnet으로 test emr 만들어서 기능 테스트 해보기 

우선 private subnet에 emr을 구축한 경우, 마스터노드에 접속하는 것부터가 조금 복잡하다.

pubilc IP와 DNS가 주어져서 바로 접속할 수 있는 public subnet과는 달리 외부에서 바로 접근이 불가능하기 때문이다.

(보안적으로 권장하는 환경이다.)

 

 

1. load balancer로 접근하기

* 로드밸런서란? 블로그에 정리한 글 참고

 

trouble shooting 자꾸 request time out 이 난다. 타겟 그룹에서 연결이 unhealthy가 나는 것

-> (emr master node의 ) security group을 수정해주고 아래를 참고해서 subnet 설정해 주니까 해결

 

가용 영역에서 서브넷 두 개를 선택합니다. 그 중 하나가 EMR 클러스터가 있는 서브넷(프라이빗 서브넷)인지 확인합니다.

ALB 구성시의 AZ와 subnet은 ALB가 위치한 곳이고, public이어야 외부와 연결되는 것이 아닌가? 

같은 AZ의 private subnet에 있는 emr master server와 통신 하는 것이니...

 

trouble shooting 이제는 health check failed가 났다.

여기서 우선 확인해야할 부분은 80번 포트 번호로 EC2 웹서버가 통신이 가능한 상황인지 확인을 해야합니다. Apache가 설치되어 있지 않다면 위와 같이「health checks failed」에러가 나오는 경우도 있기 때문에 EC2에서 Apache가 설치되어 있는지 확인 할 필요가 있습니다.

->해당 에러는 결국 해결하지 못했고, 이후에 로드밸런서로 서버에 접속을 해야하는 경우에 다시 시도해보기

 

2. bastion host(jump host) 사용

위의 도식과 같은 경로로 private subnet에 있는 ec2에 접속하는 것이다.

같은 VPC내에서 외부에서 접속 가능한 public subnet 속에 bastion host로 점프용 서버를 구성하고 이 서버에 접속해서 같은 VPC의 private subnet에 접속할 수 있다. 

 

실질적으로 bastion server안에 emr cluster의 pemkey를 등록해두면 좋겠지만, 그렇게하면 보안적으로 좋지 않다.

When connecting from an Amazon EC2 instance in a public subnet (the bastion host) to an EC2 instance in a private subnet, the private key file is required. However, for security reasons, the private key files should never be stored on the bastion host. This is why it’s preferred to use agent forwarding to connect from the bastion host to other instances in your Amazon VPC.

그리고 bastion server 보안 그룹의 아운바운드 그룹 / emr cluster 보안그룹의 인바운드 그룹을 수정해야한다.

bastion server의 아웃바운드를 emr cluster로 다 열어줘야하고,

emr cluster에서 bastion server의 ssh 인바운드를 다 받아주고 있어야 한다.

 

public subnet에 있는 bastion server의 pem key = private subnet emr pem key

-> 둘의 pem key가 같은 경우는 아래처럼 진행하면 된다

 

1. ssh-add -K 팸키.pem : 팸키를 캐싱
2. ssh-add -L 팸키.pem
3. ssh -A uername@bastion server host name
     -> 이렇게 하면 우선 bastion server로 접속 한것
4. ssh username@emr cluster private ip

-> 여기서 bation server와 emr cluster의 username이 동일해야한다.

 

-> pem키가 다른 경우는.....?

다른 경우도 동일하다

 

bastion server 접속 할때 -A 없이 접속하면 emr cluster에 permission denied로 못들어가는데, 
-A 명령어 붙이고 접속하면 emr cluster에도 캐싱된 팸키가 적용돼서 접속할 수 있다. 무슨 차이지?

이에 대해선 블로그에 정리해두었으니 참고

 

2-1(번외). basion host 활용해서 포트 포워딩해서 private subnet에 구성된 emr의 웹 인터페이스 접속하기

bastion host 활용하면 ssh 접속만 할 수 있을줄 알았다.

그런데 public subnet에서 master node를 프록시 서버로 활용해서 웹 UI에 접속할 수 있었던 것처럼 

bastion host를 프록시 서버로 활용해서 private subnet의 emr 클러스터 웹 UI에도 접속할 수 있었다.

이를 위해서는

a. emr cluster의 보안 그룹 인바운드 수정하기

- bastion host의 보안그룹에 대해서 all traffic을 받을 수 있도록 add rule 하기

 

b. ssh (-i bastion host 펨키)  -ND 8157(port) username@bastion host address

->8157 포트 번호는  내가 포트포워딩하려고 switch omega Chrome에 설정해둔 포트이다. 위에서 public subnet에서 작업한 거 그대로 사용 가능하다

 

c. 그리고 크롬의 스위치오메가에서 프록시 서버 변경 설정하고

 

d. emr cluster에 있는 웹 UI 주소를 브라우저에 입력하면 웹 인터페이스에 들어갈 수 있다!

 

 

 

 

✅ csv 파일 읽기

http://qpleple.com/hive-how-to-create-a-table-from-csv-files/

 

✅ gz폴더 압축 풀고 읽기

https://stackoverflow.com/questions/51099131/hive-load-gziped-csv-from-hdfs-as-read-only-into-a-table

그냥 csv 파일 읽듯이 읽을 수 있다.

 

 

 

Reference

https://www.youtube.com/watch?v=4faEU_Eq7vU 

https://aws.amazon.com/ko/premiumsupport/knowledge-center/access-emr-cluster-private-subnet/

 

프라이빗 서브넷에 있는 Amazon EMR 클러스터에 액세스

Apache Livy와 같은 애플리케이션을 사용하여 프라이빗 서브넷에 있는 Amazon EMR 클러스터에 액세스하고 작업을 제출하려고 합니다.

aws.amazon.com

https://stackoverflow.com/questions/52816990/sshing-into-aws-ec2-instance-located-in-private-subnet-in-a-vpc

 

SSH'ing into AWS EC2 Instance located in Private Subnet in a VPC

I've been going at this problem for a couple of hours and maybe its not possible, maybe it is. I have a VPC in AWS, with a couple of EC2 instances and Lambda Instances. As of right now, The lambd...

stackoverflow.com

https://digitalcloud.training/ssh-into-ec2-in-private-subnet/

 

SSH into EC2 in Private Subnet | AWS Tutorial

You can SSH into EC2 instances in a private subnet using SSH agent forwarding. Learn how to use connect to Amazon EC2 instances using SSH

digitalcloud.training

 

728x90