MSA 중추 계획

2020-04-09
  • hustle
  • 과정을 적은 것 뿐이다. 결과는 따로 정리

    - 0405-0411:
      - IDE install, springboot development enviroment configuration
      - PostgreSQL install, connection
      - + springboot-PostgreSQL
    - 0412-0418:
      - springboot-mybatis(query in annotaion)-(herdin-prebuild)PostgreSQL
      - private aws docker postgresql configuration -> private secret info store to vault
      - vault-springboot -> vault token generate/provide
    - 0419-0425:
      - github push webhook -> (*aws codebuild | jenkins | travis | circleCI)
      - github clone -> docker image build -> docker repository push(github | *aws ecr)
    - 0426-0502: .
    - TODO:
      기능:
        회원:
          - 회원 CRUD
        카드:
          - 회원 R
          - 카드 CRUD
        거래:
          - Elasticsearch 연동?
        화면:
          - 회원가입
          - 카드등록
          - 거래조회
      시나리오:
        로그인:
          - request 회원
          - session 관리?
        카드:
          조회:
            - request 카드
          등록:
            - request 카드
          삭제:
            - request 카드
        거래:
          조회:
    
      ready:
        - circuit breakcer - netflix hystrix (+dashboard)
        - reverse proxy - traefik (+dashboard)
      concern:
        - development guide - json request/response
        - docker repository webhook? -> docker stack deploy blue-green? canary?
          - make service blue/green both. controll via label
        - front development - vue.js?
        - container monitoring - portainer?
        - monitoring? - prometheus/grafana?
    

    EC2 에 PostgreSQL docker 로 설치하기

    • EC2 준비
      • 서비스 > EC2 > 인스턴스
      • 인스턴스 시작
      • 단계 1: Amazon Machine Image(AMI) 선택 - Amazon Linux 2 AMI (HVM), SSD Volume Type 선택 (맨위)
      • 단계 2: 인스턴스 유형 선택 - 유형 t2.micro 프리 티어 사용 가능 선택
      • 단계 3: 인스턴스 세부 정보 구성 - 기본값
        • 우발적인 종료로부터 보호 를 체크해두면 좋다.
      • 단계 4: 스토리지 추가 - 기본값
      • 단계 5: 태그 추가 - 안해도됨
      • 단계 6: 보안 그룹 구성 - 신규 보안그룹(방화벽) 명칭은 알아보기 쉽게 적자
        • TCP 22 - ssh 접속
        • TCP 5432 - PostgreSQL 접속
      • 단계 7: 인스턴스 시작 검토 - 한번 확인해보자
      • 시작하기 - 접속을 위한 키페어를 생성하고 다운받아놓자
        • 다시 다운로드 받을 수 없으므로, 꼭 보관을 잘해놓자.
      • 서비스 > EC2 > 인스턴스 에서 인스턴스 상태를 보고 뜰때까지 기다리자.
      • 기다리는 동안 여기를 보면서 아까 다운로드 받은 .pem 파일을 putty 에서 사용할 수 있도록 .ppk 파일로 변환해놓자.
    • docker 설치 및 설정
    # 도커 설치 - 공식홈에서 설치하는거랑 뭐가 다른지 잘 모르겠음.
    $ sudo yum install -y docker
    
    # 도커 실행
    $ sudo systemctl start docker
    
    # 부팅 시 도커 자동 실행
    $ sudo systemctl enable docker
    
    # docker 그룹에 현재 유저 추가 - root 권한 없이 현재 user 로 docker 실행하기 위함
    $ sudo usermod -a -G docker $USER
    
    # 변경사항이 생겼으니 docker 재시작
    $ sudo systemctl restart docker
    
    # user 에 변경사항 적용을 위해 나갔다오자.
    $ exit
    
    # docker 실행 확인 - 아래 버전이 나와야함
    $ docker --version
    Docker version 19.03.6-ce, build 369ce74
    
    • PostgreSQL docker version 설치
    # PostgreSQL 에서 사용할 volume 생성
    $ docker volume create pgdata
    pgdata
    
    # -d : background 실행
    # -p : 포트매핑 외부포트:내부포트
    # --name : 컨테이너 이름 pgsql
    # -e : 환경변수
    # -v : 볼륨매핑 외부볼륨:내부볼륨
    # --restart : 컨테이너 죽었을 경우 정책 : always 항상 재실행
    # postgres:12.2-alpine : 이미지이름:이미지버전
    $ docker run \
     -d \
     -p 5432:5432 \
     --name pgsql \
     -e POSTGRES_PASSWORD=mysecretpassword \
     -v pgdata:/var/lib/postgresql/data \
     --restart=always \
     postgres:12.2-alpine
    
    # 위의 명령 실행후 마지막에 아래와 같은 해쉬값이 떠야됨 - 컨테이너 ID
    d49f2323662b7c7fd51ce89a5fa6b90771b4e820c04598732e94edc71b788531
    
    # 모든 컨테이너 조회 - 잘 떳나 확인
    $ docker ps -a
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
    d49f2323662b        postgres:12.2-alpine   "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        0.0.0.0:5432->5432/tcp   pgsql
    
    # DB 설정하러 컨테이너 내부로 접속
    # 아래 명령어중 d4 는 위의 컨테이너 ID 의 앞에 두자리를 의미.
    # 실행 후 나온 해쉬값이 컨테이너 ID d49f2323662b7c7fd51ce89a5fa6b90771b4e820c04598732e94edc71b788531
    # docker ps -a 로 조회해서 나온 컨테이너 ID d49f2323662b
    # ID 를 다 써도되지만 몇자리로도 유니크하다면 저렇게 몇자리만 써도됨.
    # 이 명령 아래로는 컨테이너 내부의 psql 프로그램임. user 는 postgres (기본루트유저)
    $ docker exec -it d4 psql -U postgres
    psql (12.2)
    Type "help" for help.
    
    # database 생성
    postgres=# create database mydatabase;
    CREATE DATABASE
    
    # user 생성
    postgres=# create user myuser;
    CREATE ROLE
    
    # user 비밀번호 변경
    postgres=# alter user myuser password 'mypassword';
    ALTER ROLE
    
    # 방금만든 user 에 database 권한 부여
    postgres=# grant all privileges on database mydatabase to myuser;
    GRANT
    
    # 새로만든 user 로 접속하기위해 종료
    postgres=# exit
    
    # 새로만든 user 로 새로만든 database 에 접속
    $ docker exec -it d4 psql --username=myuser --dbname=mydatabase
    psql (12.2)
    Type "help" for help.
    
    # 테이블 목록 조회
    mydatabase=> \dt
    Did not find any relations.
    
    # 테이블 정보 조회
    mydatabase=> \d
    Did not find any relations.
    
    # 테이블 권한 조회
    mydatabase=> \z
                                Access privileges
     Schema | Name | Type | Access privileges | Column privileges | Policies
    --------+------+------+-------------------+-------------------+----------
    (0 rows)
    
    # 이제 여기서 create 어쩌고 하면된다
    

    vault docker 설치 및 설정

    # vault 볼륨 생성
    $ docker volume create vaultdata
    vaultdata
    
    # vault 컨테이너 기동
    $ docker run \
      -d \
      -p 8200:8200 \
      --name=dev-vault \
      --cap-add=IPC_LOCK \
      --restart=always \
      -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": {"tcp": { "address": "0.0.0.0:8200", "tls_disable": "true"}}, "ui": "true", "default_lease_ttl": "168h", "max_lease_ttl": "720h"}' \
      -e 'VAULT_ADDR=http://127.0.0.1:8200' \
      -v vaultdata:/vault/file:z \
      docker.io/vault:1.4.0 server
    
    # vault 클라이언트 사용하여 설정하기위해 vault 컨테이너 접속
    $ docker exec -it 18de /bin/sh
    
    # vault 클라이언트 확인
    / # vault
    Usage: vault <command> [args]
    
    Common commands:
        read        Read data and retrieves secrets
        write       Write data, configuration, and secrets
        delete      Delete secrets and configuration
        list        List data or secrets
        login       Authenticate locally
        agent       Start a Vault agent
    ...
    
    vault secrets enable -version=2 -address=http://localhost:8200 kv
    
    

    git bash 를 이용하여 소스 관리를 하자

    초기화

    # 프로젝트 폴더 까지 이동
    $ cd /workspace/my-project
    
    # 초기화
    $ git init
    Initialized empty Git repository in ...
    
    # add, commit 까지는 알아서 하자.
    
    # 원격 저장소를 추가하자
    # git remote add <name> <url>
    $ git remote add origin https://github.com/herdin/deleteme.git
    
    # 추가된 원격 저장소 확인
    $ git remote -v
    origin  https://github.com/herdin/deleteme.git (fetch)
    origin  https://github.com/herdin/deleteme.git (push)
    
    # email/name 등의 config 설정이 안되어있으면 push 실행 시,
    # 어떤 명령어로 추가하라는지 알려준다. 따라하자.
    # 원격저장소 origin 에 master 브랜치를 push 한다.
    $ git push origin master
    Enumerating objects: 3, done.
    Counting objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://github.com/herdin/deleteme.git
     * [new branch]      master -> master
    
    # 성공
    

    build 를 하자

    • 코드빌드로 github webhook -> aws codebuild -> build -> docker build -> aws ecr push 까지 했으니. 이제 docker swarm 환경을 구성해보자!

    netflix-hystrix CircuitBreaker

    Elasticsearch REST API

    # 기본정보 조회
    $ curl http://<ELASTICSEARCH_IP>:9200
    {
      "name" : "f28e95f2b788",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "W8I2rkAGQrCOTCfP1pvcSA",
      "version" : {
        "number" : "7.6.2",
        "build_flavor" : "default",
        "build_type" : "docker",
        "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
        "build_date" : "2020-03-26T06:34:37.794943Z",
        "build_snapshot" : false,
        "lucene_version" : "8.4.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    
    # index=sjb type=trans id=1
    $ curl -X GET http://<ELASTICSEARCH_IP>:9200/sjb/trans/1?pretty
    {
      "_index" : "sjb",
      "_type" : "trans",
      "_id" : "1",
      "_version" : 2,
      "_seq_no" : 1,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "card_no" : "1010010030654487",
        "tr_dtime" : "20200428111213",
        "vehc_id" : "160701002",
        "route_id" : "60600089",
        "tr_amt" : "1150",
        "tr_type" : "0"
      }
    }
    
    # index=sjb type=trans id=1 with query.json
    $ curl -X GET http://<ELASTICSEARCH_IP>:9200/sjb/trans/1?pretty -H 'content-type:application/json' -d @query.json
    {
      "_index" : "sjb",
      "_type" : "trans",
      "_id" : "1",
      "_version" : 2,
      "_seq_no" : 1,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "card_no" : "1010010030654487",
        "tr_dtime" : "20200428111213",
        "vehc_id" : "160701002",
        "route_id" : "60600089",
        "tr_amt" : "1150",
        "tr_type" : "0"
      }
    }
    [herdin86@instance-2 ~]$ cat query.json
    {
       "query":{
          "match_all":{}
       }
    }