[TIL 30일자] 데브코스 데이터엔지니어링

·2023년 5월 20일
0

데브코스

목록 보기
29/55
post-thumbnail

📚 오늘 공부한 내용

1. AWS Lambda

  • 다른 인스턴스 위에서 프로그램이 돌아가는 게 아니라 다른 환경 없이 내가 만든 소스 코드, 함수만 등록해서 서버가 서비스를 할 수 있게 만들어 주는 것이 AWS Lambda이다.
  • 함수 생성 시 다음과 같이 세 개의 생성 유형을 고르게 된다.
  • 블루 프린트를 사용하면 간단한 예시 코드가 나오게 된다.
console.log('Loading function');

exports.handler = async (event, context) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    return event.key1;  // Echo back the first key value
    // throw new Error('Something went wrong');
};
  • 이렇게 생성된 함수는 상세에서 코드-> Test 버튼을 통해 Test Event를 작성할 수 있게 된다. Deploy를 누르게 되면 코드를 사용할 수 있도록 배포된
  • lambda의 경우 트리거 설정이 가능한데 만약 S3에 설정을 하고 싶다면 S3 해당 버킷에서 이벤트 알림 -> 이벤트 알림 생성을 선택한다. 이후 이벤트 유형에서 객체 생성 타입을 선택해야 하는데 해당 이벤트는 전송, 개시, 복사, 멀티파트 업로드 완료가 있다. 선택한 이벤트가 발생할 때 하단의 대상에서 선택한 lambda 함수를 같이 실행되도록 만들어 줄 수 있다.
  • 함수 개요를 보면 다음과 같이 S3 이벤트 발생 시 s3-lambda-test-01가 실행되는 것을 알 수 있다.
  • 실행 내역은 **CloudWatch -> 로그 그룹을 통해 볼 수 있다.

2. Docker

1) Docker의 시작

  • 가상화는 한 대의 PC에 논리적으로 공간을 분리해 여러 개의 서비스를 띄울 수 있게 만든 기술이다. Hypervisor라는 기술을 통해 하나의 OS에서 여러 개의 OS를 설치할 수도 있고, 여러 개의 애플리케이션을 별도의 공간에 설치**할 수도 있다.
  • 다만 해당 기술은 용량적으로 무거운 부분이 있어서 서비스를 하기에는 운영적 측면에서 어려움이 있었다.
  • 그래서 나온 기술이 Linux에서 Container를 제어하는 LXC(LinuX Containers) 기술인데 이 기술을 기반으로 Docker가 나오게 됐다.
  • Docker가 굉장히 많은 컨테이너를 키울 수 있는데 이런 경우 복잡도가 높아져 Kubernetes Deployment(쿠버네티스)를 사용하고 있다.

2) Docker란?

(사진 출처: https://smjeon.dev/etc/docker-overview/)

  • Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 플랫폼으로 소프트웨어컨테이너라는 표준화된 유닛으로 패키징한다.
  • 배포되는 코드만이 아니라 가상화된 독립된 환경까지 배포할 수 있다는 것이 Docker의 주 기능이다.
  • 즉, 운영 표준화가 될 수 있다.
  • 이미지 (image): 파일 (file)을 빌드해서 이미지화하여 이를 이용해 컨테이너 (Container) 생성한다. 컨테이너 목적에 맞는 여러 개의 계층으로 된 바이너리 파일과 의존성이 설치되어 있다.
  • 컨테이너 (Container): 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스이다. 이미지는 읽기 전용으로 사용해 변경 사항이 컨테이너 계층에 저장되기 때문에 컨테이너에서 무엇을 하든 이미지는 영향을 받지 않는다.

3) Docker Life Cycle

  • git과 명령어가 비슷함. 이미지화 시킬 때는 Docker build라는 명령어를 실행한다.
  • 만약 원격에 내가 만든 이미지를 올릴 때는 Docker push 받을 때는 Docker pull을 사용한다.
  • 그리고 실행 시킬 때는 Docker run을 사용한다.

4) Docker 주요 명령어

1. container 생성 및 실행
run: container 생성 및 실행
stop: container 중지
start: container 실행
restart: container 재실행

2. container 관리
ps: container 확인
rm: container 삭제

3. container 실행 관리
logs: container log 확인
exec: container 명령어 수행

4. image 관리
images: image 확인
rmi: image 삭제
pull: image 다운로드
push: image 업로드
tag: image 태그 지정

5) Docker file

  • Docker를 실행할 때 꼭 필요한 파일이며 파일명은 Dockerfile이라고 설정해야 한다.
#베이스 이미지를 몇 버전으로 할 건지
FROM adoptopenjdk/openjdk11

CMD ["./mvnw", "clean", "package"]

#JAR_FILE_PATH라는 변수에 .jar 파일의 위치를 넣어 준다.
ARG JAR_FILE_PATH = build/libs/config-0.0.1-SNAPSHOT.jar
#해당 .jar 파일의 위치를 copy해 준다.
COPY ${JAR_FILE_PATH} config-0.0.1-SNAPSHOT.jar

ENTRYPOINT ["java", "-jar", "config-0.0.1-SNAPSHOT.jar", "-Dspring.profiles.active-local"]
  • FROM: 이미지를 어디서 시작할 건지 설정한다. (베이스 이미지)

  • COPY : build 중간에 호스트 파일 또는 폴더를 이미지에 가지고 오는 것.

  • CMD: 컨테이너가 생성되었을 때 실행할 실행 파일이나 셀 스크립트

  • ENTRYPOINT: 컨테이너를 시작할 때마다 실행할 실행 파일이나 셀 스크립트.

  • 만약 하나 이상의 Docker 파일을 다루고 싶을 경우 Docker compose를 사용해 주어야 하고 docker-compose.yml 파일이 루트 위치에 있어야 한다.

6) Docker 실행 명령어

docker build -t (애플리케이션 이름):(태그) (docker 파일이 있는 위치)

  • build를 실행하는 명령어이다.
  • 만약 root 위치에서 실행한다면 docker 파일이 있는 위치는 .으로 대체가 가능하다.
  • -t는 태그 옵션을 주는 것이다.

docker images

  • build 이후 생성된 이미지를 보고 싶다면 다음과 같은 명령어를 통해 확인할 수 있다.

docker ps

  • Docker에 실행된 프로세스가 있는지 확인할 수 있다.

docker run -d (애플리케이션 이름):(태그)

  • 이미지를 컨테이너화해서 실행한다고 할 때 사용하는 명령어이다.
  • -d는 백그라운드로 실행될 수 있도록 하는 명령어이다.

docker stop (종료할 컨테이너 ID)

  • 컨테이너에서 작업하고 있는 게 있다면 마무리 후 꺼지는 것이 stop 명령어이다.

docker kill (종료할 컨테이너 ID)

  • 컨테이너에서 작업을 하고 있든 하고 있지 않든 강제 종료하는 명령어이다.

docker-compose up -d

  • docker-compose.yml에 있는 인스턴스들이 모두 실행된다.
  • docker ps를 통해 동일하게 확인 가능하다.

3. CloudWatch

  • 정보를 수집해서 모니터링하고, 그에 대해 특정 인계치를 넘으면 알림을 해 주고, 분석까지 해 주는 서비스이다.
  • CloudWatch의 기능
    • 대시보드 제공
    • 경보 (알림), 장애가 발생했을 때 별도의 서버를 띄우는 작업도 진행 (Auto Scaling)
    • 모든 시스템에 대해 로그 관리 및 분석을 하고, S3를 통해 로그 데이터를 내보내 다른 시스템에 활용 가능
    • 지표 제공
    • 특정 실시간 이벤트에 대해 스트림을 제공
    • CloudWatch 내에서 리소스를 측정하고 진단 가능
    • 분석된 것을 모니터링해서 적정 크기를 찾거나 모니터링을 할 수 있도록 제공 -> 인사이트 제공

4. DevOps

1) DevOps란?

  • 소프트웨어 개발운영의 합성어
  • 소프트웨어 개발자와 정보 기술 전문가 간의 소통, 협업 및 통합을 강조하는 개발 환경이나 문화
  • 보는 관점마다 다르게 해석이 가능
    • 팀이나 기업의 문화가 될 수 있음
    • 자동화를 통해 효율성과 빠른 속도 지향
    • 지표를 측정 및 지속적으로 개선
    • 공유를 통해 함께 발전
    • 기록을 축적해 자산을 만듦

2) Devops의 역할

  • Soft Skill
    - 사회 기술, 의사소통 기술, 성격 또는 성격 특성, 태도, 직업 속성, 소셜 인텔리전스 및 감성 인텔리전스 지수 등의 조합

  • Technical Skill

    • 프로그램: Go, Python능숙하게 다룰 수 있는 언어가 있어야 함
    • 운영체제: Linux와 같은 운영체제를 능숙하게 다루고 개념을 알아야 함
    • 서버 관리: 서버를 관리하는 기술과 운영 지식을 통해 신뢰할 수 있는 서비스 구축
    • 오픈 소스: 인프라를 이루는 소프트웨어를 이해하고 자동화 도구를 다룰 수 있어야 함
    • 클라우드: 퍼블릭 클라우드를 능숙하게 다루고 직접 구축 및 설계할 수 있어야 함

5. MLOps

  • DevOps의 역할에 Data EngineeringMachine Learning이 추가
  • 다음과 같이 일련의 Build, Deploy, Monitor 과정을 자동화하는 역할을 한다.
  • 데이터에 대한 보안과 정책 또한 MLOps의 영역이다.

6. ECR (Amazon Elastic Container Registry)

  • Amazon 페이지에서 바로 접근이 되지 않고 ECS(Amazon Elastic Container Service)를 먼저 검색한 후 좌측에서 선택해 주어야 한다.
  • 이미지를 저장하는 리포지토리를 ECR이라고 하고 ECR에 저장된 이미지를 기반으로 가상화된 서비스를 제공하는 것이 ECS이다.
  • ECR 작업 시에는 권한에 대한 문제가 발생할 수 있으므로 IAM 사용자 정책에서 ECR에 full access 할 수 있는 권한을 부여해 주어야 한다.
  • 다음과 같이 정책을 생성 후 부여해 주어야 한다.
  • 만든 리포지토리에 Docker 이미지 넣기
    - AWS CLI 로그인
    - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 174170816230.dkr.ecr.ap-northeast-2.amazonaws.com
    - login succeeded가 뜬다면 로그인을 성공한 것이다.
    - docker build
    - docker build -t pop-config-server
    - 빌드가 완료된 후 이미지에 태그를 지정한다.
    - docker tag pip-config-server:latest 174170816230.dkr.ecr.ap-northeast-2.amazonaws.com/pip-config-server:latest
    - 이미지 태그까지 완료된 이미지를 리포지토리(ECR)에 푸시해 준다.
    - docker push 74170816230.dkr.ecr.ap-northeast-2.amazonaws.com/pip-config-server:latest

  • 만든 리포지토리를 ECS 서비스와 연동해 주기 위해서는 ECS -> 태스트 정의 및 컨테이너 구성에서 컨테이너 정보이미지 URL리포지토리 주소를 넣어 주어야 한다. 이때 환경은 AWS fargate(서버리스)를 선택해 주면 된다.
  • 이렇게 태스크 정의가 끝났다면 태스크 등록클러스터로 들어가 해 주어야 한다.
  • 만약 이 서비스에 접속해 서비스를 이용하기를 원한다면 별도의 ELB를 구성해야 한다. (직접 접속은 불가능)
  • 대상 등록 시 생성한 ECS를 연결해 주면 된다.

7. Amazon API Gateway

  • Gateway 역할을 할 수 있는 서버리스 서비스이다.
  • Lambda가 들어가는 트리거 역할을 한다.
  • 별도의 서버 구성 없이 간단한 코드를 통해 API를 생성 및 관리가 가능하다.
  • API 유형
    • HTTP API
    • WebSocket API
    • REST API
    • Private REST API
  • API Gateway 생성
    • 유형을 선택하게 되면 다음과 같이 API 생성 화면으로 넘어가게 된다.
    • 만약 예제 API를 사용한다면 예제 API의 소스 코드가 나오며 새 API를 선택하면 새 API를 설정할 수 있도록 다음과 같이 설정 칸이 뜨게 된다.
    • 엔드포인트 유형은 최적화된 에지프라이빗으로 선택할 수 있게 나누어져 있다.
  • 이 생성된 API에는 리소스를 추가해 줄 수 있다. (method들 추가 가능)
  • 리소스에 Lambda 서비스를 추가했다면 다음과 같이 개요에 API Gateway와 연결된 것을 확인할 수 있다.

🔎 어려웠던 내용 & 새로 알게 된 내용

✔ 개인적으로 Docker File의 명령어를 간략하게 설명을 해 주어서 CMDENTRYPOINT는 같은 컨테이너의 실행 시 실행 파일을 호출해 주는 부분인데 차이를 알 수 없어 이 부분을 따로 공부하여 추가하였다.

1. Docker File 명령어

  • CMD
    • 컨테이너가 생성할 때만 실행되는 명령어
    • Docker run
    • Dockerfile에 여러 번 작성될 수 있지만 마지막 명령어 하나만 실행된다. (추가된 명령어가 기존 설정된 명령어를 수정하기 때문에)
#CMD 양식
  CMD ["command", "parameter1", "parameter2"]
  • ENTRYPOINT
    - 컨테이너가 시작할 때마다 실행되는 명령어
    • Docker start
#ENTRYPOINT 양식
  ENTRYPOINT ["command", "parameter1", "parameter2"]
  • LABEL
    • 이미지에 메타 데이터를 추가하는 명령어
    • key-value 형태

  • RUN
    • 명령어를 실행할 때마다 새로운 레이어가 생성
    • 새 레이어에 명령어를 실행하고 새로운 이미지 생성

  • EXPOSE
    - 생성된 이미지를 특정 포트에 열어 주는 명령어
EXPOSE 열어 줄 포트 주소 #(ex. 80)
  • ADD
    • COPY 명령어와 동일하게 build 중간에 호스트의 파일 또는 폴더를 이미지에 가지고 옴
    • 다만 일반 파일뿐 아니라 ADD를 사용하면 압축 파일도 사용할 수 있으므로 특수한 파일을 가지고 올 때 사용

✍ 회고

- 다음 프로젝트 배포 때는 Docker를 활용해 봐야 되겠다고 생각했다. Docker를 통해 배포를 해 보는 프로젝트를 진행하고 싶었는데 Docker에 대해 학습을 많이 해 둔 상태가 아니라 어려움이 있었다. 아직도 Docker를 완전하게 이해했다고 생각하지 않을 뿐더러 Docker에 대해서는 조금 더 공부한 후에 제대로 포스팅을 해 두는 것이 좋을 것 같아 내용은 많지만 TIL에 정리해 두었다.

이건 내가 들을 생각으로 기록해 두는 Docker 강의

📌 생활 코딩 - Docker 입문
📌 Udemy - Docker & Kubernetes : 실전 가이드

- DevOps와 MLOps 강의를 듣다 보니 데이터 엔지니어로서 내가 최종으로 이루고자 생각하는 개발자의 모습은 무엇인지에 대해 계속 생각하게 된다. 그리고 데이터 엔지니어들 방에서 나온 이야기인데 언젠가는 DataOps도 나오지 않을까라는 이야기가 떠올랐다.

profile
송의 개발 LOG

0개의 댓글