반응형

대규모 마이그레이션을 위한 전략 / Tool

개요

  • 업무시스템을 Cloud로 옮기고 싶은경우
  • Cloud 서비스가 제공하는 규정준수 / Scaling을 요구하는 경우
  • 하드웨어 / 소프트웨어 교체
  • 비용적인 측면

업무시스템을 Cloud로 전환하기 전 준비

  • 현재 상태를 진단한다
    • 조직은 준비되어있는가?
    • 어떤 부분을 Cloud로 옮길것인가?
    • Cloud로 옮기면서 우리가 얻는것은 무엇인가?
  • 계획을 수립한다
    • 포트폴리오 정리
    • 어떤 부분을 Cloud로 옮길 것인가? 마이그레이션 할 것인가?
    • Cloud 기초환경을 구성해야 한다(Network, Account, Service …)
  • 마이그레이션 작업
    • 다수의 시스템을 동시에 진행 → 자동화 툴을 사용해야 한다

마이그레이션에 도움을 주는 AWS Service

1. 포트폴리오 정리

  • AWS Application Discovery Service
    • 자료수집 서비스
    • Agent를 사용하여, IDC내의 서버의 정보를 수집한다
    • 수집한 정보를 기반으로 계획을 수립…
  • AWS Migraiton Hub
    • 정보를 모이면 → 해당 Hub에 모인다
    • 해당 Hub에서 전략을 수립해준다.
    • 어떻게 마이그레이션을 할것인가?

2. 기초 플랫폼 구성

  • 각각 VPC로 나누는 것보단, 계정을 나눠서 관리하는 것이 더 효율적임
  • AWS Control Tower를 사용하는것이 좋음 (다중 계정 관리 + SSO + 작업추적 관리)

3. Relocate: VMware 마이그레이션

  • VMWare를 사용하여, AWS로 Migration을 진행할 수 있음

4. Rehost: onPremise 서버를 AWS로 Migration (MGN 사용)

  1. Source 에 AWS Agent를 설치
  2. Source Disk에서 Staging AWS Cloud EBS에 실시간 복제 ( 압축 및 암호화 )
  3. Staging EBS에서 Cut Over를 진행하면 → Migraiont Service가 실제 소스 서버로 자동변환
  4. 시작된 인스턴스가 잘 동작하는지 확인
  5. 소스 서버를 모두 마이그레이션하면 → Staging EBS및 Migation Service를 삭제 가능

5. 운영체제 및 미들웨어 변경

  • AmazonLinux 및 ECS, EKS 컨테이너 기반으로 옮길수 있음
  • Chef, Puppet을 사용한다면 → AWS Opswork를 사용하여 구성관리 가능

6. Database Migration

  • AWS Migraiton Service
    • 동종 DB도 옮길수 있고 → 이종 마이그레이션으로 옮길수도 있음
  • AWS Schema Conversion Tool
    • 자동으로 변환하여 → 예측가능한 방식으로 이기종 데이터베이스로 변환가능

7. 데이터 마이그레이션

  • AWS SnowBall
    • 오프라인 데이터 전송 서비스
    • Onpremise 데이터 복사 → AWS 데이터센터로 데이터 이동
  • AWS DataSync (실시간 데이터 Sync를 맞출 수 있다)
    • 네트워크 대역폭을 최적화하며 → Onpremise → AWS로 온라인 데이터 전송

Reference

대규모 마이그레이션을 위한 전략과 AWS의 도구들 - 이경원, 박기흥 솔루션즈 아키텍트, AWS :: AWS Summit Korea 2022

반응형
반응형

글로벌 채팅 서비스 (AWS Native)

Desc

  • 천만 사용자를 위한 카카오의 AWS Native 글로벌 채팅 서비스

글로벌 채팅 서비스의 요구사항과 전략

  • 글로벌 서비스 출시
  • 빠른 개발을 위해서 적은인원으로도 Buildup이 가능해야했음 → 중요한것에 집중해라
  • 정말 이게 될까?” 의 대한 빠르고 정확한 해답을 원했음

전략

  • AWS 글로벌 Infrastructure
  • Serverless (적은 인원으로도 빠르게)
  • Prototyping (빠른 의견의 수용)

AWS Global Infrastructure

  • AWS는 여러리전과 AZ를 제공한다.
  • 이러한 Region들을 사용해서 각 지역의 사용자에게 빠르게 Serving 한다
  • 100GbE 급의 네트워크 통신가능 (Direct Connect)
  • 좋은 AWS 네트워크 설계 (어느한곳에 서비스가 끊겨도 → 다른곳을 이용해서 통신한다)
    • 고 가용성 확보 (Availaiblity zone) x ≥ 2

Serverless

  • 소수정예 인원으로 빠르게 인프라를 구축해야 한다.
  • 그렇다면 Management는 AWS에게 맡기고 구축 & 운영을 해보자

  • AWS Lambda
    • 현재는 Lambda 자체가 비동기적인 EDA를 구축할수 있다.
    • API 기반의 HTTP, HTTPS 기반의 Serverless도 구축가능

  • DynamoDB (채팅 데이터 및 메시지를 어떻게 관리할까?)
    • RDS도 고민했지만 그 수많은 채팅 메시지에 관계형을 쓴다는것은 좋은 선택이 아님
    • 오히려 빠르게 Update 되는 성격을 띄는 채팅 특성상 NoSQL이 적합했음
    • 인덱스만 안다면 데이터를 바로 뽑을 수 있음 O(1)

  • AWS IoT (Client 들의 App의 대한 연결을 어떻게 진행하지?)
    • 결국 Mobile App은 여러가지 변수가 발생함
    • 출근길에 터널을 지난다든지 (네트워크 불량)
    • 집에서 사무실에서 다시 접속할때 (네트워크 변경)
    • 클라이언트 연결관리를 진행 함 → AWS IoT

정말 이게 될까?

  • AWS에는 Prototype Team이 이미 존재
  • 빠르고 바른 의사결정을 위한 AWS 내부 Team
    • 실제 상황과 아주 유사한 환경을 Test 함
    • 성능 검증까지 진행

실제 AWS Native 사례 (Global Chatting)

  • 실시간의 성격이 뚜렷한 채팅서비스를 Serverless로 구축할 수 있을까?
  • 1.5명의 인원으로 글로벌 채팅 서비스를 구축해야 했음

첫번째 시도 2018) API Gateway

  • Amazon API Gateway가 Websocket을 지원함
  • 기본적인 XMPP Server의 문제점은 Scale-out되는 구조가 되야하는데, 이러면 메시지 공유가능한 Broker와 Load Balancer가 필요함

구현 Lambda + API Gateway + DynamoDB

  • AWS 서비스를 활용하여 관리포인트 감소
  • 추가적인 요구사항
    • 접속 상태 확인 (과거)
    • 메시지 즉시 전달 (과거)
    • 메시지 보관 (현재)
    • 답글 달기 (현재)
    • 공지 (현재)
    • “좋아요” 달기 (현재)

  • API Gateway + Lambda + DynamoDB를 사용해서, Scale-out을 빠르게 보장할수 있었음 (최고)
  • 안티패턴 극복
    • RDBMS에서는 id라는 primary key를 사용해서 auto_increment로 사용
    • NoSQL에서는 pk개념이 없기 때문에, uuid를 사용해야 함

성공적인 결과 → 글로벌 서비스 구현 지원

  • 서울, 도쿄, 북미 여러 리전에 접속한 유저들의 채팅에 있어서 분석결과
    • 주로 같은 리전에서 트래픽이 발생함 (언어가 통해야되기 때문에)
    • 간혹 다른리전에서 발생도 하긴 함
  • Region을 넘어선 통신의 대해서는 아키텍처를 고려해볼만 함
    • Region 간의 API 호출 시 낮은 지연시간 ⇒ Amazon API Gateway ****
      • Region 과 Region 간의 통신이 가능함
      • 즉, A Regino에 Lamba가 B Region에 API Gateway 통신이 가능함
    • 다른 Region에 대한 정보는
      • AWS Lambda → API Gateway 를 통해서 가져옴
    • Region 간의 데이터 동기화
      • Amazon DynamoDB Global Table을 사용해서 진행
      • Region 간의 각각 테이블이 존재하면 동기화 하는 방식임

중국 → 중국은 AWS 내의 서비스를 대부분 지원을 하지 않음

  • 중국은 CloudFront를 사용해서 Proxy 역할을 지원

동남아는 성공 ⇒ 글로벌 서비스를 위한 지원

  • 요구사항
    • DAU 10,000,000
    • MAU 1,000,000
    • 서버리스를 사용하되, Quota안에서 동작가능하도록 설계해야 함 (기획 + 사업)
    • 유저의 수용 수가 커진만큼, 급격한 트래픽의 대해서 Stream Pipeline (Kinesis) 구축
  • 아키텍처 설계

  • 실시간 Pipeline
    • Amazon API Gateway + AWS Lambda + DynamoDB
  • 대용량 트래픽 + Client Side의 대한 신뢰성 검증
    • AWS IoT Core (Client의 신뢰성)
    • Amazon Kinesis Data Stream
  • 인증과 관련된 도구들
    • Amazon Cognito
    • AWS WAF

Reference

천만 사용자를 위한 카카오의 AWS Native 글로벌 채팅 서비스 - 김영욱 SA, AWS / Walter Kim 실장, Kakao :: AWS Summit Seoul 2023

반응형
반응형

EKS + 당근페이 Case + BNX Case

Kuberentes

  • 컨테이너화된 워크로드와 서비스를 자동적으로 배포, 스케일링 및 관리 ⇒ 오케스트레이션 도구
  • 자동화된 롤아웃과 롤백
  • Self Healing ⇒ Replicaset
  • Service Discovery + Load Balancing
  • Bin Packing ⇒ K8s가 알아서 CPU, Memory, 공간 알아서 해줌
  • Secret 관리 및 구성 관리

EKS

  • 인증된 k8s 버전
  • 관리형 쿠버네티스 환경 구축/

Problems

  • K8s 업그레이드를 자주 해야 한다 ⇒ 업그레이드 이슈
  • Amazon EKS 업글은 3~4개월마다 업그레이드 할때마다 이슈

Amazon EKS 업그레이드 순서

  • Master Node
    • EKS master Upgrade
    • CoreDNS Upgrade
    • KubeProxy Upgrade
    • Amazon VPC CNI Plugin Upgrade
  • Worker Node
    • 새 버전의 노드 그룹을 생성 → Pod를 이사시켜야 함…

Amazon EKS 업그레이드방법

  • Single Cluter
    • 기존 클러스터내에서, 한 version씩 업그레이드 (계단식)
    • 1.15 → 1.16 → 1.17 → 1.18 각 버전당 40분씩 걸림 (Master Node) ⇒ 시간을 상당히 소요
    • 잘 동작하고 있는 기존 시스템을 크게 변경하지 않음
    • cordon, drain으로 무중단 업그레이드 가능 ⇒ 롤백은 불가능
    • 새로운 클러스터를 만들고, Traffic을 이전하는 방법
    • Traffic을 새롭게 이전해야 하는데, 굉장히 어려움
      • ALB를 Terraform으로 수정해서 쉽게 바꿈 ⇒ ALB + Terraform
      • NLB는 HA Proxy를 앞단에 두어 세밀한 설정을 가능하게 함 ⇒ NLB + HA Proxy
      • 결국 트래픽전환이 잘 되었는지는, Prometheus, grafana를 사용해서 모니터링 해야 함…
    • 업그레이드를 한번에 하니까 빠름 ⇒ 내부 시스템도 한번에 업그레이드 가능
    • 트래픽 조절만 잘하면 무중단 업그레이드 가능
    • 트래픽 조절만 잘하면 멀티 클러스터 운영도 가능
    • 트래픽 조절 ⇒ Terraform + HA Proxy
    • 언제든 이전상태로 롤백가능Multi Cluster

당근마켓 인프라 구축 Case

Desc

  • 당근페이 === FinTech
  • FinTech Infra ⇒ 어려움
  • 금융 서비스 라이센스 문서 작업 + 감독 규정 + Compliance
  • 보안성과 업무 효율성의 기반한 망분리
  • 100% 클라우드 환경에 구축

1. 로그인 시스템 구성

 

  • 계정별로 환경이 분리
    • 개발 계정
    • 운영 계정
  • 로그인 할 수 있는 창구가 최소화
    • 로그인은 대표 계정 하나에서만…
    • Security 계정은 대표계정 ⇒ IAM만 존재
    • 로그인을 할려면 무조건 Security 계정으로 들어와야 함
    • 개발 / 운영 계정으로 Assume Role을 사용하여 넘어감
  • 계정 탈취 시, 여파를 최소화
    • 탈취 되어도 볼수 있는 정보가 없도록..

AWS Login Use Zero Trust Concept

  • Security 계정
    • EC2, RDS 이런 AWS Resource 아무것도 없음 ⇒ 무조건 IAM ⇒ 탈취해도 아무것도 못함
    • Assume role을 사용해서 들어가야 함…
    • { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::DEVAWSACCOUNTID:role/RoleNameInDevAccount", "arn:aws:iam::PRODAWSACCOUNTID:role/RoleNameInProdAccount" ] } ] }
  • Dev / Prod 계정
    • IAM 사용자가 없음
    • 로그인 하는 경우는, Root 계정, Security → Assuming 형태로 들어갈 수 있음

2. 서버 접근

  • 기본적인 서버 접근 방법은
    • SSH
    • Bastion Host + SSH 접근
  • 약간 보완된 서버 접근방법
    • AWS Session Manager
    • Teleport
      • Kubernetes 방식으로 운용 할 수 있음…
    • Hashicorp Boundary
  • Teleport (약간 Cloud Trail과 비슷함)
    • 유료도 있으나, opensource로도 존재…
    • RBAC 지원
    • github.com 인증 연동
    • 세션 레코딩 기능 ⇒ DataDog RUM과 같음
      • 로그인 한 사용자가, 어떤 행위를 했는지 다 보임 (지림)
      • 물론, 기본적인 linux history나 그런게 있지만 시각적으로 볼수있다는게 장점…

3. 애플리케이션 접근

  • Kubernetes vs EC2
    • Kubernetes 너무 어려움… ⇒ hot한 이유가 있지 않을까?
    • EC2 너무 쉬움…
  • EKS Architecture in 당근페이
    • ALB는 모두 Kubernetes Ingress
    • 마이크로 서비스 간 호출은 ALB를 통해 호출
    • 더욱 더 많은 Pod 내의 통신을 위해서 Istio를 고려를 하고있음

4. 배포 파이프라인

  • Jenkins, TeamCity, Github Action 너무 좋은게 많지만,
  • EKS는 왠만하면 ArgoCD, Github Action, ArgoWorkflow ⇒ Github 과의 연동이 쉽고 간단함
  • 배포 파이프라인
    1. 소스 코드 업로드 및 PR 생성 (Github On-Premise사용)
      • EC2 자체의 대한 비용 (m5.4xlarge로 하였음)
      • EC2 Disk의 종속이 있음
    2. Github Action WorkFlow 동작 (Github Action)
    3. Github Action) ECR 업로드
    4. Kubernetes 매니패스트 Tag 업데이트
    5. Kubernetes 매티패스트 Tag 업데이트가 된걸 ArgoCD가 Check
    6. ArgoCD가 변경된 매니페스트를 EKS에 적용
  • 해당 배포 파이프라인에서 사람손을 타는건 1~2 밖에 없음
  • Github Action WorkFlow도 나쁘지는 않음 → 근데… Jenkins랑 별반다를거 없지만
    • Github / Gitlab + Jenkins (EC2 2EA)
    • Github (github Action) (EC2 1EA)

5. 관측 시스템

  • DataDog (SASS)
  • Elastic Stack (직접 설치)
  • New Relic (SASS)
  • Elastic APM (직접 설치)
  • Prometheus (직접 설치)
  • 원래라면 DataDog, New Relic을 사용하는것이 좋다 ⇒ 물론 비쌈
  • 당근페이같은 경우에는, Compliance로 인하여 직접구축을 함

로그 시스템

  • Elastic Stack (로그 수집 및 시각화)
  • Prometheus ( 시스템 로그 수집)
  • WorkNode에는 DeamonSet (FileBeat + Node Exporter)로 구축
  • Node Exporter 외에 여러가지가 존재…
  • FileBeat + LogStash + ElasticSearch + Kibana
  • 여기서 중요한 건, Elastic Search를 제외하곤 모두 EKS로 구현
  • Prometheus를 EKS로 구성하기 위해선?
    • prometheus-operator
    • 어떤 버전으로, 볼륨 구성의 관한것을 yaml 파일로 정의

APM 시스템

  • Pod들 별로 APM Agent 별로 설치
  • Elastic Uptime을 사용하여, 각 서비스들의 Endpoint들의 대한 모니터링

AWS Resource Monitoring

  • 원래라면 CloudWatch + SNS + Lambda + Slack를 사용하여 구축
  • CloudWatch + SNS + AWS Chatbot + Slack설정
  • AWS Chatbot을 사용하면 좀더 편리하게 관리가 가능… Metric 이미지까지도 쉽게 전송이 가능함…

6. 성능 테스트

  • 당근페이에서는 성능테스트를 굉장히 중요하게 생각함…. ⇒ 사실 중요하긴 함
  • 성능테스트 도구
    • apache benchmark (HTTP / HTTPS 단의 부하테스트)
    • klocust (kubernetes 기반에 동작하는 오픈소스)
  • 10분동안의 테스트를 통해 99 Percentile 응답시간이 100ms 이내일때의 최대 TPS
    • pod가 받아낼수 있는 최대 TPS
    • 즉 100ms 가 넘어가는 TPS를 측정한다
    • 우리는 얼마일까… 해볼껄…
    • 100ms 넘어가는 시점에서 ⇒ “우리의 pod는 N TPS이구나. 이시점에 알람을 걸어놓자…

BNX Case (Traffic 대응)

  • 갑작스럽게 발생하는 트래픽을 어떻게 대응할 것인가?
  • Weverse의 ALB Request Count가 22:30 ~ 23:00 까지 2.72M 까지 올라감 ⇒ 평상시 100배
  • 평균 거의 없는 수준임…
  • 서버운영 어떻게 해야하지?
    • 한 순간을 위해 서버를 여러개 놔야 하나? ⇒ 비용 문제
    • Auto Scaling? ⇒ Auto Scaling을 쓰면 한 템포 느림 (5~10분 정도의 시간이 걸림) ⇒ 앱 버벅 및 느려짐 ⇒ 터짐

사전에 증설되는 순간을 감지할 수는 없을까? ⇒ Event Driven AutoScaling

  • 이벤트에 의해 동작하는 오토 스케일링

Predefined Event : 미리 정의되어 있는 이벤트 ( MD 판매 이벤트 )

  • 특정 아티스트의 MD 판매 이벤트는 언제 팔지 알기때문에 → 사전대응가능
  • 스케일링의 업무 수작업은 → 업무 효율이 떨어짐 → Lamba로 구성
  • 이벤트 등록을 하고, Lambda는 몇분, 몇시간동안 계속 이벤트를 조회
  • 조건에 맞는 이벤트를 찾는다면, AutoScaling의 값들을 수정해준다…
    • Desired Count
    • Max
    • Min
  • AutoScaling 한 결과를 Slack 채널에 결과를 전송

Undefined Event : 미리 정의되어 있지 않은 이벤트 ( 아티스트의 글 작성 )

  • 아티스트가 글 작성은 사실 언제 작성이 될지 아무도 모름 ⇒ 사전 대응이 불가능
  • Push는 GCP Cloud 같은 걸로 보낸다
  • API Gateway를 호출한다 → Lambda 호출 물론, CloudWatch Cron을 사용해서 주기적으로 호출한다.
  • Undefined의 종료조건은
    • 글 작성 후 30분후에 Auto Scaling을 원상복구

해결해야 할 과제… (아직 해결해야할 과제들이 많이 남아있음)

1. AutoScaling에 소요되는 시간의 최소화

    • ansible을 사용하여 Linux → 공통 설정 → FileBeat 설정 → API Server 구동 (전체 과정이 5분 소요)
    • 이게 AutoScaling을 하게되면 이러한 과정이 5분동안 진행된다는 관점이라면,
      • ECS + Step Scaling을 하는게 더 빠르겠네 (1~2분 이내의 증설) (METAPIXEL)
      • AMI를 미리 만들자.. (Golden Image)
    • 개선된 배포시스템
      • 이렇게 해서 전체과정이 3분정도 소요… → 하지만 목표는 1분안에 증설 완료
    • 배포 과정을 최적화

2. 증설되는 동안 최대한 버텨주기 (제발…) ***

  • 인스턴스 성능 최적화
  • 잘 튜닝된 t3.medium, 10개 c5.xlarge 안 부럽다.
  • 성능최적화의 핵심은 모든 리소스를 최대한 활용하는 것
  • 성능 튜닝 전 EC2 (장애상황)
    • 리소스가 펑펑 남아돔에도 불구하고 CPU 1% 차지않고도 에러가 남…
    •  
     
  • OS와 애플리케이션 디폴트 설정으로 애플리케이션 설정에 영향을 받지 않아야 한다.
    • Too many open files
    • Too many connections
  • 성능 튜닝 1
    • Application 에서 더욱 많은 리소스를 요구할때, OS Limit을 Full로 쓰게 만든다.

  • 성능 튜닝 2  
  • Nginx 성능 튜닝
    • https://www.nginx.com/blog/tuning-nginx/
    • nginx 성능 중 가장 중요한 지표
    • c5.12xlarge를 데려와도 장애 납니다.
    • worker_processes도 실제 cpu core수만큼으로 돌려야 한다.
    • worker_connection도 늘려줘야한다.
    • worker_connections는 결국 client 와 server간의 역할을 담당하기 때문에 양을 늘려줘야 한다.

반응형
반응형

굿닥 AWS 전환사례

굿닥의 Pain Point

  • 사내 서버 운영 관점에서 → 장애 상황에 대한 대응이 어려움
  • 비즈니스 요구사항에 맞춰서 개발하다보니 → 언어 5개, 서버 1000+a, db 30+a
  • 5000여개의 병원 클라이언트에게 보장가능한 신뢰성이 떨어질 염려가 있음
  • 예측할 수 없는 트래픽 급등의 대해서 대처가 좀 힘들었음
    • 월 200(MAU)
    • 코로나로인한 비정기적인 트래픽급증의 준비가 미흡했음

어떻게 수정했어야 했나?

  • Container
    • 언어 및 Framework에 종속적이지 않음
    • Runtime 시점에만 Container가 구동됨
  • 만약? Container가 아주 많아지게 된다면?

- 규모가 커질수록 Container Cluster 환경을 구성하기에는 어렵다.
- Container 자체를 어떤 인스턴스에? 어떤 전략으로? 배치하는 방법이 필요하다.
- 시스템의 모든 상태를 알아야 한다.

AWS Container Orchestration

  • 두 서비스의 공통점
    • Control plane을 AWS에서 직접 관리한다
    • Data Plane 모두 AWS에서 관리하기 때문에, 편하게 인프라를 관리한다
    • image Registry는 Docker hub / ECR을 사용한다.
  • ECS
    • control-plane : ecs-agent
  • EKS (굿닥은 이걸 사용함)
    • control-plane : kubelet
    • open source의 kubernets를 관리하지않는다 → 직접 구성 X
    • aws는 4개의 kubernetes minor 버전을 지원 → upgrade 버전까지 시간을 충분히 줌
    • control-plane의 보안, 확장성을 제공 → 가장 어려움

굿닥 + EKS 여정

  • 배포, 모니터링, Convention 등 여러 언어와 프레임워크를 대응하기에는 어려웠음
  • Service Oriendted Architecture (2022) ⇒ 개별 서비스에 집중하는 아키텍처 스타일
    • 재사용 가능한 모듈을 서비스 별로 만들어서 → 비즈니스에 맞게 → 서비스 모듈을 키워나감
    • 1개의 DB, 1개의 언어, 1개의 Framework로 통일을 진행
    • 동작방식
      1. ALB Ingress에서 트래픽 분산
      2. Auto Scaling을 통해서 Container 수 조절 → 처리
      3. EKS Cluster → Container Orchestraion을 처리
      4. 각각의 Endpoint에서 해당 로직을 처리
      5. Database (Amazon Aurora MYSQL) 복구 기능 추가
    • 이를 통해 얻은점
      • 관리 리소스 절감 → 파편화 되었던 리소스를 줄였음
      • 모니터링이 더 수월함
      • Convention 통일을 통해서 복잡성 감소
    • 한계점
      • 배포 주기가 길어짐
      • 하나의 DB에서 모든 서버가 의존

  • Micro Service Architecture (2023) → 마이크로 서비스 도입
    • 하나의 Context안에 Service + DB를 묶어준 후 → Gateway로 통신
    • 각각의 서비스는 독립적으로 운용 + 배포 ⇒ Agility를 높일 수 있음
    • 각각의 서버와 DB를 운영하기 때문에 → 각각의 팀이 존재
    • endpoint 와 ec2 안에 gateway만 생김

AWS Data Lake 구축하기

어떻게 적재할 것인가?

  1. 각각의 데이터가 Bronze Data로 Ingestion 되기 위해선 format이 다 다르다.
  2. 각각원하는 형태가 있고 로그형태가 다르다..



  • S3로 적재한다
  • AWS내의 Data Engineering은 S3에서 시작해서 S3에서 끝난다고 할 수 있다.
  • Athena를 통해서 SQL 질의도 가능하다
  • QuickSight를 통해서 의사결정의 대한 BI를 구축할 수 있다.

Easy DataLake Architecture



  • 고객행동로그 → WebServer
  • Transaction Data → Database
  • 유저 행동로그 → GA
  • 외부 데이터 → Google Spread Sheet

S3 + Glue Cralwer + Athena



  • S3 → Glue → Athena
  • S3 서비스를 통해서 만든 저장소 ( Data Lake )
  • Athena는 Serverless Query Service
  • S3 데이터가 많기때문에 Partitioning이 되야한다.

Webserver Pipeline



  • WebServer는 Kinesis Firehoes를 사용하여 Data Pipeline을 구축할 수 있다.
  • 대용량의 트래픽이 발생할 경우 Kiensis Firehoes 만으로는 힘듬 (Buffer가 있으나 대용량은 벅참 + Kinesis Data Stream 함께 써야 함)
  • Kinesis Firehoes를 사용해서, Data Format도 가능하다.
  • Webserver에서는 Kinesis Agent를 설치할 수 있음
  • Kinesis 에이전트를 사용하여 Kinesis Data Firehose에 쓰기 - Amazon Kinesis Data Firehose
  • Kinesis DataStream Shard 2개면 왠만한 양은 버틸 수 있음
    • 하루 25,000,000 양의 데이터
    • Kinesis DataStream shard * 2
    • Kinesis Firehoes
    • 200$ 남짓

Database Pipeline



  • 고객의 OLTP 데이터를 수집하는 방법
  • DB Data Pipeline Architecture는 여러가지 방법이 존재
    • (실시간) DML 관련된 데이터를 수집하기 위해서는 → AWS DMS + Hudi or Iceberg
    • (배치) AWS Glue Job을 사용해서 하루 1회 Batch 할 수 있음
    • 실시간에 가까워질수록 운영이 어려움
  • 빠르게 분석환경을 도입하기 위해선 Lambda Connector를 사용한다면, Direct로 DB데이터를 조회 가능
  • 만약, DB 데이터가 대용량이라면 부하가 발생할 여지가 존재 → 대용량이면 이러한 architecture는 별로임..
  • Lambda Connector는 Athena 서비스를 통해서 만들 수 있음

GA Pipeline



  • GA는 행동기반 로그에 가깝다
  • 실질적인 데이터를 얻기 위해서는 OLTP 데이터랑 합쳐서 봐야한다.
  • AWS Glue Connect는 다양한 소스와 연결이 가능하다.
  • Bigquery에서에 데이터를 S3 데이터로 옮겨올수 있다.

BI (데이터 시각화)

 

  • QuickSight
  • Personalize
반응형
반응형

개요

  • 테라폼에 대한 나의 견해
  • 효율적인 Terraform Architecture
  • Terraform을 효율적으로 사용하는 방법 (나만의 생각)

테라폼에 대한 나의 견해


Terraform은 만능이다?

테라폼이 만능은 아니다. 

테라폼 외 여러가지 IaC 툴이 존재한다. 나도 모든 툴을 깊게 사용해본것은 아니지만 몇몇 프로젝트에서 사용해봤다.

여러가지 툴을 사용해보면서 경험해본 결과 그나마 테라폼이 내가 생각했던 모든 부분을 충족하는 것 같다.

사용해본 결과는 아래와 같다.

 

  구문을 이해하기 쉬운가? 헙업하기 쉬운가? Code Standard 규칙이 Strict 한가? 개발하기 편한가? (멱등성, Plan, State)
CloudFormation X X O X
AWS CDK O O O X
aws-sdk 활용  X X X O
Terraform O O O O

 

어쩌면 Terraform 편파적일 수는 있지만 이유는 이렇다.

Assembly급의 CloudFormation

내가 생각했을때는 CloudFormation은 IaC 중 Assembly 급인것같다.

알아보기도 쉽지않고, yaml 코드 인것같기도 하고 뭔가 코드 문맥을 이해하기도 어렵다 (물론, 계속 보고있으면... 쉬울지도)

기본적으로 CloudFormation 내 규칙이 완벽하게 존재하지만, 협업하거나 긴 구문을 이해하는것은 특히나 너무 어렵다.

CloudFormation

자유롭고 쉬운만큼 개발의존성이 높은 AWS CDK

AWS CDK는 정말 좋은 Tool 이라고 생각한다.

물론 AWS CDK 는 CloudFormation을 한번더 추상화한 모델이고 이를 좀더 편하게 사용하기 위한 방법을 제공한다

하지만 보통 이런 툴 자체는 근본적인 문제가 존재한다. 보통의 개발자 / 회사라면 자체내에서 사용하는 언어 및 Standard Rule이 존재하게된다. 

 

그러한 규칙을 하나하나 지키면서 AWS CDK를 사용하는 순간, 좀더 어려워지고 관리하기가 버거워진다.

인프라가 올라가면 개발 난이도도 올라가는것처럼 변하게 된다. 물론 이 부분도 효율적으로 코드리뷰 하면서 관리하면 좋지만....

실제로 개발하다보면 지켜지지 못하고 그렇게 된다면 레거시가 되는건 금방이다...

AWS CDK

 

변태들을 위한 AWS-SDK 라이브러리를 위한 인프라 구성

여긴... 솔직히 변태적인 부분이긴 하지만 몇몇회사에서는 AWS-SDK 라이브러리를 활용해서 한다고 들었다.

뭐 어떻게 구성하냐에 따라 더 효율적인 부분도 있겠지만 굳이... 일까 쉽다. 

물론 AWS-SDK 도 CDK 처럼 Code Standard 문제가 있을 수 있다. 어쩌면 CDK 보다 더 빡셀수도 있겠다.

AWS SDK

 

테라폼은 만능이다2 ?

물론, 테라폼도 여러 단점들도 존재한다.

  1. 테라폼 언어를 배워야 하며...
  2. 테라폼 특유의 syntax를 이해해야 하며...
  3. state 관리 및 provider에 골머리를 앓을 수 있으며...
  4. 에러가 날때, 가끔 잘 안알려줄 수 있다는...

4가지 외 여러가지 단점이 존재할 수는 있지만, Devops Engineer 입장에서 사용 및 회사 인원들과 협업하기에는 좋은 언어라고 생각한다.

내가 생각한 장점은 아래와 같다

  1. 테라폼 특유의 규칙이 존재 -> 해당 규칙만 따르면 됨
  2. state 관리할 수 있음 -> 버저닝형태로 관리할 수 있으며, 인프가 구성실수에 있어서 빠르게 대처할 수 있음
  3. 인프라 Provisioning 이 다른 tool 보다 빠르다 -> 구체적인 실행속도는 추후 비교해볼수 있으나, 기본적으로 빠름
  4. 테라폼에 친화적인 Open Source가 많음

 

결론적으로...

테라폼이 IaC Tool 중 만능은 아니지만, 위에 기재된 이유로 개인 / 회사에서 쓰기에는 제일 적합한 도구라고 생각한다

( 물론, 다른 도구도 어떻게 쓰이냐에 따라 다를 수 있음 )

 

효율적인 Terraform Architecture


 

로컬에서 Cloud로...

보통 테라폼 언어와 명령어를 익히면 로컬에서 대부분 작업을 하게 된다.

이때 provider를 기재하는 여러가지 방법이 존재한다.

Profile을 활용
Access / Secret Key 활용

 

이렇듯 하다보면 .tfstate 파일은 로컬에 남게된다. 

tfstate 파일에 대해서는 깊게 설명하지는 않겠지만 현재 인프라에 상태를 기록하는 파일이다.

만약, 이런 파일이 없어지게 된다면? -> 생각만 해도 악몽이다. 

그렇기 때문에 tfstate 파일을 cloud에 올려서 관리하게 된다.

S3 Backend 코드

 

Backend Block에 S3 Path에 state 파일을 기재해서 관리한다.

물론 동시성 문제로 Lock 옵션에 대해 DynamoDB 를 추가할 수도 있고,

S3 대신 Terraform Cloud 아니면 Atlantis 를 사용할 수도 있다. ( OpenSource는 나중에 쓰는걸로... )

 

협업을 어떻게 효율적으로 구성할 것인가?

 

이제 State 문제도 해결되었고, 보통에 3~4명에 협업을 하는 구조라면 IaC 코드를 Git 같은 VCS로 관리하게 될것이다.

VCS로 관리를 하면서도 여러가지 문제가 발생할 수 있다. 

왜냐면 아직 state 파일 자체는 S3를 사용하지만 테라폼 실행은 본인이 하기 때문이다.

내가 아주 좋아하는 명언이 있다. ( 좀 딕션이 강하지만.... 의미만 )

휴먼이슈의 대한 고민

휴먼이슈는 어딜가나 생긴다. 

그럼 협업 포인트에 앞서 이 휴먼이슈를 어떻게 줄여야 할까?

내가 찾은 답은 Terraform Cloud를 활용하여 Plan / Apply 및 프로젝트에 대한 권한을 나눌 필요가 있다고 생각하였다.

( 물론 이 문제를 고려하는 집단이라면, 어느정도 인프라가 규모가 있다는 전제하임 ... )

 

terraform cloud를 활용한 인프라 구성

 

테라폼 클라우드를 사용함으로써 아래와 같은 문제가 해결된다.

  1. private variables 관리
  2. state 를 s3 -> terraform cloud 로도 관리할 수 있음
  3. terraform 실행에 대한 관리 전담
  4. 각 workspace / task 별로 브랜치 및 tag 배포와같은 협업 규칙 확립 가능

뭔가 좀더 나이스 해지지 않나?

물론 Terraform cloud는 부분유료 서비스다. 유료로 사용한다면... 정말 많은 기능을 사용할 수 있지만

우리회사도 아직은 Standard 로 사용하고 있다. ( 만약 회사 관계자 분들이라면 Plus 계약하라는 MSP 분들에 상술에 당하지 않도록...)

 

모듈화 의 대한 고민

Terraform Free / Standard Plan으로도 위에 장점을 어느정도 활용할 수 있다.

그럼이제 고도화된 문제의 대해서 한번 고민을 해볼 차례이다.

  • 인프라 구성시 좀더 효율적으로 빠르게 만들수는 없을까?
  • 공통된 정책에 따라서 인프라를 구성할 수는 없을까?

테라폼으로 몇몇 부분의 작업들을 효율적으로 구성했지만, 이제는 그로인한 피로 포인트를 줄여야할 때이다.

해답은 Module 이다

 

모듈을 어떻게 구성하고 활용하냐에 글은 정말 많고 다양하다.

하지만 내가 생각하는 모듈화의 규칙은 아래와 같다.

  1. 모듈은 의존성은 최소한으로 기재한다
  2. 모듈을 구성할때 README.md 정도는 어느정도 자세하게 기재하자
  3. 모듈을 사용하는 사람입장에서 생각하자

위 3가지 포인트를 어느정도 쉽게 설명을 해보자면...

 

모듈은 의존성은 최소한으로 기재한다

보통 모듈을 만들다 보면, 모든 리소스를 다 때려박는 더러 존재한다.

예를들면, Computing 모듈을 만든다고 했을때 VPC, EC2, SG, ALB 한번에 끝내려고 한다.

물론 이렇게 해놓으면 편하지만...

 

개발 및 구성을 하다보면 여러가지 문제에 직면한다 

세부구성을 바꿔야 한다던지, 모듈중 필요없는 리소스를 지워야 한다던지 

그때마다 모듈의 코드를 수정하고 기재하다보면 아래과 같이 고통이 늘어간다...

버전증가 악몽

정답은 없지만, 

현재 본인 / 회사의 인프라 구성을 파악한 후, 뭔가 계속적으로 바뀌는 부분과 Static 하게 남아있는 부분을 인지하고

서로의 의존성을 최소한으로 구성할 수 있도록 확인해야 한다.

 

모듈을 구성할때는 README.md 정도는 어느정도 자세하게 기록하자

나는 테라폼을 잘 사용한다고 생각한다.

회사에서 모듈도 내가 만들고, 팀원분들께 모듈에 대해서 리뷰하고 사용한다.

근데... 내가 놓친 것이 하나있었다

 

팀원분들도 테라폼을 잘 사용하다고 생각하면 안된다는 것이다.

개인 역량일수도 있고, 공부하기 귀찮을 수도 있고, 그냥 어려울수도 있고 여러가지 이유들로 테라폼의 활용능력은 천차만별이다.

 

그럼 테라폼도 잘 사용하지 못하는 사람에게 terraform module을 리뷰한들, 소귀에 경읽기 일 것이다.

그렇다면 잘 사용하길 바란다는 마음으로 README.md 라도 잘 작성하는 예쁜 마음을 지녀보자...

다행히 테라폼에서는 terraform docs을 제공한다.

## terraform-docs 설치
brew install terraform-docs

## 현재의 모듈이 있는곳에서 진행
terraform-docs markdown table \
    --output-file README.md \
    --output-mode inject \
    .

 

모듈을 사용하는 사람입장에서 생각하자

사실 이 부분은 내가 제일 중요하게 생각한다.

보통 Backend 개발을 했었던 사람이라면 아래와 같은 그림에 대해서 익숙할 것이다.

개발론적인 얘기를 조금 한다면,

보통 Contoller Layer 에서 Repository Layer로 갈수록 비즈니스 로직을 수반하게 되고, 그럴수록 점점 

코드나 로직이 구체화되게 된다.

 

이런 구조에서 Controller / Service Layer 내에서는 구체화된 메서드를 활용함에 있어서 이슈가 없어야 한다는 얘기다

그래서 뭐... 대학생때 Solid 원칙이니... 고차함수를 이용해서 파라미터 전달하거나.. 뭐 여러가지 배우는데 

 

테라폼을 사용할때도 똑같다고 생각한다.

테라폼 모듈은 어떻게 보면 비즈니스 모델이라고 생각한다면...

그걸 사용하는 사람은 해당 모듈을 사용함에 있어서 큰 문제가 없어야 한다.

 

참고 (Terraform module)

https://github.com/zkfmapf123/terraform-donggyu-lambda

 

GitHub - zkfmapf123/terraform-donggyu-lambda: terraform lambda template

terraform lambda template. Contribute to zkfmapf123/terraform-donggyu-lambda development by creating an account on GitHub.

github.com

https://github.com/zkfmapf123/terraform-donggyu-ecs-fargate

 

GitHub - zkfmapf123/terraform-donggyu-ecs-fargate: ecs-fargate module

ecs-fargate module . Contribute to zkfmapf123/terraform-donggyu-ecs-fargate development by creating an account on GitHub.

github.com

https://github.com/zkfmapf123/terraform-donggyu-alb

 

GitHub - zkfmapf123/terraform-donggyu-alb: terraform alb module

terraform alb module. Contribute to zkfmapf123/terraform-donggyu-alb development by creating an account on GitHub.

github.com

 

Terraform을 효율적으로 사용하는 방법 (나만의 생각)


한번 더 추상화?

 

위에 여러가지 기재했지만, 테라폼은 장점이 많고 IaC 도구이다.

그리고 OpenSouce를 어떻게 사용하냐에 따라 더 효율적으로 구성할 수 있다.

 

하지만 최근 어떠한 고민으로 인해 테라폼을 효율적으로 사용하는 방법에 대해서 다시한번 고민해보게 되었다.

개발팀 : 저도 테라폼 활용해서 인프라 배포해고 싶어요

나 : 아 그래요? 테라폼 사용해보신 적 있나요?

개발팀 : 아뇨... 많이 어렵나요?

나 : 아뇨. 그렇게 어렵진 않습니다 (장 / 단점 설명 ...)

나 : 모듈은 이미 만들어 놨으니 한번 만들어 보시죠

개발팀 : 이거 md 파일로도 이해가 잘 안됩니다.

나 : 설명중...

개발팀 : 이거 variables 어떻게 작성해야 되요?

나 : 설명중...

개발팀 : 이거 어떤 값을 넣어야 해요?

나 : 설명중...

개발팀 : 이거 실행은...

나 : 설명중...

개발팀 : ㅠㅠ

 

사실 내가 울고싶다.

생각해보면 간단한 문제였다. 진짜 테라폼을 모르는사람은 모듈을 잘 구성했던, md파일을 잘 구성했던...

모르는건 모르는거다.

 

그럼 이 문제를 어떻게 고려해봐야할까?

그 과정에서 아래와같은 도구를 봤다.

https://aws.github.io/copilot-cli/

 

AWS Copilot CLI

Networking Service discovery is setup by default for your services to connect to each other.

aws.github.io

 

aws copilot cli를 보면 결국 cloudformation을 한번더 golang으로 추상화하였다.

cloud-formation을 왜 사용하니, 별로니 이 문제를 삼기보다 해당 도구를 사용하는 방법은 꽤나 충격이었다.

 

yaml code 내에서, 정해진 규칙에 따라 기재한다면 인프라를 구성할 수 있었다.

어쩌면 테라폼 모듈에 대해서 variables로 잘 감싼다고 해서 모든 사람들이 쉽게 사용할 수 있을까? 는 내 욕심일 수 도 있다.

 

그래서 여기서 말하고 싶은 바는, 

결국 테라폼도 인프라를 구성하는 하나의 언어이고...

그런 테라폼을 한번더 추상화하는 모델을 만든다면...

 

실제로 사용하는 사람은 테라폼을 아무것도 모르지만 잘 활용할 수 있는 방법이 있을까?

이 물음에서 아래와 같은 실험과도 같은 프로젝트가 시작되었다.

  • 프로젝트 이름 : Common Management Tool
  • 설명 : AWS / DB 유저 관리에 대해서 테라폼으로 관리
  • 관리 목록
    • AWS SSO (Identity Center) - User / Role / Policy
    • MongoDB
    • MYSQL / PostgreSQL
    • Terraform Cloud User / Team Management

Architecture는 아래와 같다.

 

즉, 하나의 파일을 활용해서 모든 인프라 구성에 유저 생성 / 권한 변경을 한번에 해결하는 구성이다.

파일 내용은 아래와 같다.

dobby:
  display_name: dobby lee
  email: zkfmapf999@gmail.com
  given_name: dobby
  family_name: lee
  group: admin
  role:
    shared:
      - administrator
      - security
      - data-admin
      - data-writer
      - data-viewer
      - developer-squad
      - developer-service
      - resource-reader
      - zent-sso
    dev:
      - administrator
      - security
      - data-admin
      - data-writer
      - data-viewer
      - developer-squad
      - developer-service
      - resource-reader
      - zent-sso
    prd:
      - administrator
    antman:
      - administrator
    data:
      - administrator
    lab:
      - administrator
    alpha:
      - administrator
  db:
    prd-rds-cluster:
      - ADMIN
  mongodb:
    dev-mongo:
      - admin
    prd-cluster:
      - admin
    rnd-cluster:
      - admin

 

이 구성에서 핵심은 yaml 파일내에 기재된 옵션을 어떻게 parsing 해서 테라폼으로 활용하냐 인것같다.

해당 형태를 통해서 아래와 같은 부분이 해결되었다.

 

  • 장점
    • 유저 권한 변경 / 생성 관리 용이
    • 신규 입사자 및 퇴사자 관리 용이
    • Team / Chapter 마다 동일한 규칙 명명
  • 단점
    • 테라폼 코드 어려워짐 (yaml -> decode -> terraform)
    • yaml 을 어려워하는 사람도 더러 존재함

 

자세한 부분은 추후 기재...

반응형
반응형

요구사항

  1. DataBricks Control Plane 은 Private link를 활용하여 내부망에서 연결을 진행해야 함
  2. VPC 내에서는 VPC Peering을 활용하셔 내부망 통신을 주로 해야 함
  3. NACL, SG를 구성하여 기본적인 네트워크 보안정책을 수립해야 함
  4. S3, STS, KinesisStream의 Endpoint를 사용해야 함

 

VPC 구성

  • VPC Peering은 크게 3 tier 형태로 구성한다 ( public, private, private link)
  • public subnet 부분은 말 그대로 외부 네트워크와 통신하는 구간이다 (NAT)
  • private subnet 부분은 databricks에 worker-node들이 구성되는 공간이다 (workspace-zone)
  • private link subnet 부분은 databricks control plane 과 연결되는 공간이다

Endpoint 구성

  • S3, STS, Kinesis Stream 3개로 구성된다
  • S3의 경우 Gateway endpoint 이기 때문에 RouteTable만 구성한다.
  • STS, Kinesis Stream은 Interface Enpoint 이기 때문에 Subnet과 SG를 지정해줘야 한다
    • Private Subnet / Private link Subnet
    • workspace-sg, private-link-sg

Workspace-sg / Private-link-sg

  • workspace-sg는 말 그대로 databrick에 worker 노드들의 통신을 맡기때문에 그에 맞게 inbound / outbound 설정을 진행하면 된다.
  • private-link-sg는 databricks control plane 내 통신을 진행할 수 있게금 설정하면 된다.
Inbound / outBound 규칙 허용 cidr / sg
Inbound 모든 TCP self (자기 자신)
Inbound 모든 UDP self (자기 자신)
outBound 모든 TCP self (자기 자신)
outBound 모든 UDP self (자기 자신)
outBound 6666 0.0.0.0/0
outBound 8431-8451 0.0.0.0/0
outBound 3306 or 5432 MYSQL or PostgreSQL

 

Private link 구성

  • private-link 부분은 databricks control plane에 통신을 내부망에서 처리해야 한다.
  • endpoint 서비스에서 2가지를 선택해서 진행한다 (데이터브릭스 홈페이지 참조)
  • workspace-vpce (private-link-subnet, private-link-sg)
  • scc-vpce (private-link-subnet, private-link-sg)외부통신 1) VPC Peering

 

후기

  • DataEngineer + DataBricks 내부 SA 분들과 같이 네트워크 구성 같이 진행
  • 역시... 네트워크 라는거는 쉽지 않다는 것을 느낌
  • Private link는 이번에 처음 사용해봤는데 확실히 직접 구현하니 확 와닿음
  • 계속 공부하면서 현재의 감을 잃지 않기위해 노력해야 할듯함...

 

참조

https://docs.databricks.com/en/security/network/classic/privatelink.html

 

Databricks documentation

 

docs.databricks.com

 

 

 

반응형
반응형

Devops Team Lead 가 되었다.


2024년 3월에 새로운 회사에 입사하게 되었다.

세금 환급 관련된 B2C SaaS를 제공하는 FinTech 회사다.

기존 팀장님이 퇴사를 하게 되었고, 내가 그 자리를 대신하게 되었다....

 

팀장이란 직책을 맡기 전 까지는 "이 팀을 한번 제대로 이끌어 보리라" 하는 열정이 있었다

하지만 그 열정은 오래 가지 않았다.

 


업무를 할 수가 없다.

팀원이었을때는 업무를 정의하고 그 업무를 진행한 다음 보고하고 집에 가면 끝났었다.

근데... 뭔 놈의 회의가 많은 건지

 

인프라 회의, Devops 회의... 업무를 하기전에 진이 다 빠져버린다.

회의 횟수야 회사마다 차이가 있겠지만 너무 많은 것 같다 (회사가 이상한 건지...)

 

그리고 이전에도 나름 업무를 하기 전에 문서로 시작해서 문서로 끝낸다는 생각에, 나름 문서를 잘 정리한다고 생각했다.

근데....

 

이젠 팀 자체 문서를 써야 하네?

OKR 문서부터 팀 목표, 개인 평가 문서부터 쓸게 산더미였다.

 


모두 나와 같기를 바라면 안 된다.

몇 개의 회사를 다니면서 업무를 못한다는 얘기는 아직 들어본 적이 없다.

최대한 업무를 찾고 그 업무를 정해진 기간에 완료한 후 보고하였다. 나는... 항상 그래왔다. 

어쩌면 야근하고 끝날 때까지 업무하고 좀 멍청하고 끈질기게 일을 해왔던 것 같다.

 

하지만 나 이외 다른 사람들은 그렇게 하지 않는다라는 것을 느꼈다. 또한...

팀원들의 개개인 능력도 모두 다르다는 것도 다시 한번 느꼈다 (많이 느낌)

나는 쉽다고 생각하지만, 그 외 인원은 쉽지 않을 수 있다는 것들.. 그 반대도 동일

너무 느껴버려서 흐느낄 뻔

 

현재 내 팀원분들은 그렇게 많지 않지만, 각자가 잘하는 역할을 정의해서

업무를 부여하려고 노력하는 편이다. 하지만... 쉽지는 않다

 


업무를 정의할 때는 일목요연하게 정리를 해야 한다

업무를 전달할 때 어느 정도 간단한 Jira Task를 정의해서 업무를 주는 게 맞다고 생각했다.

하지만 팀원 중 한 분은 생각이 달랐다.

 

k : 업무 주실 때 실제 가능한 업무를 주셨으면 좋겠다.

나 :  업무의 가능성 여부는 본인이 판단해서 안된다고 생각하면 다시 말씀해 주실 수 있는 거 아닌지?

k : 그런 부분에 시간을 뺏기는 게 싫다.

나 : 그럼 제가 업무가 가능한지 여부와 자세한 부분까지 기재해서 드리면 업무를 할 수 있는 건지?

k : OK 

 

위 대화만 보면 K 가 이상할 수 있지만, 오역을 많이 했을 수 있다. 대략적으로는 저렇다.

근데 K를 뭐라 할 수는 없다. 나는 최대한 팀원들과 대화를 많이 할 예정이다.

그렇기 때문에 앞으로 업무를 드릴 때는 가능한 검증정도는 직접 진행해 볼 예정이다.

 


팀원의 실수는 나의 책임

아... 난 진짜 잘못한 게 없는데, 모든 사람들이 나를 찾는다.

 

"Build 에러 나요"

"배포가 안돼요!!"

"키 등록이 이상해요"

"개발일정 왜 안 맞춰 주는 건지?"

...

 

초반에는 (아직도 초반이지만...) DM으로 굉장히 문의가 많이 온다.

일단은 해당 이슈를 초래한 팀원분들에게는 따로 말씀드리지는 않는다 (말하지 않는 것은 내 잘못)

하지만 추후에는 해당 이슈를 하나하나 모아서 팀원분들께 피드백을 드릴 예정이다.

 

나는 딱히 저런 걸로는 멘털이 흔들리지 않는다고 생각했지만,

꽤 많이 오니까.. 조금 흔들리네?

 


나의 문제점

물론 나한테도 문제점이 많다고 생각한다.

아래 내용은 내가 팀장이 되고 난 후 반성 하는 점이다.

 

쓴소리를 못함

사실 이게 제일 큰데, 쓴소리를 못한다

그로 인해 업무 피드백이나 다른 팀에서 이상한 업무에 대해서 나서서 얘기하는 것이 좀 부담스럽다.

물론 나도 나서서 큰소리 내고 싶지만!!!!!!

아... 쉽지가 않다 이건 천천히 고쳐보자...

 

 

업무 일정 계산의 능력 부족

혼자 업무를 진행할 때는 나만 생각하면 되니까 일정 계산이 완벽했다.

하지만 나도 회의나 문서를 쓰는 시간 + 팀원들 업무 파악 / 진행 과정까지 고려하다 보면 -> 업무일정이 엄청 밀린다

물론, 현재 회사가 일정으로 Push를 따로 하지는 않지만, 언젠가는 이게 팀 / 개인에게 큰 영향이 갈 것 같다.

해당 문제는 나의 문제점을 (쓴소리를 못함)을 고치면서 피드백을 열심히 줘야 할 문제일 것 같다 (물론 나에게도)

 

업무욕심으로 인한 배분이 잘 안 됨

사실 나는 업무 욕심이 굉장히 많은 편이다.

그래서 업무를 할 때 2분기 미래까지 고려해서 업무계획을 짜서 자체 Queue에 적재한 후 하나씩 처리하는 편이다.

하지만 그로 인해 초반 팀원분들에게 업무를 고루 배분하지 못했다.

이건 순전히 내문제인 것 같다. 현재는 매주 1시간씩 나의 계획이나 이렇게 진행하고 싶다를 말하는 편이다.

물론 말한다고 해서 공감해 달라는 건 아니지만, 그 이후 업무 배분은 현재 나름 잘 이뤄지는 것 같다. (... 아 근데 일정 계속 밀림)

 


.....

현재 팀장 된 지가 4개월쯤 되는데 해당 기간만 보면 진짜 팀장 내려놔도 될 정도임...

일단 여러 개 하다 보니 실수가 너무 많아진 게 엄청 크다....

다음 글을 쓸 때까지 팀장직을 유지할 수 있을까? 노력을 많이 해야 될 것 같다.

 

 

 

 

반응형
반응형
  • 네트워크의 분류
  • 계층화가 필요한 이유? (TCP/IP 5계층)

1. 네트워크의 분류

그렇다면 네트워크의 분류를 알아보자!

네트워크는 지역 및 얼마나 퍼지냐에 의해 분류된다. (규모)

 

  • LAN(Local Area Network) ==> 개인 및 건물 같은 km이내의 거리를 연결한 통신망이다. 
  • MAN(Metropolitan Area Network) ==> 한 도시 및 지역수준의 도시권 통신망
  • WAN(Wide Area Network) ==> 그냥 존나 큼... 국가수준 ex) internet

2. 계층화가 필요한 이유?

교수님이 수업시간에 "계층화가 필요한 이유?" 를 물어보셨는데,

교수님의 말씀하신게 아직도 기억에 남는다..

굉장히 익숙한 그림인데, 여기서보면 사람이 말을 할때도 많은 생각을 거치고 거쳐서 결국 입밖으로

말을 내뱉고, 그걸 들은 사람도 그 말을 듣고 생각하기 마련인데......(슬픔)

하여튼 사람과 사람도 대화를 나눌때 생각하고 말하는 것처럼

컴퓨터도 컴퓨터끼리 대화를 할때도 자체적으로 생각을 하는것처럼 계층화가 필요하다고 말씀하셨다.

 

뭐 책을 보면 OSI 7계층이 대부분 나오는데,

요즘에는 TCP/IP 5계층으로 많이 본다고 해서 TCP/IP 5계층으로 설명을 하려한다.

(그림은 따로 안그림 귀찮음)

 

  • 응용계층

응용계층은 기본적인 protocol을 즉 규칙을 정의해주는곳이다.

응용계층에는 HTTP(WWW 서비스제공), TALNET(원격지 접속), SMTP(전자우편), FTP(파일송신규칙) 등과같은 규칙들을 정의해준다. 

 

  • 수송계층

수송계층은 프로세스와 프로세스에게 각각 필요한 data를 송수신해주는 역할이다.

프로세스는 현재 실행중인 프로그램인데,

쉽게말하면 내 컴퓨터에서 현재 실행중인 hwp와 카카오톡이 있는데 수송계층은

이 2개의 각각의 프로세스에게 필요한 data를 할당해주는 역할을 한다.(즉 최종목적지 까지 전달) 

 

  • 네트워크계층

네트워크 계층에서 제일 중요한건 "라우팅" 이라는 것이다.

라우팅이란 송신지에서 수신지까지 data를 전달하는 역할을 뜻한다. (즉 올바른 경로로 도착지까지 인도하는것이다.)

 

즉 가족을 쉽게 예를들어보면,

차(네트워크계층)를 타고 집(도착지)까지 도착을 하면 가족 구성원(data) 모두 각각의 방(process)으로 들어간다.

여기서 가족구성원모두 각각의 방으로 들어가는것은 ==> 수송계층이 담당한다.

 

  • 데이터링크계층

데이터링크계층은 내가 네트워크 공부하다가 참 많이 나오는 놈인데, 골치아픔

하여튼 데이터링크계층은 여러가지 일을 하는 바쁜놈인데,

  1. 에러검출 및 정정
  2. 데이터의 흐름을 제어한다 ( ex) "야... 좀 천천히 보내.. 나 아직 이거 안보냈어..")
  3. 접근을 제어한다. ( ex) "야 data가 한쪽으로 몰린다. 이러다 큰일난다 분산시켜 어서")
  • 물리계층

물리계층은 장치의 연결의 물리적부분인데, 즉 물리적인 부분과 맞닿는 부분이다.

역할은 data를 신호로 바꾸고

신호를 data로 바꿔는 역할을 한다.

 

# 틀린거나 고칠거 있으면 댓글좀

 

 

반응형

'웹 공부 > 네트워크' 카테고리의 다른 글

1. 네트워크란?  (0) 2020.03.01

+ Recent posts