728x90

"맥북 한 대를 빌드 서버로 책상 밑에 두는 것"만큼 인프라 담당자 속을 긁는 게 없다. 랙에 못 넣고, 이미지 관리가 안 되고, OS 업데이트 한 번에 파이프라인이 통째로 멎는다. 그래서 주기적으로 "Linux 러너에서 macOS 툴체인 못 돌리나?"라는 질문이 올라오고, 그 답변 후보 중 하나가 Darling이다.

1. 왜 지금 다시 Darling 이야기가 나오나

Darling은 하드웨어 에뮬레이션 없이 macOS(Darwin) 바이너리를 Linux에서 직접 실행하는 변환 계층이다. QEMU처럼 CPU를 흉내내는 게 아니라, x86_64 명령어는 그대로 호스트 CPU에서 돌리고 OS 경계에서만 번역한다. 포지션은 Wine과 같다. Wine이 Windows에 대해 하는 일을 Darling이 macOS에 대해 하는 것이고, 프로젝트 스스로도 그렇게 설명한다.

실무에서 이 주제가 반복해서 소환되는 이유는 명확하다.

  • iOS/macOS 빌드 때문에 CI 풀 전체가 이원화된다. Linux 러너는 Kubernetes로 오토스케일하는데, macOS 러너만 고정 대수 + 수동 프로비저닝.
  • 클라우드 macOS 인스턴스는 비싸고, 전용 호스트 기반이라 최소 할당 시간 같은 제약이 붙는다(정확한 조건은 각 클라우드 공식 문서 확인 필요).
  • Apple 실리콘 전환 이후 x86 맥 미니 재고로 버티던 조직들이 하드웨어 교체 압박을 받고 있다.

결론부터 말하면 Darling으로 Xcode 빌드 파이프라인을 대체하는 건 현재로선 불가능하다. 다만 "왜 불가능한가"를 이해하면 대안 설계가 훨씬 정확해진다. 그리고 CLI 도구 수준에서는 실제로 쓸 구석이 있다.

2. 동작 원리 — Wine과 결정적으로 다른 지점

바이너리 포맷부터 다르다

Linux는 ELF를 로드한다. macOS 바이너리는 Mach-O다. 커널의 binfmt 핸들러가 Mach-O를 모르니, Darling은 자체 로더(ELF로 빌드된 실행 파일)를 먼저 띄우고 그 프로세스 주소 공간에 Mach-O 이미지와 Darling판 dyld를 매핑한다. 그다음부터는 dyld가 /System/Library/Frameworks/... 경로의 dylib들을 링크한다. 여기서 dyld는 Apple 것이 아니라 Darling이 재구현/포팅한 것이다.

Wine은 API 레벨, Darling은 syscall 레벨까지 내려간다

이 차이가 핵심이다. Windows는 syscall 번호가 버전마다 바뀌는 비공개 인터페이스라, 정상적인 Windows 앱은 절대 syscall을 직접 호출하지 않고 kernel32.dll 같은 DLL을 거친다. 그래서 Wine은 DLL을 갈아끼우는 것만으로 대부분 해결된다.

macOS도 공식적으로는 "libSystem을 통해서만 호출하라"고 하지만, 실제 바이너리는 libsystem_kernel.dylib를 통해 BSD syscall과 Mach trap을 직접 때린다. Mach 포트, IPC, 태스크/스레드 추상화는 Linux에 대응물이 없다. 그래서 Darling은 다음을 다 만들어야 한다.

  • libsystem_kernel 대체 — Darwin syscall을 Linux syscall로 번역
  • Mach IPC / 포트 서브시스템
  • launchd, notifyd 같은 Darwin 데몬
  • Foundation, CoreFoundation 등 프레임워크 (상당 부분 오픈소스 Darwin 코드 기반)

Mach IPC 때문에 Darling은 오랫동안 커널 모듈을 요구했고, 이후 이 의존을 줄이려는 방향의 작업이 진행돼 왔다. 현재 릴리스에서 커널 모듈이 필수인지 여부는 버전에 따라 다르므로 공식 문서 확인 필요다. 인프라 관점에서는 이 한 줄이 도입 가능성을 좌우한다. 커널 모듈이 필요하면 관리형 Kubernetes 노드나 대부분의 SaaS CI에서는 그냥 끝이다.

prefix 개념

Wine에 ~/.wine이 있듯 Darling에는 ~/.darling 프리픽스가 있고, 그 안에 Darwin 파일시스템 레이아웃(/System, /usr/lib, /Users)이 구성된다. 마운트 네임스페이스와 오버레이를 써서 호스트 파일시스템 위에 Darwin 뷰를 씌우는 구조다. 컨테이너 안에서 굴릴 때 권한 문제가 터지는 이유가 바로 여기다.

3. 실무 관점 — 확인 명령, 흔한 함정, 대안

먼저 확인할 것: 내 바이너리가 애초에 후보인가

Darling 셸에 들어가기 전에 호스트 Linux에서 아키텍처와 의존성부터 본다. Apple 실리콘용 arm64 전용 바이너리라면 x86_64 Linux에서는 시작조차 못 한다.

$ file ./MyTool
./MyTool: Mach-O 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|PIE>

$ file ./MyToolUniversal
./MyToolUniversal: Mach-O universal binary with 2 architectures:
  [x86_64:Mach-O 64-bit x86_64 executable]
  [arm64:Mach-O 64-bit arm64 executable]

$ darling shell
Darwin ... x86_64
bash-3.2$ otool -L /Users/me/MyTool
/Users/me/MyTool:
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, ...)
  /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation

(uname/버전 문자열은 Darling 빌드 시점에 따라 달라진다.) otool -L에 나온 프레임워크 목록이 사실상 성공 확률표다. Foundation/CoreFoundation 수준이면 해볼 만하고, AppKit·Metal·Security 같은 게 줄줄이 나오면 접는 게 낫다.

CI에 넣는다면 스모크 테스트를 반드시 앞단에

Darling은 "일부는 되고 일부는 안 되는" 계층이다. 파이프라인 중간에서 죽으면 원인 파악에 하루가 날아간다. job 맨 앞에 5초짜리 게이트를 둔다.

#!/usr/bin/env bash
# darling-smoke.sh — 파이프라인 최상단에서 실행
set -euo pipefail

command -v darling >/dev/null || { echo "darling 미설치"; exit 1; }

# 1) 런타임이 살아있는지
darling shell true || { echo "darling 런타임 기동 실패"; exit 1; }

# 2) 대상 바이너리 아키텍처 확인
file "$1" | grep -q 'x86_64' || { echo "x86_64 슬라이스 없음: $1"; exit 1; }

# 3) 실제 링크 가능한지 (여기서 dyld 에러가 잡힌다)
if ! darling shell otool -L "$1" >/dev/null 2>&1; then
  echo "의존성 확인 실패 — 미구현 프레임워크 가능성"; exit 1
fi
echo "smoke ok"

흔한 함정 1 — dyld image not found

가장 자주 보게 될 실패다. 해당 프레임워크가 Darling에 아직 없거나, 스텁만 있고 심볼이 비어 있는 경우다.

$ darling shell ./MyTool
dyld: Library not loaded: /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices
  Referenced from: /Users/me/MyTool
  Reason: image not found
Trace/breakpoint trap

해결책이랄 게 별로 없다. macOS 실기에서 dylib를 복사해 넣는 방법이 떠오르겠지만, Apple 프레임워크 재배포는 라이선스 문제라 사내 CI 이미지에 굽는 순간 법무 이슈가 된다. 실무적으로는 그 기능을 쓰지 않는 빌드 옵션을 찾거나 포기하는 쪽이 빠르다.

흔한 함정 2 — 컨테이너 안에서 Bad system call

Docker 기본 seccomp 프로파일은 흔치 않은 syscall과 일부 네임스페이스 조작을 막는다. Darling은 프리픽스를 만들 때 마운트 네임스페이스를 쓰기 때문에 정면으로 충돌한다.

$ docker run --rm -it my/darling:latest darling shell uname -a
Bad system call (core dumped)

또는 이런 계열도 본다.

mount: permission denied
darling: failed to set up prefix at /root/.darling

완화 방법은 --security-opt seccomp=unconfined, --cap-add SYS_ADMIN, 최악의 경우 --privileged다. 문제는 이게 "CI 러너 컨테이너에 특권을 준다"는 뜻이라는 것. 멀티테넌트 CI에서는 보안팀이 승인 안 해준다. 전용 노드풀 + taint로 격리하는 정도가 현실적 타협선인데, 그 시점이면 "그냥 mac mini 한 대 두는 것"과 운영 부담을 비교해봐야 한다. 정확히 어떤 capability가 필요한지는 버전에 따라 다르므로 공식 문서 확인 필요.

흔한 함정 3 — 결국 Xcode가 필요하다

iOS 앱 빌드는 xcodebuild, 코드 서명은 codesign과 키체인, 배포는 공증(notarization)까지 엮인다. Xcode는 Darling에서 돌지 않고, 배포도 못 한다. 즉 "Linux에서 iOS 앱 CI"라는 원래 목표에는 Darling이 답이 아니다.

bash-3.2$ xcodebuild -version
bash: xcodebuild: command not found

그럼 뭘 쓰나

  • osxcross: Linux에서 clang으로 macOS 타깃 크로스컴파일. 실행이 아니라 빌드가 목적이면 이쪽이 훨씬 실용적이다. 단 macOS SDK를 Xcode에서 추출해야 하므로 라이선스 검토는 똑같이 필요하다.
  • zig cc: 간단한 C/C++ 프로젝트라면 크로스 타깃 지정만으로 macOS 바이너리를 뽑을 수 있어 세팅이 가볍다.
  • 실제 macOS 러너 + 역할 분리: 가장 현실적. 유닛 테스트·정적 분석·의존성 캐시 같은 플랫폼 무관 단계는 Linux에서 돌리고, macOS 러너는 컴파일·서명·공증만 담당하게 줄인다. macOS 러너 점유 시간을 절반 이하로 줄이는 게 비용 관점에서 Darling 도입보다 확실한 성과다.

반대로 Darling이 실제로 값어치를 하는 구간도 있다. macOS용 CLI 유틸리티를 만드는 팀이 PR 단계 스모크 테스트(바이너리가 뜨는지, --version이 나오는지)를 Linux 러너에서 저렴하게 돌리는 용도, 그리고 Mach-O 로딩이나 dyld 동작을 뜯어보는 리버싱·학습 환경이다.

4. 정리

한 줄 요약: Darling은 "macOS용 Wine"이지만, Wine보다 훨씬 아래(Mach trap·syscall)까지 재구현해야 해서 커버리지가 좁다. CLI 도구 실행에는 쓸 만하고, Xcode 기반 iOS 파이프라인 대체용으로는 아직 아니다.

  • 써볼 만한 경우: macOS용 CLI 바이너리의 가벼운 실행 검증, Mach-O/dyld 학습과 리버싱, GUI 없는 오픈소스 도구의 크로스 플랫폼 확인.
  • 쓰면 안 되는 경우: 프로덕션 iOS/macOS 앱 빌드·서명·배포, GUI 앱 테스트, 특권 컨테이너를 허용할 수 없는 멀티테넌트 CI.
  • 도입 전 체크리스트: ① 현재 버전이 커널 모듈을 요구하는가 ② 대상 바이너리에 x86_64 슬라이스가 있는가 ③ otool -L 의존성이 Foundation 수준에서 끝나는가 ④ Apple 프레임워크/SDK 취급에 대한 법무 검토가 끝났는가.

개인적으로는 "Linux에서 macOS를 돌린다"보다 "macOS 러너가 꼭 해야 하는 일만 남기고 다 걷어낸다"가 인프라팀이 먼저 손대야 할 문제라고 본다. 그래도 Darling 같은 프로젝트가 살아있는 건 반갑다. 언젠가 Wine처럼 "대부분 그냥 된다"가 되면, 그때는 정말 판이 바뀐다.

참고 자료

728x90
728x90

이 글에서 다루는 이슈는 아직 실무자들 사이에서 폭넓게 검증된 상태는 아니다. Ingo Blechschmidt가 Mastodon에서 공유한 조사 내용을 출발점으로 하며, 원인·영향 범위 중 일부는 본인 환경에서 직접 확인이 필요한 부분임을 먼저 밝혀둔다. 그럼에도 다루는 이유는 명확하다. FDE(Full Disk Encryption)를 굴리는 노트북·서버에서 suspend 후 메모리에 키가 남는다는 건, 우리가 그동안 "당연히 지워진다"고 믿고 세운 위협 모델이 무너진다는 뜻이기 때문이다.

1. 도입: 왜 지금 화제이고 어떤 문제를 푸는지

상황을 실무 시나리오로 그려보자. 회사 노트북에 LUKS로 전체 디스크를 암호화해놨다. 카페에서 작업하다 뚜껑 닫고(suspend-to-RAM) 화장실 다녀오는 사이 누가 노트북을 들고 튄다. 우리가 기대하는 건 이거다. "suspend 상태에서는 디스크 암호화 키가 메모리에서 지워져 있어야 한다. 그래야 콜드부트 공격이나 메모리 덤프로 키를 뽑아내지 못한다."

이 "suspend 시 키 wiping" 기능이 cryptsetup luksSuspend의 핵심 보안 가치다. 그런데 Ingo Blechschmidt의 조사에 따르면 Linux 6.9부터 LUKS suspend가 메모리에서 키를 제대로 지우지 않는 회귀(regression) 버그가 들어갔다는 것이다. 즉, 사용자는 "나는 suspend하면 키가 지워지니까 안전하다"고 믿고 있는데, 실제 커널 메모리에는 키가 그대로 남아있는 상태다. 보안에서 가장 위험한 상황은 "취약한 것"보다 "안전하다고 오해하는 것"인데, 정확히 그 케이스다.

정확한 커널 커밋·수정 여부는 공식 커널 changelog와 cryptsetup 이슈 트래커에서 반드시 재확인해야 한다. 이 글은 원인 분석과 실무 대응에 초점을 맞춘다.

2. 핵심: LUKS/dm-crypt는 키를 어디에 어떻게 들고 있나

먼저 그림을 맞추자. LUKS는 크게 두 층으로 나뉜다.

  • LUKS 헤더 (키 슬롯): 디스크에 저장되는 부분. 사용자 패스프레이즈로 잠긴 "마스터 키의 암호화된 사본"이 들어있다. 슬롯이 여러 개라 패스프레이즈를 여러 개 걸 수 있다.
  • dm-crypt (마스터 키): 부팅/언락 시점에 패스프레이즈로 슬롯을 풀어 마스터 키를 복원하고, 이걸 커널 메모리에 올려서 실제 블록 암복호화에 쓴다.

비유하자면, LUKS 헤더는 "금고 열쇠를 여러 개의 자물쇠 상자에 나눠 보관한 것"이고, dm-crypt는 "그 금고 열쇠를 실제로 손에 쥐고 계속 문을 여닫는 사람"이다. 디스크가 활성 상태인 동안 이 마스터 키는 커널 메모리에 상주한다. 이게 없으면 매 I/O마다 암복호화를 못 한다.

현재 매핑 상태는 이렇게 확인한다.

$ sudo dmsetup table --showkeys cryptroot
0 500107776 crypt aes-xts-plain64 a3f1c2...실제키바이트...9e 0 8:3 4096

# 키를 감춰서 보고 싶으면:
$ sudo dmsetup table cryptroot
0 500107776 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000 0 8:3 4096

--showkeys를 붙이면 마스터 키 원본이 그대로 출력된다. 이게 곧 "커널이 이 키를 평문으로 들고 있다"는 증거다. suspend 후에도 이 키가 살아있으면 문제인 것.

suspend 시 무슨 일이 일어나야 하는가

정상적인 흐름은 이렇다. cryptsetup luksSuspend를 호출하면:

  1. 해당 dm-crypt 디바이스에 대한 I/O를 얼린다(freeze).
  2. 커널 메모리에서 마스터 키를 wipe한다.
  3. 다시 쓰려면 luksResume로 패스프레이즈를 재입력해 마스터 키를 복원한다.

여기서 핵심은 2번이다. suspend-to-RAM 상태에서는 RAM에 전원이 유지되므로, 키를 지우지 않으면 그 RAM 내용을 그대로 덤프하거나 콜드부트 공격으로 뽑아낼 수 있다. 회귀 버그의 요지는 이 2번 단계가 실질적으로 무력화됐다는 것이다. 커널이 키를 지웠다고 생각하지만 어딘가(예: 키링, 슬랩 캐시, 복사본)에 남아있다는 방향으로 보인다. 정확한 메모리 잔존 위치는 원문 조사 및 커널 소스 확인이 필요하다.

3. 실무 관점: 확인 방법, 트레이드오프, 흔한 함정

영향 받는지 확인하기

먼저 커널 버전부터. 6.9 이상이면 일단 의심 대상이다.

$ uname -r
6.9.7-arch1-1

$ cryptsetup --version
cryptsetup 2.7.2 flags: UDEV BLKID KEYRING KERNEL_CAPI PWQUALITY 

실제로 키가 남는지 거칠게나마 검증하는 절차는 이렇다. 반드시 데이터 백업이 있는 테스트 환경에서 하자. 루트 파일시스템에 걸린 crypt 디바이스를 실서버에서 suspend/resume 만지다가 시스템을 얼려먹기 딱 좋다.

# 1) suspend 전: 마스터 키 존재 확인
$ sudo dmsetup table --showkeys testcrypt | awk '{print $5}'
a3f1c2...9e   # 키가 보임 (정상, 활성 상태니까)

# 2) suspend 수행
$ sudo cryptsetup luksSuspend testcrypt

# 3) suspend 후: 키가 지워졌는지 확인
$ sudo dmsetup table --showkeys testcrypt | awk '{print $5}'
00000000000000000000000000000000   # 지워졌다면 이렇게 0으로 나와야 정상
# a3f1c2...9e                       # 여전히 보이면 회귀 버그 의심

주의할 점: dmsetup table이 0을 보여준다고 해서 RAM 어딘가의 복사본까지 전부 지워졌다는 보장은 아니다. 반대로 여전히 키가 보인다면 명백히 문제다. 완전한 검증은 실제 물리 메모리 덤프 분석 영역이라 일반 실무 범위를 넘는다.

흔한 함정 1: luksSuspend 후 시스템이 통째로 멈춘다

가장 자주 밟는 지뢰. 루트 파일시스템이 올라간 crypt 디바이스에 luksSuspend를 걸면 그 순간부터 디스크 I/O가 얼어서 luksResume 명령을 실행할 바이너리조차 디스크에서 못 읽어온다. 데드락이다.

$ sudo cryptsetup luksResume cryptroot
# ...무한 대기, 아무 반응 없음. 셸도 먹통.

그래서 노트북 잠금 자동화(예: systemd-suspend hook)에서는 luksResume에 필요한 바이너리·라이브러리를 미리 메모리에 락(mlock)해두는 별도 도구를 쓴다. 이걸 직접 구현하려다 자기 노트북 벽돌 만드는 사람 여럿 봤다. 검증된 훅 스크립트나 배포판 제공 유틸을 쓰자.

흔한 함정 2: Device or resource busy

테스트하겠다고 아무 crypt 디바이스나 suspend하려다 만나는 에러.

$ sudo cryptsetup luksSuspend testcrypt
Device testcrypt is still in use.

# 또는 언마운트/detach 시:
$ sudo cryptsetup close testcrypt
device-mapper: remove ioctl on testcrypt failed: Device or resource busy
Cannot deactivate device.

해당 디바이스를 참조하는 마운트나 프로세스가 남아있어서다. sudo lsof +f -- /dev/mapper/testcryptsudo fuser -m /mnt/test로 물고 있는 놈부터 정리하고 다시 시도해야 한다.

트레이드오프와 완화 조치

회귀 버그가 확인된 환경에서 당장 취할 수 있는 현실적인 선택지들:

  • suspend-to-RAM 대신 hibernate(suspend-to-disk) 또는 완전 종료: RAM에 전원을 유지하지 않으면 콜드부트 공격 표면이 크게 줄어든다. 단, hibernate는 메모리 이미지를 swap에 쓰므로 swap도 반드시 암호화돼 있어야 한다. 안 그러면 키가 평문 swap으로 흘러들어간다. 이건 이 버그와 무관하게 원래 지켜야 하는 원칙.
  • 버그 없는 커널 버전 사용: 6.9 이전(예: 6.6 LTS 계열)으로 고정하거나, 수정 커밋이 백포트된 버전으로 올린다. LTS 커널을 쓰는 게 이런 회귀 대응에 유리하다.
  • 물리 접근 통제 강화: 결국 콜드부트/메모리 덤프는 물리 접근이 전제다. 자리 비울 땐 suspend가 아니라 종료 습관을 조직 정책으로 잡는 게 소프트웨어 패치보다 확실할 때가 많다.

대안 없이 "6.9 이상은 무조건 위험" 식으로 단정하진 말자. 배포판이 자체 패치를 백포트했을 수 있으니, 실제 wipe 여부는 위 dmsetup table --showkeys 절차로 본인 환경에서 직접 확인하는 게 맞다.

4. 정리: 한 줄 요약 + 누가 언제 챙겨야 하나

한 줄 요약: Linux 6.9 이후 LUKS suspend가 메모리에서 마스터 키를 제대로 지우지 않는 회귀가 보고됐고, "suspend하면 키가 지워진다"는 전제를 깔고 있던 FDE 위협 모델을 다시 점검해야 한다.

지금 당장 챙겨야 하는 사람:

  • LUKS FDE 노트북을 들고 다니는 사람, 특히 자리 비울 때 suspend 습관이 있는 경우
  • 보안 컴플라이언스(예: 디바이스 암호화 정책)를 문서로 관리하는 팀 — "suspend 시 키 wiping"을 근거로 삼았다면 근거가 흔들린다
  • 물리 접근 위협이 실재하는 환경(공유 오피스, 데이터센터 콜로, 현장 배치 장비)

당장 안 급한 사람: 물리 접근이 강하게 통제되는 서버룸의 상시 가동 서버는 우선순위가 낮다. 애초에 suspend를 안 쓰고, RAM 물리 탈취 위협이 낮다면 이 버그의 실질 리스크는 제한적이다. 그래도 커널 버전 트래킹 대상에는 올려두자.

액션 아이템 체크리스트:

  1. uname -r로 6.9 이상 여부 확인
  2. 테스트 환경에서 luksSuspenddmsetup table --showkeys로 wipe 실제 동작 검증
  3. 영향받으면: LTS 커널 고정 / 종료·hibernate 정책 전환 / swap 암호화 확인
  4. cryptsetup·커널 이슈 트래커에서 수정 커밋 상태 추적

참고 자료

※ 이 글의 원인·영향 범위 일부는 원문 제보 기반이며, 배포판별 패치 여부에 따라 실제 동작이 다를 수 있다. 프로덕션 적용 전 반드시 본인 환경에서 검증하고 공식 소스를 교차 확인하길 권한다.

728x90
728x90

이번 포스팅에서는 DB와 서버를 생성해보도록 하겠습니다. 

 

제일 먼저 생성할 자원은 DB입니다 

(CDB for MySQL은 2 vCPU, 4GB RAM 사용시 160원/시간이 청구됩니다)

 

아래 사진과 같이 CDB for MySQL로 이동하여 DB생성을 눌러서 진행합니다. 

CDB for MySQL 생성

 

 

생성을 누르게 되면 아래와 같이 설정을 하는 창이 뜨는데 다음과 같이 입력해주시고 넘어가시면 되겠습니다. 

    - DB 엔진 버전 mysql(8.0.25)

    - 고가용성 지원 체크해제 

    - VPC 및 Subnet(issac-db) 선택

    - DB Server 이름 및 서비스 이름 임의로 설정

DB 생성 창 - 1

DB생성 두번째 창입니다. 이 부분은 실제로 DB접속 정보와 DB를 구성하는 정보를 입력하는 페이지 입니다 

    - User_ID는 DB에 접속할때 사용하는 ID 입니다

    - HOST(IP)는 DB에 접속허용할 IP를 정하는 옵션입니다. 여기서는 모든 IP를 허용하기 위해 '%' 를 입력하였습니다

      (좋은 방법은 아닙니다, 실제에서는 최소한의 권한을 주기위해 WAS IP대역을 주는 것을 권장합니다만,

       연습이니까 그냥 줬습니다)

    - USER 암호는 접속 암호입니다.

    - 기본 DB명은 최초에 생성할 DB명입니다, 여기서 생성할 DB를 Wordpress설치시 사용할것이기 때문에, 기억해주도록        합시다 

DB 생성 창 - 2

이렇게 하시면 DB는 생성완료입니다, 참 쉽죠? ㅋㅋㅋ

 

자 이제 서버 생성입니다 

 

서버는 총 2대(Web, WAS)를 생성할 시간입니다. 

저는 미리 서버를 생성해서 서버2대가 보이지만.. 

Server -> + 서버 생성을 클릭하여 서버 생성창으로 이동합니다.

서버 생성 버튼 클릭

 

서버 생성 첫번째 창입니다. 

저희는 CentOS 7.8버전을 사용하겠습니다

NCP는 서버 용량이 Windows는 100GB, Linux는 50GB로 고정되어 있습니다. 

서버 타입은 제일 저렴한 서버타입이 있는 High CPU를 고르시고 넘어가시면 되겠습니다

(서버는 2 vCPU, 4GB RAM 사용시 100원/시간이 청구됩니다)

서버 생성 - 1

 

서버 생성 2번째 페이지 입니다. 

    - VPC와 Subnet을 알맞게 정하고 

    - 서버 타입은 vCPU 2개 4GB RAM

    - 시간 요금제

    - 서버 이름은 web서버는 wordpress-web, WAS는 wordpress-was, 

    - Network Interface에서 IP를 입력하지 않으시고 추가를 누르시면 자동으로 IP가 할당됩니다 

    - wordpress-web 서버는 새로운 공인IP 할당을 해줍니다. 

서버 생성 - 2

 

서버 생성 세번째 페이지 입니다. 

인증키를 설정하는 페이지 입니다. 

이미 인증키아 있으신분들은 선택하시고 넘어가시고

없으신 분들은 "새로운 인증키 생성"을 통해 인증키를 생성 및 다운로드 하시고 넘어가면 되겠습니다.

(두번째 서버는 보유하고 있는 인증키 이용 하시면 됩니다)

서버 생성 - 3

 

서버 생성 네번째 페이지 입니다 

이전 포스팅에서 생성했던 ACG를 할당하는 페이지 입니다. 

wordpress-web 서버는 issac-pub-acg를 할당하고 넘어가시고

wordpress-was 서버는 issac-pub-pri를 할당하시고 넘어가시면 되겠습니다. 

서버 생성 - 4

 

이로써 서버 생성도 완료되었습니다!

728x90
728x90

안녕하세요, 이번 포스팅에서는 NCP상에서 3 Tier 구성으로 Wordpress를 구축을 해보는 과정을 보여드리려고 합니다. 

 

긴말하지 않고 보시죠 

 

일단 인터넷에서 말하는 2 Tier와 3 Tier의 차이점은 다음과 같습니다. 

    1.  2 Tier 에서는 클라이언트 서버에서 DB서버로 집적 데이터를 입력하고 불러오는 방식이다

         장점 개발이 편리하다, 개발비용이 저렴하다, 유지보수가 쉽다

         단점 보안에 취약하다, 서버에 부하가 일어나기 쉽다.

    2.  3 Tier 에서는 클라이언트 서버에서 비즈니스 로직을 담당하는 역할을 떼어내 독립된 서버로 만든 구조이다

         장점 보안이 강화된다, 서버의 부하를 줄일 수 있다.

         단점 관리 포인트가 늘어난다, 개발기간이 늘어난다

 

구성은 다음과 같이 차이가 나구요! 

2Tier vs 3Tier

진짜 기초부터 차근차근 만들어 보겠습니다. 

 

일단 NCP에 로그인을 하신뒤 아무것도 없는 가정하에 VPC부터 생성해보겠습니다. 

10.0.0.0/16 대역 VPC 생성

저는 10.0.0.0/16 대역으로 VPC를 생성하였습니다

 

 

다음은 VPC내부에 서브넷 생성입니다. 

 

Subnet 생성

서브넷은 총 3개를 생성합니다, 하나는 Web서버가 할당될 public 서브넷, WAS 전용 private 서브넷, DB전용 private 서브넷,

서브넷 정보는 다음과 같습니다. 

Subnet 이름  IP 주소  internet Gateway 전용 여부 용도
issac-db 10.0.2.0/24 N(Private) 일반
issac-pri 10.0.1.0/24 N(Private) 일반
issac-pub 10.0.0.0/24 Y(Public) 일반

 

다음은 Private Subnet에서 만들어지는 WAS서버에서 Yum으로 프로그램 설치를 위한 NAT Gateway 생성 및 Route Table 설정입니다. 

Nat Gateway 생성

 

Route table은 AWS에서와는 조금 다르게 default Private route table 에 집적 걸어줍니다!

Route Table 설정
Route Table&nbsp; 내용 추가

다음은 서버에 적용할 ACG를 생성해보겠습니다.

(본 포스팅에서는 NACL은 따로 적용하지 않겠습니다 따로 기회가 되면 올려보도록 할게요!ㅎㅎ)

 

Server -> ACG생성

ACG이름 적용 Network Interface
issac-pub-pri wordpress-was
issac-pub-acg wordpress-web

(*만들다 보니... 이름을 잘못지었네요..ㅠㅠ issac-pub-pri는 private Subnet의 was에 적용되는 ACG입니다)

 

룰은 다음과 같이 만들어 줍니다.

issac-pub-acg inbound
issac-pub-acg outbound
issac-pub-pri inbound
issac-pub-pri outbound

 

마지막으로 아래의 룰을 두개의 ACG의 outbound에 추가합니다. 

(추가하지 않으면 epel 로 설치하는 Package가 설치 되지 않는다.)

공통 outbound 룰

 

아래 ACG설정은 CDB for MySQL을 생성후 진행한다,(아래 CDB for MySQL 생성하는 스텝 진행 후 올라와서 진행합니다)

CDB for MySQL inbound

 

ACG 설정하시느라 고생하셨어요! 이제 사전작업은 끝났습니다!

 

이제 서버와 DB를 생성하러 가보시죠!

728x90

+ Recent posts