레이블이 AWS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 AWS인 게시물을 표시합니다. 모든 게시물 표시

2018년 3월 7일 수요일

Ubuntu에 Docker 설치하고 AWS ECS와 연동하기

참고 사이트
https://docs.docker.com/install/linux/docker-ce/ubuntu/
https://docs.docker.com/registry/deploying/
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/installing.html
https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/ECR_GetStarted.html
http://bluese05.tistory.com/51



Docker를 써봐야지 써봐야지 하다가 드디어 맘먹고 설치부터 원격 repository까지 설정해 봤다.

Ubuntu 16.04에 Docker 설치하기


혹시나 있을 구 버전의 docker를 제거한다.
$ sudo apt-get remove docker docker-engine docker.io

패키지 리스트 업데이트
$ sudo apt-get update

필요한 패키지 설치
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

Docker 공식 GPG key 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

apt-key 핑크프린트 확인
$ sudo apt-key fingerprint 0EBFCD88

apt 소스 repository 추가
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

repository 추가 했으니 다시 업데이트
$ sudo apt-get update

docker 설치
$ sudo apt-get install docker-ce

정상 설치 확인
$ sudo docker run hello-world



AWS ECS(Elastic Container Registry) 생성하기

AWS 프리티어로 가입 후 12개월 동안 매달 500M까지 무료 이용 가능

1. AWS 콘솔 로그인
2. Elastic Container Service 서비스 접속
3. 리포지토리 탭 - 리포지토리 생성
4. 리포지토리 이름 작성
5. ECR용 계정 생성(IAM)
  a. IAM 서비스 접속
  b. 사용자 - 사용자 추가
  c. 사용자 이름 입력
  d. 액세스 유형
    - 프로그래밍 방식 액세스는 필수
    - AWS Management Console 액세스는 선택 사항
  e. 권한 설정
    - 기존 정책 직접 연결 : AmazonEC2ContainerRegistryFullAccess 중 알맞는 것 선택 권한은 더 축소하려면 FullAccess 말고 다른 것 선택
  f. 사용자 만들기
  g. 액세스키 보관을 위해 .csv 다운로드 하고 잘 보관하기


AWS ECS 접속하기


1. aws cli를 설치해야한다. (pip가 설치 안되어 있다면 먼저 설치한다.)
$ sudo apt-get install python-pip
$ pip install awscli --upgrade --user
2. 잘 설치 되었는지 버전 확인
$ aws --version
3. aws 접속을 위한 계정 설정
$ aws configure
4. 정보 입력하기
AWS Access Key ID [None] : 아까 다운 받은 csv 파일에서 확인
AWS Secrect Key [None] : 아까 다운 받은 csv 파일에서 확인
Default region name [None] : ECS 리포지토리탭에서 리포지토리 URI를 확인하면
  11111111.dkr.ecr.ap-northeast-2.amazonaws.com 형태로 되어 있는데
  그 중에서 ap-northeast-2에 해당하는 걸 입력하면 된다.
Default output foramt [None] : json
5. 로그인하기
$ aws ecr get-login --no-include-email --region [region]
docker login -u AWS -p XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e none https://XYZXYZXYZXYZ.dkr.ecr.xxxxxxx.amazonaws.com

6. 이런식으로 명령어를 반환하는데 이걸 그대로 복사해서 입력하면 aws ecr에 docker image를 push할 수 있게 된다.


기존 Docker Image 받아서 나만의 Docker Image 만들기

1. Ubuntu 16.04 기반의 container를 실행한다.



$ sudo docker run -i -t --name my_ubuntu ubuntu:16.04
해당 명령을 실행하면 ubuntu 16.04 이미지를 기본 repository(docker hub)에서 다운 받고 해당 이미지로 로컬에 컨테이너를 실행시키고, root 권한으로 shell을 실행한다.

2. 변경 사항 만들기 1 - 계정 새로 만들기(계정명이 ubuntu)
# adduser ubuntu
비밀번호 입력하고 나머지는 엔터로 넘기고 마지막에 y

3. 변경 사항 만들기 2 - 파일 생성
# su - ubuntu
$ cd ~
$ echo "Hello World" >> my_ubuntu
4. 컨테이너에서 빠져나오기
exit, exit 입력하고 원래 로컬의 ubuntu로 돌아온다.

5. 변경 된 사항으로 이미지 만들기
$ sudo docker ps -a
실행되었던 container 목록이 나온다. 우리는 my_ubuntu라는 container를 이미지로 만들 것이다. 이때 확인해야 될 것은 리포지토리 URI이다.
$ sudo docker commit -a "username" -m "my first commit" my_ubuntu 리포지토리URI:TAG

TAG 입력 시 1.0 형태로 입력하면 push가 안되는 것 같다. 그래서 first, second와 같이 하거나 v1 처럼 . 없이 입력해야 잘 된다. 입력 안할 경우에는 기본적으로 latest로 지정

**URI 확인하기
a. Elastic Container Service 서비스 접속
b. 리포지토리 - 생성한 리포지토리 이름 클릭
c. 푸시 명령보기 버튼 클릭
d. 아까 Docker를 설치한 ubuntu 서버에서 해당 명령을 따라하면 된다.

6. 생성 된 이미지 확인하기
$ sudo docker images
하면 image가 추가 된 것을 확인할 수 있다.


Docker Image AWS ECR에 push/pull 하기

1. push하기
$ sudo docker push 리포지토리URI:TAG
2. AWS 콘솔에서 직접 확인한다.

3. local에 저장되어 있는 이미지 지우고, esc의 이미지 받아와서 container 생성하기
a. 현재 존재하는 컨테이너를 확인해서 모두 지운다.
$ sudo docker ps -a
$ sudo docker rm my_ubuntu (나머지 컨테이너도 동일하게 삭제)
b. 현재 존재하는 이미지를 확인해서 모두 지운다.
$ sudo docker images
$ sudo docker rmi REPOSITORY:TAG
c. ECR에서 이미지를 받아서 컨테이너 생성
$ sudo docker run -i -t --name aws_my_ubuntu REPOSITORY:TAG
d. 변경 된 파일 있는지 확인
# tail /home/ubuntu/my_ubuntu
위에서  /home/ubuntu/my_ubuntu에 Hello World 문자열을 입력한 것이 있는지 확인한다.


이런 식으로 나만의 이미지를 만들어서 AWS에 올려 놓고 배포할 수 있다.



2017년 10월 31일 화요일

EMR에서 Hadoop Job을 돌리고 ElasticSearch에 결과 출력하기

참고 사이트

https://www.elastic.co/guide/en/elasticsearch/hadoop/current/troubleshooting.html
http://libqa.com/wiki/807

EMR 클러스터 세팅

EMR 클러스터와 ElasticSearch 서버와의 연동 테스트를 위해서 우선 EMR 클러스터 마스터 노드에 ElasticSearch를 설치해서 진행했다.

Hadoop 출력을 Elastic Search에 저장하기
참고해서 마스터 노드에 Elastic Search를 설치한다.

Elastic Search 설정 파일을 수정한다.
vi $ES_HOME/config/elasticsearch.yml

network.host: 192.168.0.1
http.port: 9200

마스터 노드 내부 IP를 입력한다.
이 IP가 Java 프로그래밍 안에 들어가야 한다.
conf.set("es.nodes","192.168.0.1:9200");

보안그룹 인바운드 규칙 편집

마스터 노드 보안 그룹의 인바운드 규칙을 수정한다.
마스터, 슬레이브 노드 간에는 모든 TCP, 모든 UDP 등 기본으로 되어 있는 규칙이 있기 때문에
ElasticSearch를 마스터 노드 내부에 설치했을 경우 별도의 설정이 필요 없을 것이다.
만약 외부에서 ElasticSearch에 접속해야 될 경우 외부에서 접속할 수 있는 경로를 열어놔야 한다.
규칙 추가를 누르고 아래 내역을 입력하고 저장한다.
- 유형 : 사용자 지정 TCP
- 프로토콜 : TCP
- 포트 범위 : 9200
- 소스 : '내 IP'(고정 IP가 없다면 '위치 무관')


scp를 이용해서 로컬에서 작업한 mapreduce jar 파일을 마스터 노드로 복사한다.
elasticsearch를 실행하고 wordcount 예제를 돌려서 에러 없이 돌아가는지 확인한다.
정상적으로 돌아갔다면 데이터가 정상적으로 들어갔는지 확인한다.

마스터 노드에서
curl -XGET http://[Private IP]:9200/hadoop/_search?pretty=true?q=*.*

외부에서는
curl -XGET http://[Public IP]:9200/hadoop/_search?pretty=true?q=*.*


{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1035,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "hadoop",
        "_type" : "wordcount",
        "_id" : "AV9wXlTwywZ-ibD3mov5",
        "_score" : 1.0,
        "_source" : {
          "reaffirm" : 1
        }
      },
      {
        "_index" : "hadoop",
        "_type" : "wordcount",
        "_id" : "AV9wXlTwywZ-ibD3mov8",
        "_score" : 1.0,
        "_source" : {
          "recognition," : 1
        }
      },
      {
        "_index" : "hadoop",
        "_type" : "wordcount",
        "_id" : "AV9wXlTwywZ-ibD3mov_",
        "_score" : 1.0,
        "_source" : {
          "refused" : 1
        }
      },

이런 식으로 source에 wordcount 결과가 저장된다.

2017년 10월 27일 금요일

AWS EMR에서 custom MR Job 돌리기

참고 사이트
http://www.thecloudavenue.com/2013/12/CustomMRExecutionWithAmazonEMR.html

Master 노드에 SSH로 접속하기

http://modoleesi.blogspot.kr/2017/10/aws-emrelastic-mapreduce.html
참고해서 먼저 SSH에 접속할 수 있는 환경을 만든다.
그리고 아래 명령어로 master 노드에 접속한다. (계정명은 hadoop)

ssh -i ~/<your_access_key>.pem hadoop@ec2-000-000-000-000.region.compute.amazonaws.com

필요한 파일들 복사하기

로컬PC에서 컴파일한 jar와 input 파일들을 옮겨야 한다.
scp -i ~/<your_access_key>.pem <복사를 원하는 원본 파일의 경로> hadoop@ec2-000-000-000-000.region.compute.amazonaws.com:/home/hadoop/<복사 목적지 경로>

HDFS를 저장소로 이용해서 Shell에서 실행

로컬에서 실행하는 것도 동일하게 실행하면 된다.
hadoop jar wordcount-demo-1.0-SNAPSHOT.jar WordCountJob input output 

S3에 파일 업로드

Shell에서 업로드

S3를 HDFS 처럼 사용할 수 있다.
hadoop fs -put input s3://mybucket/directory

AWS 콘솔에서 업로드

S3 콘솔에 접속해서 그냥 파일 첨부 형식으로 업로드 하면 된다.

S3를 저장소로 이용해서 실행

Shell에서 실행

hadoop jar wordcount-demo-1.0-SNAPSHOT.jar WordCountJob s3://mybucket/directory/input s3://mybucket/directory/output 

AWS 콘솔에서 실행

클러스터 정보에 들어가서 단계(Step) 탭에 들어가면 단계 추가(Add Step)이 있다.
그걸 누르면 위 처럼 입력할 수 있는 창이 뜨는데 여기에 맞춰서 넣어주면 된다.
단계 유형(Step type) : Custom JAR
이름 (Name) : 원하는 이름으로
JAR 위치 (JAR S3 location) : S3에 올려놓은 jar 파일 위치
인수(Arguments) : MainClass명 인수들... (입력 출력 위치 등등...)
실패 시 작업(Action on failure) : '계속'으로 되어 있는데, 그냥 job 실패하면 '취소 및 대기' 하는게 더 나아 보인다.

다 채운 후 추가(Add)를 누르면 Job이 추가되고 상태가 나온다.

2017년 10월 23일 월요일

AWS EMR(Elastic MapReduce) 구성

참고 사이트


EMR(Elastic MapReduce) 란?

Amazon EMR은 AWS에서 Apache 하둡 및 Apache Spark와 같은 빅 데이터 프레임워크 실행을 간소화하는 관리형 클러스터 플랫폼입니다. 이러한 프레임워크와 함께 Apache Hive 및 Apache Pig와 같은 관련 오픈 소스 프로젝트를 사용하여 분석용 데이터와 비즈니스 인텔리전스 워크로드를 처리할 수 있습니다. 또한 Amazon EMR를 사용하여 Amazon Simple Storage Service(Amazon S3) 및 Amazon DynamoDB와 같은 기타 AWS 데이터 스토어 및 데이터베이스에서 많은 양의 데이터를 양방향으로 변환하고 이동할 수 있습니다.

하둡 클러스터를 구성해주는 상품!
EC2를 이용해서 클러스터 노드를 유동적으로 더하고 빼고 할 수 있다.

클러스터 생성


클러스터 생성 버튼을 누른다.

- 클러스터 이름원하는 이름
- 시작 모드 : 클러스터 (단계 실행은 아마도 시작 후 바로 job을 실행하도록 할 때 사용하는 것 같음)
- 릴리스 : 모르니깐 최신버전
- 애플리케이션 : Hadoop 이 외에 특별히 쓰고자 하는 것이 없으면 Core Hadoop
- 인스턴스 유형 : 현재 가장 저렴하게 사용할 수 있는 거는 m4.large (더 사양이 낮아도 될 것 같은데 지금 선택할 수 있는 옵션 중에서는 이게 가량 저렴한 것 같다.)
- 인스턴스 개수 : 2 (우선 테스트용으로 마스터 1대, 코어 1대)
나중에 제대로 돌리려면 replication을 생각한다면 5대 이상 생성해야 한다.
EMR에서 자동으로 코어 개수에 따라 replication을 지정하는데
1대~3대  : 1
4대~9대  : 2
10대 ~ : 3
- EC2 키 페어 : 사용할 키페어 지정
- 권한 : 기본값

클러스터 생성!

그러면 인스턴스 2개가 프로비저닝 중이라고 뜰거고, 그게 다 뜨면 마스터 퍼블릭 DNS를 확인하고 SSH 접속을 시도한다. 그런데 접속이 안된다......

클러스터 생성 후 SSH로 Master 노드에 접속하기

SSH 접속을 위해서는 보안 그룹 규칙을 추가해 줘야 한다.

"기본적으로 ElasticMapReduce-master 보안 그룹은 인바운드 SSH 액세스를 허용하지 않습니다. 따라서 액세스를 원하는 소스에서 SSH 액세스(TCP 포트 22)를 허용하는 인바운드 규칙을 추가해야 합니다. 보안 그룹 규칙 수정에 대한 자세한 내용은 Amazon EC2 User Guide for Linux Instances의 보안 그룹에 규칙 추가를 참조하십시오." 라고 한다.

2017년 10월 20일 금요일

AWS(Amazon Web Service) 주요 상품 및 튜토리얼

참고 사이트
자주 사용되는 AWS 기능 및 장점 정리
AWS와 Open Source


주요 상품

Server

  1. EC2(Elastic Compute Cloud)
    : Amazon Elastic Compute Cloud(EC2)는 안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹 서비스입니다. 개발자가 더 쉽게 웹 규모의 클라우드 컴퓨팅 작업을 할 수 있도록 설계되었습니다.

Storage

  1. S3(Simple Storage Service)
    : S3를 통해 비용 최적화, 액세스 제어 및 규정 준수 데이터를 유연하게 관리할 수 있습니다. S3는 쿼리 지원 기능을 가진 유일한 클라우드 스토리지 솔루션으로, S3에 있는 데이터에 대한 강력한 분석을 바로 실행할 수 있습니다

DataBase

  1. RDS(Relational Database Service)
    : Amazon RDS는 관리형 관계형 데이터베이스 서비스로서, 고객이 선택할 수 있도록 Amazon Aurora, MySQL, MariaDB, Oracle, Microsoft SQL Server, PostgreSQL과 같은 6개의 익숙한 데이터베이스 엔진을 제공

사용법

  1. EC2 튜토리얼 - Linux VM 생성
    ssh 접속 할 때 에러가 발생할 때 참고
  2. S3 튜토리얼 - Bucket 생성 후 파일 업로드
  3. RDS 튜토리얼 - RDS 만들고 MySQL에 접속하기