MSA 중추 계획
2020-04-09
과정을 적은 것 뿐이다. 결과는 따로 정리
- 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
- 조금 더 괜찮은 Rest Template 2부 - Circuit-breaker
- Springboot hystrix 사용기 (hystrix로 마이크로 서비스 간의 서비스 호출 실패를 방지해보자)
- Github Netflix/Hystrix Configuration
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":{}
}
}