1. Docker

  • 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
  • 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있음
  • 같은 코드여도 환경에 매우 의존적 -> 여러 os에 배포할 때 정상적으로 작동하지 않는 경우가 많음
    • 가상화된 독립적인 환경까지 같이 배포하자!

스크린샷 2023-12-10 오전 2 53 43


Docker Image

스크린샷 2023-12-10 오전 2 59 24

  • 이미지
    • 컨테이너를 생성할 때 필요한 요소
    • 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있음
    • 여러 개의 계층으로 된 바이너리 파일로 존재
  • 컨테이너
    • 호스트와 다른 커넽이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
    • 이미지는 읽기 전용으로 사용하여 변경사항은 컨테이너 계층에 저장
    • 컨테이너에서 무엇을 하든 이미지는 영향을 받지 않음

Docker Life Cycle

  • docker file (build) -> 이미지 (pull) -> 컨테이너 (run) -> 이용
  • 이미지는 직접 만들 수도 있고 (push), 도커 허브에서 가져올 (pull) 수도 있음
  • 서버(로컬) - 도커 허브와 연동되어 있음

Docker Network

스크린샷 2023-12-10 오전 10 10 03

  • 호스트와 컨테이너를 포트로 연동해주어야 함 (port forwarding)
  • 호스트에서 띄운 포트로 클라이언트가 접속하여 서비스 실행

Docker 주요 명령어

  • 컨테이너
    • 생성 및 실행 run
    • 중지 stop
    • 실행 start
    • 재실행 restart

    • 확인 ps
    • 삭제 rm

    • 로그 확인 logs
    • 컨테이너에 명령어 수행 exec
  • 이미지
    • 확인 images
    • 삭제 rmi
    • 다운로드 pull
    • 업로드 push
    • 태그 지정 tag

Docker file

  • FROM: 베이스 이미지 설정. <이미지 이름="">:<태그> 형식
  • METATAINER: 메인테이너 정보
  • RUN: 쉘 스크립트나 명령 실행. 이미지 생성 시에 실행
  • CMD: 컨테이너가 시작되었을 때 실행할 파일 또는 쉘 스크립트
  • EXPOSE: 호스트와 연결할 포트 번호
  • WORKDIR: CMD에서 설정한 실행 파일이 실행될 디렉터리


  • Java 예시
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "/demo-0.0.1-SNAPSHOT.jar"]

Docker-compose

스크린샷 2023-12-10 오전 10 26 14

  • 여러 도커 파일을 띄우거나 관리하기 위해 사용

2. ECR / ECS

  • ECR: 이미지 저장 및 관리 서비스
  • ECS: ECR에 저장된 이미지를 기반으로 가상화된 서비스 제공 (Serverless)

리포지토리 생성

  • [푸시 명령 보기] 에 나온 명령어를 차례로 실행
  • 이미지 빌드 - 태그 설정 - 푸시

IAM 사용자 생성

  • ECR Full Access 권한
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": "ecr:*",
			"Resource": "*"
		}
	]
}

ECS 사용

  • 클러스터 & 서비스에서 ECR의 이미지 URI를 불러와서 생성
  • 서비스 접속은 ELB를 구성해서 포트로 연결하여 사용!!

장점

  • 별도의 EC2 연결 없이 docker로 간단하게 구성 가능
  • CI/CD도 서비스까지 바로 적용될 수 있도록 할 수 있음
  • gradle의 jib 플러그인을 이용하여 CI/CD를 구성할 수 있음

3. Lambda

  • 서버리스 서비스
  • 별도의 물리적인 서버(인스턴스)나 환경 없이 만든 함수만 등록해서 서비스할 수 있도록
  • 특정 이벤트가 일어났을 때 프로그램이 실행되도록 함!


스크린샷 2023-12-09 오후 2 08 43 lambda 함수 생성

스크린샷 2023-12-09 오후 2 09 26 생성된 함수에서 코드 작성후 Deploy

스크린샷 2023-12-09 오후 2 12 08

스크린샷 2023-12-09 오후 2 12 58

스크린샷 2023-12-09 오후 2 12 45 S3 버킷에서 이벤트 알림 설정 - 만들어 둔 lambda 함수 연결

스크린샷 2023-12-09 오후 2 11 10 S3에서 파일이 업로드되면(event) 로그를 출력하도록 함
json 파일 업로드해주기

ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied 에러

  • 인터넷에 쳐보니 json 파일 내용에 문제가 있을 수 있다고 해서 아래 방법으로 다시 만들었는데도 오류가 발생했음
  • 역시 역할 문제였음!
    • IAM에서 연결되어있다고 생각했던 역할에 S3Access 정책을 부여했는데 다른 역할이었음..ㅎㅎ
    • [lambda] - [구성] - [권한] - [실행 역할]에서 역할 바로 연결 가능!
    • S3FullAccess 정책을 연결했음

python으로 json 파일 만들기

  • mac에서 텍스트 편집기로 만들고 json으로 변경했더니 이상한 문자들이 덧붙여짐
import json

data = {
    "temperature": 45
}

json_data = json.dumps(data)

with open('ex.json', 'w') as f:
    f.write(json_data)

로그 생성

  • CloudWatch에서 확인 가능

스크린샷 2023-12-09 오후 5 14 22

아래에서 3번째 줄에 설정한 로그가 출력됨! Be careful! It's getting really hot!!

4. API Gateway

  • Gateway 역할을 하는 Serverless 서비스
  • Lambda에 들어가는 트리거 역할을 할 수 있음
  • 별도의 서버 구성 없이 간단한 코드로 API를 생성할 수 있음
  • Lambda에서 추가적으로 DB나 파일에 데이터를 저장하도록 구성할 수 있음


  • API 유형
    • HTTP API
    • 웹 소켓 API
    • REST API
    • REST API (private)
      • VPC 내에서만 접속 가능

생성

스크린샷 2023-12-31 오후 5 22 36 REST API 생성

스크린샷 2023-12-31 오후 5 24 06 리소스 생성

스크린샷 2023-12-31 오후 5 24 58 메서드 생성


lambda 함수 생성 - 기본 코드

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }


스크린샷 2023-12-31 오후 5 26 37 lambda 함수 등록

스크린샷 2023-12-31 오후 5 27 00 lambda에 API Gateway가 연결됨

스크린샷 2023-12-31 오후 5 27 39

스크린샷 2023-12-31 오후 5 29 28 테스트 생성

스크린샷 2023-12-31 오후 5 29 59 정상적으로 호출됨