MINIWIKI
CareerSideProjectBook&Study
  • ⚡README
  • 😃ME
    • Review
      • 2025 OKR & 회고 - 회사 없이도 먹고살 수 있는 상태가 된다
        • 2025년 19주차
        • 2025년 18주차
        • 2025년 17주차
        • 소설쓰기의 쓸모
        • 2025년 15주차
        • 2025년 14주차
        • 요즘 회사생활
        • 첫 페이지 작성!
        • 큰 코 다쳤다
        • 오랜만에 좋았던 하루
        • 악순환과 반복실패
        • 2025년 12주차
        • 2025년 11주차
        • 2025년 3월 6일
        • 2025년 3월 4일
        • 2025년 3월 1일
        • 2025년 2월 회고
        • 2025년 1-2월 책, 영화, 음악
        • 2025년 1-2월 회고 (PM)
        • 2025년 1-2월 회고 (콘제품)
          • (Merged) 2025 비즈니스
        • 2025년 1-2월 회고 (삶/사람)
        • 2025년 1-2월 회고 (기본)
        • (25.02) 고객 피드백 받기
        • 다시 전략 수정
        • 머리 속 복잡한 것들 끄적끄적
        • 변하지 않는 핵심 철학
        • 개별화 능력을 이용하는 방법
        • 파고들기
        • 예술가와 사업가
        • 강점
        • PM으로서의 전문성
        • 부동시
        • 이게 다 무슨 소용인가
        • 내가 가장 잘 전할 수 있는 메시지
        • 연말인사 타이밍
        • Attitude는 옷부터
        • 다시 시작
      • 2024 회고
        • 2024년 12월 4주차 (52/52)
        • 원한다고 생각했던 것들
        • 2024년 12월 3주차 (51/52)
        • 회사 vs. 퇴사
        • 2024년 12월 2주차 (50/52)
        • 2024년 11월 4주차 (47/52)
        • 2024년 11월 3주차 (46/52)
        • 2024년 11월 1주차 (44/52)
        • 혓바늘
        • 2024년 10월 3주차 (42/52)
        • 그냥, 요즘하고 있는 생각들
        • 2024년 10월 1주차 (40/52)
        • 2024년 9월 4주차 (39/52)
        • 2024년 9월 3주차 (38/52)
        • 2024년 9월 2주차 (37/52)
        • 2024년 9월 1주차 (36/52)
        • 2024년 8월 4주차 (35/52)
        • 잃어버린 보물창고
        • 분기별 프로젝트
        • 강점검사
        • 글쓰기
        • 이상적인 하루
        • 나와 아프리카
        • 한 때 나에게 힘이되었던 문장들
      • 2023 회고
        • 2023년 12월 5주차
        • 2023년 12월 4주차
        • 2023년 12월 3주차
        • 2023년 12월 2주차
        • 2023년 12월 3일
        • 2023년 12월 1주차
        • 2023년 11월 29일
        • 2023년 11월 28일
        • 2023년 11월 27일
        • 2023년 11월 18일
        • 2023년 11월 15일
        • 2023년 11월 12일
        • 2023년 11월 11일
        • 2023년 11월 1주차
        • 2023년 10월 3주차
        • 2023년 9월 4주차
        • 2023년 9월 3주차
        • 2023년 9월 2주차
        • 2023년 9월 1주차
        • 2023년 8월 4주차
        • 2023년 8월 2주차
        • 2023년 8월 1주차
        • 2023년 7월 4주차
        • 2023년 7월 3주차
        • 2023년 7월 2주차
        • 2023년 상반기 회고
        • 나태하고 욕심많은 인간은 어떻게 살아야 하나
        • 책 <어떻게 살아야 하는가>
        • 책 <당신은 결국 무엇이든 해내는 사람>
        • 복잡계를 살아가는 단순한 사람
        • 책 <모든것이 되는법>
        • 글로 신뢰를 얻었던 경험들
        • 기획은 나를 찾아가는 과정
        • 나는 왜 살아가는가
        • 장항준 감독으로부터 배우는 "삶을 대하는 자세"
        • 개발자가 말하는 감정에도 분석이 필요한 이유
      • 2022년 회고
        • problem map 작성하기
        • 삶에서 내가 해결하고 싶은 문제 (2)
        • 삶에서 내가 해결하고 싶은 문제 (1)
        • <삶의 문제> 지도 다시 꺼내보기
        • 지도 위의 29살
        • 매번 시간계획을 망치는 MBTI 'P형 인간'을 위한 5단계 인생관리법
        • 당신은 왜 프로그래밍을 공부하는가?
        • 아무 것도 아닌 내가 글을 쓰는 이유
        • 책 <여행의 이유>
        • 책 <붕대감기>
      • 2021년 회고
    • Career
      • [미리캔버스] AI 제품 PM
        • 선택과 집중
        • 어쩌면 내가 틀릴 수도 있다는 생각
        • 뾰족한 사람들과의 협업
        • AI기능 PPT로 온보딩
        • AI 제품에서 가장 중요한 것
      • [미리캔버스] 앱 PM
      • [미리캔버스] 소상공인 제품 PM
      • [미리캔버스] 2.0 PM
      • [홀로스탠딩] 백엔드 개발
      • [청년5.5] 안드로이드 개발
      • [가축대출사업] NGO Project PM
    • Insight
    • Interview
    • Public Writing
  • SIDE PROJECT
    • [Youtube] 메이킹필름
      • [Product] 청춘집 프로젝트
        • (v24.11) 청춘집 JTBD
          • (구) 청춘집 실행계획
          • (구) 플레이리스트 기획
            • 데이식스 전곡 타임라인
            • 챕터 구성
        • (v25.01) 청춘집 JTBD
          • 아이돌 굿즈 시장 조사 (공식)
          • 아이돌 굿즈 시장 조사 (비공식)
        • 제작 준비
          • 레퍼런스 - 오프라인 시집
          • a5 책 만들기
    • [Youtube] 마포구타자기
      • [mptw] JTBD
        • IKIGAI
      • [mptw] 채널 설정
        • 채널 이름 후보군
      • 시리즈 [읽는음악]
        • [읽는음악] 백로그
          • 노래 가사 콘텐츠 레퍼런스
        • ep1. 파노라마 - 이찬혁
          • 이찬혁 <ERROR>
        • ep2. 마지막 인사 (feat. 청하) - 이찬혁
        • ep3. 나의 바다에게 - 도영
        • ep4. Dattom - 백예린
        • ep5. REBEL HEART - IVE
        • ep6. Either way - IVE
        • ep7. 너와의 모든 지금 - 재쓰비(JAESSBEE)
        • ep8. 예뻤어 - DAY6
        • 6주차. 데이식스 시리즈
    • [IT] 공적인사적모임 플랫폼
      • 1. 우리 조직의 얼굴을 만들자
      • 2. 내 생에 첫 기획서 만들기 (feat. QA Driven Development)
    • [Meet] 공적인사적모임
    • [Youtube] 이상한나라의 개발자할무니
    • [Study] Disquiet PM 스터디 쿨피스
    • [IT] 서울 빵 맛집 잘알 테스트
    • [Meet] 얼리버드 모닝클럽
      • 홍보를 곁들인 2주일 운영후기
  • 잡학사전
    • 와인 원데이 클래스
    • 소설쓰기
      • <책> 소설쓰기의 모든 것 1 - 플롯과 구조
      • 유튜브 - 소설 쓰는 법
      • 강의들
      • 작가가 되려면 어떻게 해야해
    • AI
      • 생성형 AI
    • ComfyUI
      • Stable Diffusion
      • ComfyUI 준비, 설치, 설정
      • Module 구조에 대해 이해하기
      • ComfyUI
      • Core Node
    • 작사
      • 작사가 되는 법
    • 유튜브
      • 유튜버 스토리님의 부캐 성장기
      • 주언규 유튜브 초보편 (클래스101)
      • 주언규 유튜브 왕초보 편
    • 경제
      • 연금저축펀드
    • ChatGPT
    • 크롤링
      • Automatio
      • Octoparse
    • 노코드
      • 북마크 & 노코드 서비스 목록
  • PRODUCT&BUSINESS
    • Service Planning/Analysis
      • 브런치시리즈 <개발보단 고객개발>
      • baemin mart
        • 1. 시작
        • 2. 우아한형제들 & 배민상회
        • 3-1. [인터뷰] 포항에서 치킨집을 운영하시는 최사장님
        • 3-2. [인터뷰] 부산에서 족발 프렌차이즈를 운영하시는 이사장님
        • 4. <아프니까 사장이다> 커뮤니티 데이터 분석
        • 5. 문제정의 & 개선 가설
        • 6. 결론 - 역기획서
      • careerly
      • meetme
      • 배달의 민족 역기획 사례
      • 당근마켓 역기획 사례
      • 도그냥 님이 말하는 진짜 역기획
      • 도그냥의 역기획 스터디법
      • 책 <현업 기획자 도그냥의 서비스 기획 스쿨>
      • 기획서 작성하기
    • Business/Growth
      • Unsexy Business 뉴스레터에서 얻는 인사이트
      • 책 <원씽>
      • 책 <아프리카 스타트업>
      • 책 <유난한 도전>
      • 책 <함께자라기>
      • 책 <나는 돈 없어도 사업을 한다>
      • 책 <나는 장사의 신 은현장이다>
      • 책 <왜 사업하는가>
      • 책 <왜 일하는가>
      • 이제는 피칭도 유튜브로
      • 세컨드 브레인이 필요한 이유
      • 책 <타이탄의 도구들>
      • 책 <역행자>
        • <역행자> 역행자의 7단계 모델 복습
        • <역행자> 운명을 거스르는 역행자의 7단계 모델
      • 책 <월급쟁이로 시작한 38살 그녀는 어떻게 30억을 벌어 파이어족이 되었을까?>
      • 책 <파리에서 도시락을 파는 여자>
      • 책 <존리의 금융문맹탈출>
      • 책 <돈의 감각을 길러주는 경제 지식 첫걸음>
        • 금리
        • 환율
        • 주식
        • 채권
        • 부동산
        • 연금
        • 경제정책
        • 규제
        • 경제위기
    • Product-Market Fit
      • 브런치 북 <개발보단 고객 개발>
      • 책 <아이디어 불패의 법칙>
      • 고이장례연구소
      • 글쓰기로 PMF 검증하기
      • 연대 송도 캠퍼스의 40%가 사용한 서비스
      • 어웨이크코퍼레이션의 김민준 님
      • 드로우 마이 브랜드
      • 노코드로 PMF 찾는 방법
    • UI/UX
      • UX Writing Workshop
        • 4. 고객과의 관계형성 - 차별점 강화
        • 3. 비즈니스 임팩트를 만드는 글쓰기
        • 2. 후킹한 문장으로 고객 행동 이끌기
        • 1. 쉽고 정확한 문장으로 문제해결
        • What is UX Writing?
        • Reference
      • UX/UI 관련 유용한 사이트 모음
    • PM/PO
      • 책 <프로덕트 매니지먼트>
      • 책 <인스파이어드>
      • PM Wiki
      • 당신과 팀을 성장시킬 PM 직무가이드
      • PO 미신, 파랑새를 찾아서 - CPO 김용훈
      • 개발자가 생각하는 좋은 PM 나쁜 PM
      • 프로덕트 매니저는 뭐하는 사람인가
      • 토스 리더가 말하는 PO가 꼭 알아야할 개념 (2)
      • 토스 리더가 말하는 PO가 꼭 알아야할 개념 (1)
      • 책 <조직을 성공으로 이끄는 프로덕트 오너>
        • <프로덕트 오너> PO의 시간관리법
        • <프로덕트 오너> PO가 데이터 기반으로 일할 수 밖에 없는 이유
  • DATA
    • Database
      • 이 위키를 만드는데 참고한 자료들
      • 데이터 기반 의사결정
      • 데이터베이스의 종류
      • 트랜잭션과 무결성
      • 트랜잭션, 커밋, 롤백, 트랜잭션 전파
      • ERD, entity relationship diagram
      • 기본 3 - 관계, 키
      • 기본 2 - 필드, 레코드, 타입
      • 기본 1 - 엔티티, 릴레이션, 속성, 도메인
    • SQL
      • Sub Query
      • JOIN
      • 데이터 정렬셋과 유니코드
      • 자료형
      • DDL, DML
      • SELECT
      • SQL
    • MySQL
      • MSQL to MySQL Data Migration
      • MySQL Server 다운로드, 로그인
      • helpful commands
      • 문자열 자르기 SUBSTR(column, startIdx, length)
      • 특정 값을 ORDER BY 특정 값 우선 정렬 하기 (ORDER BY FIELD)
      • 이것이 MySQL이다
    • H2
      • ‼️h2 in-memory-db Table not found (this database is empty) 해결방법
  • Dev-General
    • Webmark
    • Open Source
      • 나의 첫 opensource contribution 경험기
    • Dev-Insight
      • Event
        • YOUTHCON 2022
        • INFCON 2022
      • 책 <누워서 읽는 알고리즘>
      • 책 <나는 LINE 개발자입니다>
      • 서비스에 대해 개발자가 가져야할 생각들
      • AI 시대에서 결국 살아남는 것
      • AI 시대에 개발자가 살아남는 방법
      • 주니어를 넘어서, 성장하는 개발자의 길 (인프런)
      • 아마추어와 프로의 차이
      • 개발자의 개발공부에 대하여
      • 서비스에 대해 개발자가 가져야할 생각들
      • 좋은 개발자와 인맥을 만든 노하우
      • 개발자 취업기/이직기 모음
        • 라인게임즈 백엔드 개발자 경선님
        • OKKY 미니세미나 <비전공 학원출신 SI개발자, 유명스타트업 들어간.ssul> 참석 후기
        • 비전공자에서 2억받는 아마존 엔지니어가 되기까지
        • IT 대기업 100% 합격하는 방법
  • 🏗️computer science
    • Algorithm & Data Structure
      • About this page
      • Test Review
        • Page 1
      • Big-O
        • 빅오표기법의 문제풀이
        • 피보나치 수열의 시간복잡도
      • Bit Operation
        • bit masking
      • Math
        • 합공식 / 누적합
        • 피보나치 수
        • 약수찾기
        • 소수찾기
          • 백준 1978 소수찾기
          • 백준4948 베르트랑 공준
          • 백준 8393 합
          • 백준 1929 소수구하기
        • 최대공약수 / 최소공배수
          • 백준 2824 최대공약수, BigInteger
          • 백준 2609 최대공약수, 최소공배수
        • 순열과 조합
          • 백준 15649 N과 M
        • 그 외 개념 정리
      • Recursion
        • N Queens problem
        • counting cells in a blob
        • recursion 응용 - 미로찾기
        • 순환 알고리즘의 설계
        • 순환적으로 사고하기
        • 백준 17478 재귀함수가 뭔가요
        • 백준 10870 피보나치수 5
      • Sort
        • java 에서의 정렬
        • radix sort
        • sorting in linear time
        • comparison sort 에서 최상의 시간복잡도
        • priority queue
        • heap sort
        • quick sort
        • merge sort
      • Array and List
        • 표준 라이브러리
      • Linked list
      • String
      • Stack
        • 백준 1874 스택수열
        • 백준 10828 스택 구현하기
      • Queue
        • 백준 10845 큐 구현하기
      • Heap
        • 백준 11298 절대값힙
        • 백준11279 최대힙
        • 백준1927 최소힙
      • Deque
      • Tree and Binary tree
        • Tries
        • Red-Black Tree
        • Binary Search Tree
      • Search
        • 완전 탐색
        • 이분탐색
      • Graph
        • 최단경로
        • MST 2 - prim 의 알고리즘
        • MST 1 - Kruskal 의 알고리즘
        • MST, minumum spanning tree
        • DAG, Directed Acyclic Graph
        • DFS, Depth First Search
        • BFS, Breadth First Search
      • Dynamic Programming
        • Knapsack problem
        • LCS, Longest Common Subsequence
        • matrix chain
        • 행렬 경로 문제
        • 백준 1003 피보나치 함수
        • 백준 9461 파도반 수열
        • 백준9251 LCS
      • Greedy
      • Implementation
      • LIS, Longest Increasing Subsequence
      • Two Pointer
      • Line Swipping
      • Fenwick tree
      • Backtracking
    • Computer Structure
      • 이 위키를 만드는데 참고한 자료들
      • 그래서 컴퓨터는 어떻게 동작하나요?
      • 컴퓨터의 구성
      • 컴퓨터의 역사
      • 컴퓨터 구성요소의 기능 및 이해
      • 중앙처리장치 - 마이크로 명령 - 입출력과 인터럽트
      • 중앙처리장치 - 기본 컴퓨터 프로그래밍
      • 중앙처리장치 - 프로그래밍 언어와 실행
      • 파이프라인과 벡터처리 - 데이터의 종속성 - 병렬처리와 파이프라인
      • 파이프라인과 벡터처리 - 파이프라인 구조 - 데이터/구조
      • 파이프라인과 백터처리 - 산술&명령어 파이프라인
      • 파이프라인과 벡터처리 - 파이프라인 CPU의 성능분석
      • 메모리 구조 - 메모리 시스템의 이해
      • 메모리 구조 - 효율적인 메모리 관리 정책
      • 메모리 구조 - 컴퓨터 성능 개선을 위한 메모리 관리
      • 입출력구조 - 시스템 BUS 구성 및 제어
      • 입출력 구조 - 입출력(I/O) 연결과 주소 지정
      • 입출력 구조 - 입출력 수행과 인터럽트
      • 병렬컴퓨터 구조와 성능분석 - 멀티 프로세서
      • 병렬 컴퓨터 구조와 성능 분석 - 시스템 성능 분석과 개선
    • This Is Coding Test 2021
      • 1. 출제 경향 & 파이썬 문법 부수기
      • 2. 그리디 알고리즘 & 구현
      • 3. BFS & DFS
      • 4. 정렬 알고리즘
      • 5. 이진탐색
      • 6. 다이나믹 프로그래밍
      • 7. 최단경로 알고리즘
      • 8. 기타 그래프 이론
      • 9. 코딩테스트에서 자주 출제되는 기타 알고리즘
      • 10. 개발형 코딩테스트
    • Operating System
      • 이 위키를 만드는데 참고한 자료들
      • 운영체제란, Introduction to Operating Systems
      • 컴퓨터 시스템의 구조, Structure of Computer System
      • 프로그램의 실행, Program Execution
      • 프로세스, Process
      • 쓰레드, Thread
      • 프로세스의 생성과 종료, Start and End of Process
      • 프로세스 시스템 콜과 프로세스간의 협력, System call and Interprocess Communication
      • CPU Scheduling
      • CPU Scheduling Algorithm
      • Process Synchronization Problem
      • Initial Attempts to Solve Process Synchronization Problem
      • semaphore 와 monitor 로 synchronization 해결하기
      • 데드락, Deadlock
      • 메모리 관리, Memory Management
      • Memory Allocation
      • Virtual Memory
      • Virtual Memory 2
      • File System
      • File Systems Implementation
      • Disk Management & Scheduling
    • Network
      • 이 위키를 만드는데 참고한 자료들
      • 대규모 트래픽으로 인한 서버 과부하 해결방법
      • 유선 LAN과 무선 LAN
      • 네트워크를 이루는 장치 (L1, L2 .. L7)
      • REST API
      • HTTP 매서드
      • HTTP 상태코드
      • 직렬화와 역직렬화
      • 로그인 구현방식 2. 토큰 기반 인증방식
      • 로그인 구현방식 1. 세션 기반 인증방식
      • 웹 브라우저의 캐시 - 공통점과 차이점
      • 웹 브라우저의 캐시 - 쿠키
      • HTTP header
      • 웹 브라우저의 캐시 - 세션 스토리지
      • 웹 브라우저의 캐시 - 로컬스토리지
      • browser rendering
      • HTTPS 와 TLS - TLS 핸드쉐이크
      • HTTPS 와 TLS - 암호화
      • HTTP History
      • www.naver.com 을 주소창에 입력하고 화면에 나타나기까지의 과정
      • IP 주소 - 공인 IP와 사설 IP
      • IP 주소 - Classless,Subnet Mask, Subnetting
      • IP 주소 - Classful IP Addressing
      • IP 주소 - IPv4, IPv6
      • IP 주소 - 이진수 이해하기
      • IP 주소, MAC 주소, ARP, RARP
      • 라우팅
      • TCP 4way handshake and TIME_WAIT
      • TCP 3way handshake
      • TCP/IP - internet layer
      • TCP/IP - Transport Layer
      • TCP/IP - Application Layer
      • TCP/IP - MTU, MSS, PMTUD
      • TCP/IP 4계층, OSI 7 layer
      • 네트워크의 분류 - LAN, MAN, WAN
      • 네트워크 토폴로지와 병목현상
      • 네트워크의 기초 3
      • 네트워크의 기초 2
      • 네트워크의 기초
    • Linux
      • reference
      • sudo apt-get install / uninstall
      • vim
      • linux basic command
    • Design Pattern
      • 이 위키를 만드는데 참고한 자료들
      • static 을 자주 사용하게 되었을 때의 단점
      • 자바스크립트의 class와 static
      • 프로그래밍 컨텍스트
      • 의존성 주입 vs. 전략패턴
      • flux pattern
      • Spring MVC 패턴 적용 사례
      • MVC, MVP, MVVM pattern
      • 프록시 패턴
      • 옵저버 패턴
      • 전략패턴
      • 의존성 주입과 의존 관계 역전 원칙
      • 이터레이션 패턴
      • 추상 팩토리 매소드 패턴
      • 팩토리 메소드 패턴
      • 싱글톤 패턴
      • 디자인 패턴, 라이브러리와 프레임워크의 차이
    • Programming Basic (Go)
      • 이 위키를 만드는데 참고한 자료들
      • 트랜지스터, Trangister
      • 논리소자, Logic Element
      • 튜링과 폰 노이만, Turing and Von Neumann
      • 컴퓨터의 원리, Computer Principle
      • 프로그래밍 언어, Programming Language
      • 컴파일러와 동적언어, Compiler and dynamic language
      • golang
      • hello, world
      • variable
      • variable 2
    • Base Knowledge
      • 이 위키를 만드는데 참고한 자료들
      • 신기술 도입시 고민해야할 점(feat. react.js vs. vue.js)
      • 정적 타입 시스템의 필요성
      • 도커, 컨테이너
      • 클라우드, Saas, IaaS, PaaS
      • SSO
      • RBAC
      • OAuth2.0
      • REST API 사용을 위한 인증 방법 4가지
      • API
      • Data Format - XML
      • Data Format - JSON
  • ☕Java/Spring
    • Java
      • Java Code Convention
      • Java 버전별 특징 (v1-v19)
      • java.lang.Math
      • List 4가지의 초기화 방법
      • HashMap 4가지의 정렬 방법
      • 어노테이션 프로세서 정리하기
      • Annotation Processor 로 없는 소스코드 생성하기
      • lombok 은 어떻게 동작하는 것일까?
      • 다이내믹 프록시 정리하기
      • 클래스의 프록시
      • 다이내믹 프록시
      • 프록시 패턴은 무엇인가
      • Spring Data JPA 는 어떻게 동작할까?
      • reflection api 정리
      • reflection api 이용하여 spring ioc container 만들기
      • reflection api
      • spring dependency injection 은 어떻게 동작할까
      • 바이트 코드 조작하기
      • java bytecode 를 조작해 테스트 코드 커버리지 확인하기 (feat.jacoco)
      • Class Loader
      • JVM 의 구조
      • java, jvm, jdk and jre
      • synchronized
      • java string.split(".") 오류
    • Java 8
      • 이 위키를 만드는데 참고한 자료들
      • Metaspace
      • Parallel 정렬
      • Annotation
      • CompletableFuture
      • Date and Time
      • Optional
      • Stream
      • interface의 default 메소드와 static 메소드
      • 인터페이스의 변화
      • 함수형 인터페이스
      • java 8 소개
    • Spring Framework
      • Spring 3.0 준비하기
      • 특정 매소드만 transaction 처리하기
      • 스프링 프로젝트 시작하기
      • 스프링이란 무엇인가
      • 스프링 핵심 기술의 응용
      • AOP 2
      • AOP 1
      • 서비스 추상화 2
      • 서비스 추상화 1
      • 예외
      • 템플릿
      • 테스트
      • 오브젝트와 의존관계
      • 스프링이란
    • Spring Boot
      • [Gradle]UncheckedIOException
      • java19 + spring 3.0.5 + gradle 7.4.1 에서 프로젝트 gradle 설정하기
      • [리뷰] Gradle 멀티 프로젝트 관리
      • [리뷰] 멀티모듈 설계 이야기 with Spring, Gradle
    • JPA/QueryDSL
      • querydsl 을 쓰는 이유
      • JPA querydsl에서 json array 로 된 컬럼에 조건 적용하기
      • querydsl 에서 mysql order by field() 사용하기
  • 🏰Infrastructure
    • InfraWorkshop
      • 이 위키를 만드는데 참고한 자료들
      • aws로 안정적인 인프라 만들기 2
      • aws로 안정적인 인프라 만들기 1
      • 어플리케이션 진단하기
      • 서버 진단하기
      • 부하 테스트
      • 웹 성능 개선하기
      • 웹 성능 진단하기
      • <aws로 그럴듯한 인프라 만들기> 회고와 피드백
      • aws로 그럴듯한 인프라 만들기 3 - 배포스크립트
      • aws로 그럴듯한 인프라 만들기 2 - 배포하기
      • aws로 그럴듯한 인프라 만들기 1 - 네트워크 망 구성
      • docker container
      • connection check
      • network segmentation
      • cloud 서비스를 사용한다는 것
    • AWS
      • AWS IAM
      • AWS CodePipeline 으로 배포 자동화하기 (1)
      • AWS CodePipeline 으로 배포 자동화하기 (2)
  • 🪄Test
    • TDD
      • 이 위키를 만드는데 참고한 자료들
      • [2주차] 로또 과제 강의를 듣고나서
      • [1주차] 자동차 경주 과제 강의를 듣고나서
      • TDD, 리팩토링이란?
      • 가장 쉽게 TDD 시작하는 방법
      • 의식적인 연습과 학습 테스트
      • TDD 에 집착해야하는 이유
      • 공부하는 자세
    • AssertJ
      • 이 위키를 만드는데 참고한 자료들
    • JUnit
      • 이 위키를 만드는데 참고한 자료들
      • Junit 기본 개념
  • 😎OTHERS
    • Helpful Command
      • Mac 에서 특정 포트 검색, 종료
      • crontab
    • Llibrary
    • IntelliJ
      • 내가 좋아하는 커스텀 세팅
    • GIT
      • Github ID/Token 한번 입력 후 저장하기
      • Github Actions
      • github organization private repository push 안될 때 (not found issue)
      • commands
      • git commit convention
    • Logging
      • logback + webfilter 로 로그설정
      • ‼️log4j 보안 이슈
    • Postman
      • postman 의 header에서 언더바(_) 변수 인식 안되는 현상
Powered by GitBook
On this page
  • 1. 소스 스테이지 실행하기
  • 1-1. 이슈) 403 Access Denied 권한오류가 발생할 때
  • 2. 빌드 스테이지 실행하기
  • 2-1. 프로젝트 내부 > buildspec.yml 생성하기
  • 2-2. 빌드 성공
  • 2-3. 이슈) buildspec.yml 파일을 찾을 수 없을 때
  • 2-4. 이슈) buildspec.yml 내부의 경로 설정이 잘못되었을 때
  • 3. 배포 스테이지 실행하기
  • 3-1. IAM > EC2 서버를 위한 역할 생성하기
  • 3-2. IAM > EC2 에서 CodeDeploy Agent 용 사용자 추가하기
  • 3-3. EC2 > AWS Cli 설치하기
  • 3-4. EC2 > AWS CodeDeploy Agent 설치하기
  • 3-5. 이슈) sudo ./install auto 실행시 /usr/bin/env: ‘ruby’: No such file or directory오류 발생할때
  • 3-6. 프로젝트 내부 > buildspec.yml 수정하기
  • 3-7. 프로젝트 내부 > appspec.yml 생성하기
  • 3-8. 프로젝트 내부 > 배포용 쉘 스크립트 생성하기
  • 3-9. 배포 스테이지 실행하기
  • 3-10. 이슈) S3 접근 권한 오류 : The provided role does not have sufficient permissions.
  • 3-11. 이슈) 배포 스테이지 설정시 로드밸런서 설정을 했을 경우
  • 3-12. (보너스) EC2 서버 내 CodeDeploy 로그 확인하기위한 소프트링크 연결하기

Was this helpful?

  1. Infrastructure
  2. AWS

AWS CodePipeline 으로 배포 자동화하기 (2)

Pipeline 실행하기

PreviousAWS CodePipeline 으로 배포 자동화하기 (1)NextTDD

Last updated 1 year ago

Was this helpful?

을 하나씩 따라하며 마주했던 이슈 및 해결방법들을 덧붙여서 AWS CodePipeline 으로 Spring Boot 프로젝트의 배포를 자동화하는 과정을 진행중이다.

지난번 포스팅을 통해서

  1. 전체 AWS Pipeline 의 큰 프로세스를 훑어보고

  2. 소스, 빌드, 배포의 파이프라인을 설정하는 부분까지 살펴보았다.

이번 포스팅을 통해서는 추가적으로 필요한 설정들을 살펴보고 각 단계별로 진행이 잘 되는지 직접 파이프라인을 실행하면서 확인해보도록 하자.

그럼, 아래의 그림을 기억하며 배포 스테이지를 추가하여 완성된 파이프라인을 실행해본다.

1. 소스 스테이지 실행하기

테스트를 위해 파이프라인과 연결된 브랜치에 커밋을 푸시하게 되면, 2) 파이프라인은 변경사항을 감지하고 최신소스로 업데이트를 할 것이다. 3) 소스가 제대로 가져와 졌다면 S3 에 아티팩트로 저장된다. S3 로 이동하여 제대로 아티팩트가 만들어졌는지 확인한다.

파이프라인에 의해서 자동으로 S3 버킷이 생성되었고,

파이프라인 이름으로 디렉토리가 생성되었다. SourceArti 디렉토리 내부를 들어가보면 SourceArtifact 가 정상적으로 생성되었음을 알 수 있다.

1-1. 이슈) 403 Access Denied 권한오류가 발생할 때

파이프라인 생성 당시에 직접 만든 S3 에 소스 아티팩트를 보관하도록 처리하는 경우, S3 리소스에서 정책과 접근권한이 제대로 설정되어있지 않다면 다음과 같이 소스 다운로드 과정에서 권한오류가 발생할 수 있다.

하지만 파이프라인 쪽에서 S3 아티팩트 보관용 버킷을 자동 생성하도록 두어져있다면, 해당 이슈는 우려하지 않아도 된다.

2. 빌드 스테이지 실행하기

소스 스테이지에서 정상적으로 통과가 되면, 자동으로 빌드 스테이지로 넘어오게 된다. 현재 상태로는 빌드에 필요한 추가 설정들을 하지 않았기에, 아마 실패할 것이다. 아래를 따라서 빌드에 필요한 추가 설정들을 해보자.

2-1. 프로젝트 내부 > buildspec.yml 생성하기

소스의 출처가 되는 원격 레포지토리의 구조에 따라 세부 경로가 달라지게 되는데, gradlew 가 있는 곳이 루트디렉토리가 되게끔 설정을 해주면 된다. 나 같은 경우는 아래와 같이 되어있어서 한 단계 더 들어가서 설정해주도록 하였다.

//git 원격 레포지토리 내 디렉토리 구조

repository root 
L test-project 
	L gradle/wrapper
	L src
	L buildspec.yml
	L build.gradle
	L gradlew
	L gradlew.bat
	L setting.gradle
L .gitignore
L README.md
# buildspec.yml 

version: 0.2

phases:
  build:
    commands:
      - echo Entered the build phase...
      - echo Build Starting on `date`
      - cd test-project   # 루트에서 프로젝트로 한 depth 더 이동하기
      - chmod +x ./gradlew  # gradlew 가 있는 위치에서 빌드 명령어 시작
      - ./gradlew clean build
  post_build:
    commands:
      - echo Entered the post_build phase...
      - echo Build completed on `date`
      - echo $(basename ./build/libs/*.jar)
      - pwd

cache:
  paths:
    - '/root/.gradle/caches/**/*'
  • build : 프로젝트의 빌드가 시작되는 시점이다. gradlew 실행 권한을 부여하고, 클린 후 빌드 할 수 있도록 명령어를 추가한다.

  • post_build : 빌드가 끝난 시점. 빌드 결과물을 출력해서 빌드가 성공적으로 되었는지 확인한다.

  • cache : 해당 위치에 있는 파일들을 S3 캐시 파일로 등록한다.

2-2. 빌드 성공

위의 설정을 마치면 다시 소스코드를 커밋&푸시하여 파이프라인 프로세스를 시작한다. 소스 단계가 통과되고 빌드가 성공적으로 마무리 되면, 아래와 같이 콘솔 창에서 SUCCEEDED 를 확인 가능하다. 콘솔창을 통해서 우리가 buildspec.yml 에 설정한 각 빌드 단계별 명령어가 성공적으로 수행되었음을 알 수 있다.

빌드된 결과물은 역시 S3에 아티팩트로 저장되는데 빌드가 성공적으로 진행된 이후 S3 내에서 확인 가능하다.

디렉토리 내부에 빌드된 파일이 제대로 생성되었다면 성공적으로 마무리 된 것이다.

2-3. 이슈) buildspec.yml 파일을 찾을 수 없을 때

빌드 프로세스가 일단 시작되면, 파이프라인은 buildspec.yml 파일을 찾는다. 1편에서 다뤘던 빌드 프로세스 설정시 buildspec.yml 경로를 잘못 입력했을 경우, buildspec.yml 파일을 찾지 못하여 빌드에 실패하게 된다. 따라서 경로 설정이 정말 중요하다. 빌드 시 콘솔 창에서 그 과정들이 메시지로 출력되므로 오류시에는 오류 메시지를 천천히 읽고 그에 맞게 대응하는 것이 중요하다.

2-4. 이슈) buildspec.yml 내부의 경로 설정이 잘못되었을 때

빌드 프로세스를 생성할때 경로설정을 잘 했다고 하더라도, buildspec.yml 파일 내부에서 명령어를 잘 못 입력할 경우, gradlew 파일을 찾을 수 없다는 오류가 발생해서 빌드에 실패하게 된다. 앞서 말한대로 build 단계에서 본인의 gradlew 파일이 있는 곳까지 가서 빌드 명령어를 잘 수행할 수 있도록 디렉토리 위치를 이동하는 명령어를잘 설정해주어야 한다. 위에서는 cd test-project 명령어를 추가하여 gradlew 가 있는 위치까지 디렉토리를 이동해주었다.

3. 배포 스테이지 실행하기

빌드가 성공적이라면 역시 자동으로 배포 스테이지로 이동하게 된다. 배포 스테이지 역시 추가적인 설정들이 더 필요하기에 배포에 실패할 것이다. 아래를 통해 추가 설정 후 다시 배포 스테이지를 진행해보자.

3-1. IAM > EC2 서버를 위한 역할 생성하기

우선 운영중인 EC2 서버가 있다고 가정하고 (없다면 하나 만들고) EC2 서버의 역할을 수정해주어야 한다.

  • IAM > 역할 > EC2 를 선택한 후 다음을 누른다.

아래의 4가지 정책을 추가해준다.

  • AmazonS3FullAccess

  • AWSCodeDeployFullAccess

  • AWSCodeDeployRole

  • CloudWatchLogsFullAccess

태그도 필요할 경우 추가해주고, 아래와 같이 역할 이름을 추가 후 정책들을 검토한다. 문제 없을 경우 역할 만들기를 클릭하여 완료한다.

만들어진 역할을 운영중인 EC2 서버에 추가한다.

  • 연결된 IAM 역할 없는지 확인 : EC2 > 인스턴스 클릭 > 작업 > 세부정보보기

  • IAM 역할 연결하기 : 작업 > 보안 > 위에서 만들어준 IAM 역할로 수정

3-2. IAM > EC2 에서 CodeDeploy Agent 용 사용자 추가하기

CodeDeploy 에서 배포가 시작되면 EC2 서버에서는 그 이벤트를 수신할 수 있어야 한다. 그를 위해서 이 이벤트를 수신하기 위한 CodeDeploy Agent 용 사용자를 추가해주어야 한다.

그룹 생성을 완료하면 인라인 정책으로 아래와 같은 정책을 추가해준다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "lambda:*",
                "elasticloadbalancing:*",
                "s3:*",
                "cloudwatch:*",
                "logs:*",
                "sns:*"
            ],
            "Resource": "*"
        }
    ]
}

그 후, 사용자를 추가해준다. aws-cli 를 이용해서만 엑세스할 것이기 때문에 프로그래밍 방식을 선택해준다.

아까 만든 그룹을 선택한다. 필요할 경우 태그를 추가한 뒤, 내용을 검토 후 사용자 생성을 마무리한다.

csv 파일은 이 페이지에서만 다운로드 가능하니, 다운로드후 잘 관리하도록 한다. 파일 내부의 엑세스키와 시크릿키를 이용하여 aws-cli 에 접속할 것이다.

3-3. EC2 > AWS Cli 설치하기

AWS CodeDeploy 로부터 이벤트를 수신받기 위해서 EC2 서버 내에 CodeDeploy Agent 를 설치해야한다. 먼저 AWS Cli 를 설치해보자.

# EC2 > AWS Cli 설치하기

# 1. 사용자 홈으로 이동
cd ~ 

# 2. aws 버전 확인
aws
Command 'aws' not found, but can be installed with:
sudo snap install aws-cli  # version 1.15.58, or
sudo apt  install awscli   # version 1.22.34-1
See 'snap info aws-cli' for additional versions.

# 3. awscli 설치
sudo apt install awscli
Reading package lists... Done
Building dependency tree
Reading state information... Done

# 4. 설치확인
aws --version
aws-cli/1.18.69 Python/3.8.10 Linux/5.11.0-1022-aws botocore/1.16.19

3-4. EC2 > AWS CodeDeploy Agent 설치하기

aws cli 를 설치한 뒤, 이어서 CodeDeploy agent 를 설치합니다.

# EC2 > AWS CodeDeploy Agent 설치하기

# 1. 우선 사용자 홈으로 이동
cd ~

# 2. aws configure 시작
sudo aws configure

# 3. 정보입력
AWS Access Key ID [None]: # 아까 생성한 CodeDeploy Agent 사용자의 .csv 파일 참고
AWS Secret Access Key [None]: # 아까 생성한 CodeDeploy Agent 사용자의 .csv 파일 참고
Default region name [None]: ap-northeast-2
Default output format [None]: json

# 4. agent 설치파일 다운받기
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install

# 5. 실행파일에 권한 추가하기
chmod +x ./install

# 6. 권한 추가되었는지 확인하기
ls -al

# 7. 설치 시작
sudo ./install auto    # 이슈 발생시 하단 참고!

# 8. 설치 완료되면, agent가 실행중인지 확인
sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Sat 2023-04-01 07:30:23 UTC; 27s ago
     Docs: man:systemd-sysv-generator(8)
     Process: 50281 ExecStart=/etc/init.d/codedeploy-agent start (code=exited, status=0/SUCCESS)
     Tasks: 2 (limit: 4620)
     Memory: 59.7M
     CPU: 1.054s
     CGroup: /system.slice/codedeploy-agent.service
          ├─50319 "codedeploy-agent: master 50319" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
          └─50321 "codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of master 50319"

# 9. EC2 인스턴스가 부팅되면 자동으로 AWS CodeDeploy Agent 가 실행될 수 있도록 스크립트 파일 생성
sudo vim /etc/init.d/codedeploy-startup.sh

# 9-1. 스크립트 파일내용
#!/bin/bash 
echo 'Starting codedeploy-agent' 
sudo service codedeploy-agent restart 

# 10. 파일 내용 확인
cat /etc/init.d/codedeploy-startup.sh

# 11. 스트립트 파일 저장 후, 실행권한 추가
sudo chmod +x /etc/init.d/codedeploy-startup.sh

3-5. 이슈) sudo ./install auto 실행시 /usr/bin/env: ‘ruby’: No such file or directory오류 발생할때

  • 동욱님 포스팅을 따라하던 중, 서버 환경이 달라서인지 나는 sudo ./install auto 이 명령어를 입력하니 루비가 없다는 오류메시지가 떴었다.

  • 일단은 루비가 없다고 하니, 루비를 설치해주기로 했다.

    • 실행 스크립트

      # 우선 apt package update
      $ sudo apt update
      
      # ruby 설치
      $ sudo apt install ruby-full
      
      # 설치 확인을 위한 ruby 버전 확인
      $ ruby --version
      ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
  • 루비 설치 후 다시 명령어 실행하니까 정상적으로 설치 완료되었다.

3-6. 프로젝트 내부 > buildspec.yml 수정하기

EC2 내부에 CodeDeploy 용 agent 까지 설치를 완료했다면, 프로젝트로 다시 이동하여 배포를 위해 buildspec.yml 파일을 수정해야한다.

지난번에 설정한 내용은 코드 빌드를 위해서 각 빌드 단계별 (빌드시, 빌드 후 등) 명령어를 세팅해뒀고 캐싱을 위해 경로정도만 설정하였다. 여기에 더하여 빌드 이후 배포 단계로 넘어갈 때, 프로젝트에서 빌드 결과물인 아티팩트에 같이 포함할 파일들을 설정해줄 수 있는데, 우리는 다음과 같은 설정으로 파일들을 포함할 것이다.

version: 0.2

phases:
  build:
    commands:
      - echo Entered the build phase...
      - echo Build Starting on `date`
      - cd arirang-first
      - chmod +x ./gradlew
      - ./gradlew clean build -x test
  post_build:
    commands:
      - echo Entered the post_build phase...
      - echo Build completed on `date`
      - echo $(basename ./build/libs/*.jar)
      - pwd

###################################################
# 코드를 빌드한 이후 빌드 결과물인 아티팩트에 포함시키기 위하여 새롭게 추가된 내용 
artifacts:
  files:
    - appspec.yml
    - build/libs/*.jar
    - scripts/**
  discard-paths: yes
  base-directory: arirang-first  # 기본 루트 디렉토리를 설정해준다. 없으면 그냥 해당 설정 자체를 없엔다.
###################################################

cache:
  paths:
    - '/root/.gradle/caches/**/*'
  • 다른 부분은 build 단계에서 최초로 생성할때와 다르지 않다.

  • artifacts 부분은 빌드 결과물에 포함할 파일들을 지정하는 것이다.

    • appspec.yml: AWS CodeDeploy 가 어떤 파일들을 어느 위치에 배포할지, 그리고 그 후에는 어떤 스크립트를 실행시킬건지 모두 관리하는 역할을 한다. 아래에서 추가해줄 예정이다.

    • buid/libs/*.jar : 빌드 결과로 생성된 jar 파일

    • scripts/**: 배포 이후 실행시킬 스크립트를 저장할 디렉토리이다. 없다면 루트 위치에 하나 만들어주자.

    • discard-paths : 절대경로를 버리고 루트/파일명으로 설정한다.

    • base-directory : 기본 루트 디렉토리를 설정해준다. 없으면 그냥 해당 설정 자체를 없엔다.

3-7. 프로젝트 내부 > appspec.yml 생성하기

앞서 말한대로 AWS CodeDeploy 가 어떤 파일들을 어느 위치에 배포하는지, 배포 후에는 어떤 스크립트를 실행하는지 관리하는 곳이 바로 이 appspec.yml 파일이다. buildspec.yml 이 있는 같은 디렉토리 상에서 파일을 생성해준다.

//디렉토리 구조

repository root 
L test-project 
	L gradle/wrapper
	L src
	L appspec.yml
	L buildspec.yml
	L build.gradle
	L gradlew
	L gradlew.bat
	L setting.gradle
L .gitignore
L README.md
# appspec.yml 

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/arirang-first/build/

permissions:
  - object: /
    pattern : "**"
    mode : 755
    owner : ubuntu
    group : ubuntu

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ubuntu
  ValidateService:
    - location: healthCheck.sh
      timeout: 60
      runas: ubuntu
  • files

    • 소스 스테이지에서 받은 전체 파일들을 EC2 서버 내부의 /home/ubuntu/arirang-first/build/로 옮겨준다는 뜻 (EC2 내부에 해당 위치에 미리 build 디렉토리를 생성해두자! )

  • permissions

    • files 섹션의 파일 및 디렉터리/폴더가 인스턴스에 복사된 후 특수 권한(있는 경우)이 어떻게 적용되어야 하는지를 지정하는 것이다.

    • 우리는 ubuntu 사용자 및 그룹으로 로그인하고 전체 파일에 대하여 읽고 실행할 수 있는 권한이 있어야하므로 755 라고 권한을 주었다. mode 부분이 이해가 안간다면 리눅스 권한부여 부분을 이해해야 한다. 아래의 공식문서에서 해당 내용을 설명해주니 참고해보자.

  • hooks

    • ApplicationStart : 배포된 앱이 시작될 때 발생하는 훅이벤트이다. 이 훅을 받았을 때, 미리 정해놓은 위치의 쉘스크립트를 실행하도록 설정했다.

    • ValidateService : 배포된 앱이 제대로 실행되었는지 확인하는 이벤트이다. 역시 이때 실행할 스크립트를 미리 지정해둔다.

3-8. 프로젝트 내부 > 배포용 쉘 스크립트 생성하기

appspec.yml 을 통해서 배포 후 어떤 쉘 스크립트를 실행할지 설정을 해주었다. 그를 위해 루트 디렉토리에 scripts 폴더를 만들고 아래의 스크립트 2개를 추가해주자.

# scripts > deploy.sh

#!/bin/bash
echo "> 아리랑 프로젝트 어플리케이션 배포 시작"

BUILD_PATH=/home/ubuntu/arirang-first/build/arirang-first-0.0.1.jar
JAR_NAME=$(basename $BUILD_PATH)
echo "> build 파일명: $JAR_NAME"

echo "> build 파일 복사"
DEPLOY_PATH=/home/ubuntu/arirang-first/
cp $BUILD_PATH $DEPLOY_PATH

echo "> arirang-first-0.0.1.jar 교체"
CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME
APPLICATION_JAR_NAME=arirang-first-0.0.1.jar
APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME

ln -Tfs $CP_JAR_PATH $APPLICATION_JAR

echo "> 현재 실행중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f $APPLICATION_JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 15
fi

echo "> $APPLICATION_JAR 배포"

CURRENT_SERVER_ADDRESS=$(hostname -I)
echo "> CURRENT_SERVER_ADDRESS : $CURRENT_SERVER_ADDRESS"

if [ ${CURRENT_SERVER_ADDRESS} = "10.2.10.20" ]
then
  echo "> 운영서버이므로 운영 환경으로 배포합니다."
  java -jar -Dspring.profiles.active=prod $APPLICATION_JAR > /dev/null 2> /dev/null < /dev/null &
else
  echo "> 개발서버이므로 개발 환경으로 배포합니다."
  java -jar $APPLICATION_JAR > /dev/null 2> /dev/null < /dev/null &
fi

echo "> 서버가 성공적으로 배포되었습니다. "
  • 기본적으로 동욱님이 제공해주신 스크립트에 실행환경부분을 구별하여 명령어를 분기할 수 있도록 커스텀하였다.

  • BUILD_PATH 에서 jar 파일명만 추출하여 배포하고자 하는 곳에 해당 파일명으로 소프트 링크를 만든다.

  • 현재 실행중인 프로세스 아이디 확인 후

    • 실행중인 프로세스가 있다면 중단시키고

    • 없다면 종료하지 않고 그대로 진행한다.

  • Jar 파일을 배포하는데, 개발과 운영 환경에 따라서 다른 profile 을 적용하여 jar 파일을 실행해야하므로 현재 서버의 호스트 네임을 조회한 뒤, 해당 결과값에 따라서 파일 실행 명령어를 분기처리한다.

  • 참고

# scripts > healthCheck.sh

#!/bin/bash
echo "> Arirang Health check 시작"
echo "> ps -ef | grep java"

for RETRY_COUNT in {1..15}
do
  RESPONSE=$(ps -ef | grep java)
  UP_COUNT=$(echo $RESPONSE | grep 'arirang-first-0.0.1.jar' | wc -l)

  if [ $UP_COUNT -ge 1 ]
  then # $up_count >= 1 ("UP" 문자열이 있는지 검증)
      echo "> Health check 성공"
      break
  else
      echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다."
      echo "> Health check: ${RESPONSE}"
  fi

  if [ $RETRY_COUNT -eq 10 ]
  then
    echo "> Health check 실패. "
    exit 1
  fi

  echo "> Health check 연결 실패. 재시도..."
  sleep 10
done
exit 0
  • 15번간 재시도를 하는데, 현재 앱 프로세스가 실행중이라면, UP_COUNT 가 1보다 커지게 되어 healthCheck 에 성공하게 된다.

  • healthCheck 에 실패하게 되면 다시 시도하게 된다.

  • 10번까지 재시도를 하게 되면 healthCheck 에 실패하여 스크립트가 비정상종료를 하도록 하였다.

3-9. 배포 스테이지 실행하기

위의 설정들을 추가한 뒤, 다시 프로젝트 내 변경사항을 커밋 & 푸시하여 소스 → 빌드 → 배포 스테이지를 실행한다. 배포가 성공적으로 완료된다면, 아까 buildspec.yml 내에 설정했던 것처럼 정해둔 아티팩트들이 EC2 서버 내로 이동한 것을 확인 가능하다.

서버 내에서 실행중인 프로세스도 확인 가능하다.

3-10. 이슈) S3 접근 권한 오류 : The provided role does not have sufficient permissions.

Unable to access the artifact with Amazon S3 object key 'arirang-pipeline/BuildArtif/mDNbhDK' located in the Amazon S3 artifact bucket 'arirang-deploy'. The provided role does not have sufficient permissions.
  • 간혹 배포 프로세스 실행 중에 위와 같은 오류메시지를 뱉으며 실패하는 경우가 있다.

  • 나의 경우 원인은 다양했는데 대략 아래와 같은 경우들이었다.

    • buildspec.yml YAML 파일 내 문법 오류

      • 내부에서 artifacts 의 base-directory 경로를 설정해주지 않아서 BuildArtifact 에 포함할 파일들의 위치를 찾지 못하였을 때 appspec.yml 파일들 찾아서 포함시켜주지 못해서 오류가 발생한다.

      • 내부에서 artifacts 관련 YAML 파일 내 문법이 오류가 있었을 때

    • appspec.yml 파일 내에서 permission 세팅에 오류가 있었을 때

3-11. 이슈) 배포 스테이지 설정시 로드밸런서 설정을 했을 경우

배포 스테이지를 생성할 때 실수로 로드밸런싱 활성화를 체크한 적이 있었다. 트래픽 관련 이벤트 때문에 일반적으로 구성한 배포 스테이지보다 실행 이벤트가 굉장히 많아진 것을 볼 수 있다. 실수로 체크하지 않도록 주의하자.

3-12. (보너스) EC2 서버 내 CodeDeploy 로그 확인하기위한 소프트링크 연결하기

EC2 서버 내부에는 배포 이후 되도록 지정한 스크립트가 실행된 내용이 로그로 남겨지고 있다. 그 위치가 너무 멀리 있기 때문에 홈 디렉토리에서 소프트링크로 연결해보도록 하자.

# ln -s 파일또는디렉토리경로 바로가기명

ln -s /opt/codedeploy-agent/deployment-root/ deployment-root
ln -s /home/ubuntu/holostanding-admin/deployment-root/deployment-logs/codedeploy-agent-deployments.log codedeploy-agent-deployments.log

통해 기타 다른 설정들을 참고할 수 있다.

IAM 에서는 1) 그룹을 만들고 2) 그 그룹에 정책을 연결한 뒤 3) 해당 그룹에 들어갈 사용자를 추가해주는 방식으로 관리가 되므로 먼저 그룹을 만들어준다. (이 부분이 이해가 안간다면 을 참고할 것)

추가적인 설정은 를 참고하자.

자세한 내용은 를 참고해보자

: hostname -I

🏰
AWS CodeBuild 공식문서를
이 포스팅
09 1. AWS CodeDeploy 활용
(공식문서) 우분투에 루비 설치하기
AWS 공식문서
AWS 공식문서
기타 다른 훅 및 상세한 설명은 AWS 공식문서 참고
현재 서버 hostname 가져오는 쉘 명령어
동욱님의 AWS로 배포하기 시리즈 포스팅
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled