<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>행복하기 위한 삶</title>
    <link>https://happyengine.tistory.com/</link>
    <description>FinOps, AWS, Linux, DevOps, DevSepOps, Cloud, Love, Jesus</description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 15:03:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>워니주니구니</managingEditor>
    <image>
      <title>행복하기 위한 삶</title>
      <url>https://tistory1.daumcdn.net/tistory/4324583/attach/03938baba64f4fdfa2d62a28ca9e4736</url>
      <link>https://happyengine.tistory.com</link>
    </image>
    <item>
      <title>direnv 사용법</title>
      <link>https://happyengine.tistory.com/255</link>
      <description>&lt;h1&gt;zsh에서 direnv (핸즈온)&lt;/h1&gt;
&lt;p&gt;공식 문서: &lt;a href=&quot;https://direnv.net/&quot;&gt;direnv.net&lt;/a&gt; — 아래는 여러 AWS 계정 쓸 때 &lt;code&gt;AWS_PROFILE&lt;/code&gt;·kubectl 컨텍스트를 디렉터리마다 고정하는 &lt;strong&gt;한 번에 붙여 넣기&lt;/strong&gt; 예시다. &lt;code&gt;REPO&lt;/code&gt;만 본인 클론 경로로 바꾼 뒤 위에서 아래로 실행하면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# --- 최초 1회: 설치 + zsh 훅 ---
brew install direnv
grep -q &amp;#39;direnv hook zsh&amp;#39; ~/.zshrc 2&amp;gt;/dev/null || echo &amp;#39;eval &amp;quot;$(direnv hook zsh)&amp;quot;&amp;#39; &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc

# --- 레포 준비 (이 줄만 수정) ---
REPO=/path/to/repo
cd &amp;quot;$REPO&amp;quot;

# --- 루트 .envrc (플레이스홀더는 본인 값으로) ---
cat &amp;gt; .envrc &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
export AWS_PROFILE=YOUR_AWS_PROFILE
export KUBECONFIG=&amp;quot;${KUBECONFIG:-$HOME/.kube/config}&amp;quot;
kubectl config use-context arn:aws:eks:REGION:ACCOUNT_ID:cluster/CLUSTER_NAME &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || true
EOF

direnv allow .

# --- terraform/.envrc (루트와 별도 파일, source_up 한 줄. terraform/ 디렉터리 필요) ---
mkdir -p terraform
echo &amp;#39;source_up&amp;#39; &amp;gt; terraform/.envrc
direnv allow terraform

# --- 확인 ---
cd &amp;quot;$REPO/terraform&amp;quot;
echo &amp;quot;AWS_PROFILE=$AWS_PROFILE&amp;quot;
kubectl config current-context&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.envrc&lt;/code&gt; 내용을 고쳤으면 그 디렉터리에서 &lt;code&gt;direnv allow&lt;/code&gt; 다시 실행한다.&lt;/p&gt;</description>
      <category>기타/scripts</category>
      <category>devops</category>
      <category>direnv</category>
      <category>https://direnv.net/</category>
      <category>Infra</category>
      <category>script</category>
      <category>switch account</category>
      <category>Terraform</category>
      <category>Zsh</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/255</guid>
      <comments>https://happyengine.tistory.com/255#entry255comment</comments>
      <pubDate>Thu, 26 Mar 2026 18:41:17 +0900</pubDate>
    </item>
    <item>
      <title>MAC OS Bootstraping</title>
      <link>https://happyengine.tistory.com/254</link>
      <description>&lt;h1&gt;새 Mac 한 번에 세팅: Homebrew, Brewfile, Oh My Zsh&lt;/h1&gt;
&lt;p&gt;기존 맥에서 쓰던 Homebrew 패키지 목록을 &lt;code&gt;Brewfile&lt;/code&gt;로 모아 두고, 새 맥에서는 스크립트 하나로 &lt;strong&gt;Command Line Tools → Homebrew → 패키지 일괄 설치 → Oh My Zsh&lt;/strong&gt;까지 돌리는 방법을 정리했다.&lt;/p&gt;
&lt;h2&gt;무엇을 하는지&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Xcode Command Line Tools가 없으면 설치를 유도하고, 끝나면 다시 실행하라고 안내한다.&lt;/li&gt;
&lt;li&gt;Homebrew가 없으면 공식 설치 스크립트로 비대화형 설치한다.&lt;/li&gt;
&lt;li&gt;같은 폴더의 &lt;code&gt;Brewfile&lt;/code&gt;로 &lt;code&gt;brew bundle&lt;/code&gt;을 실행해 formula·cask를 한 번에 맞춘다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.oh-my-zsh&lt;/code&gt;가 없을 때만 Oh My Zsh를 &lt;strong&gt;비대화형(&lt;code&gt;--unattended&lt;/code&gt;)&lt;/strong&gt;으로 설치한다. 기본 로그인 셸은 자동으로 바꾸지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;파일 배치&lt;/h2&gt;
&lt;p&gt;같은 디렉터리에 두 파일을 둔다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scripts/mac/
  Brewfile
  bootstrap.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;bootstrap.sh&lt;/code&gt;에 실행 권한을 주면 편하다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x scripts/mac/bootstrap.sh&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;code&gt;Brewfile&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;로컬에서 &lt;code&gt;brew list&lt;/code&gt;로 나온 항목을 기준으로 두었고, 필요에 따라 줄을 추가·삭제하면 된다. 단독으로 쓰려면:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew bundle --file=/path/to/Brewfile&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;# 새 Mac 부트스트랩 — 로컬 brew 목록 기준 (scripts/mac/bootstrap.sh 와 함께 사용)
# 사용: brew bundle --file=&amp;quot;$(dirname &amp;quot;$0&amp;quot;)/Brewfile&amp;quot;

# Shell / 도구
brew &amp;quot;bash&amp;quot;
brew &amp;quot;git&amp;quot;
brew &amp;quot;grep&amp;quot;
brew &amp;quot;zsh&amp;quot;
brew &amp;quot;direnv&amp;quot;
brew &amp;quot;socat&amp;quot;

# Python (프로젝트별 venv용)
brew &amp;quot;python@3.13&amp;quot;
brew &amp;quot;python@3.14&amp;quot;

# AWS / 클라우드 CLI
brew &amp;quot;awscli&amp;quot;

# Kubernetes / IaC
brew &amp;quot;helm&amp;quot;
brew &amp;quot;terraform&amp;quot;
brew &amp;quot;terraform-docs&amp;quot;
brew &amp;quot;tfenv&amp;quot;
brew &amp;quot;tflint&amp;quot;
brew &amp;quot;trivy&amp;quot;

# DB 클라이언트
brew &amp;quot;mysql-client&amp;quot;

# Git hooks
brew &amp;quot;pre-commit&amp;quot;

# UI (선택)
cask &amp;quot;openlens&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;code&gt;bootstrap.sh&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/usr/bin/env bash
# 새 Mac에서 Homebrew + Brewfile + Oh My Zsh를 한 번에 설치합니다.
# 사용: bash scripts/mac/bootstrap.sh
set -euo pipefail

SCRIPT_DIR=&amp;quot;$(cd &amp;quot;$(dirname &amp;quot;${BASH_SOURCE[0]}&amp;quot;)&amp;quot; &amp;amp;&amp;amp; pwd)&amp;quot;
BREWFILE=&amp;quot;${SCRIPT_DIR}/Brewfile&amp;quot;

log() { printf &amp;#39;\033[1;32m[%s]\033[0m %s\n&amp;#39; &amp;quot;$(date &amp;#39;+%H:%M:%S&amp;#39;)&amp;quot; &amp;quot;$*&amp;quot;; }
warn() { printf &amp;#39;\033[1;33m[%s]\033[0m %s\n&amp;#39; &amp;quot;$(date &amp;#39;+%H:%M:%S&amp;#39;)&amp;quot; &amp;quot;$*&amp;quot; &amp;gt;&amp;amp;2; }

if ! xcode-select -p &amp;amp;&amp;gt;/dev/null; then
  warn &amp;quot;Xcode Command Line Tools가 없습니다. 설치 창에서 확인을 눌러 주세요.&amp;quot;
  xcode-select --install || true
  warn &amp;quot;설치 완료 후 이 스크립트를 다시 실행하세요.&amp;quot;
  exit 1
fi

if ! command -v brew &amp;amp;&amp;gt;/dev/null; then
  log &amp;quot;Homebrew 설치 중...&amp;quot;
  NONINTERACTIVE=1 /bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;
fi

# Apple Silicon: PATH에 brew 추가 (현재 세션)
if [[ -x /opt/homebrew/bin/brew ]]; then
  eval &amp;quot;$(/opt/homebrew/bin/brew shellenv)&amp;quot;
elif [[ -x /usr/local/bin/brew ]]; then
  eval &amp;quot;$(/usr/local/bin/brew shellenv)&amp;quot;
fi

if ! command -v brew &amp;amp;&amp;gt;/dev/null; then
  warn &amp;quot;brew를 PATH에서 찾을 수 없습니다. 터미널을 다시 열거나 ~/.zprofile 에 brew shellenv를 추가한 뒤 다시 실행하세요.&amp;quot;
  exit 1
fi

log &amp;quot;brew bundle 실행: ${BREWFILE}&amp;quot;
brew bundle --file=&amp;quot;${BREWFILE}&amp;quot;

if [[ ! -d &amp;quot;${HOME}/.oh-my-zsh&amp;quot; ]]; then
  log &amp;quot;Oh My Zsh 설치 중...&amp;quot;
  # --unattended: 프롬프트 없이 설치(기본 셸 자동 변경 없음 — 필요 시 chsh -s 로 zsh 지정)
  sh -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&amp;quot; &amp;quot;&amp;quot; --unattended
else
  log &amp;quot;Oh My Zsh 이미 설치됨 (~/.oh-my-zsh), 건너뜀&amp;quot;
fi

log &amp;quot;완료. 터미널을 새로 열거나: eval \&amp;quot;\$($(brew --prefix)/bin/brew shellenv)\&amp;quot;&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;실행 방법&lt;/h2&gt;
&lt;p&gt;저장소를 클론했거나 위 두 파일만 복사한 뒤:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bash scripts/mac/bootstrap.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./scripts/mac/bootstrap.sh&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;메모&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;로그인 셸을 Homebrew zsh로&lt;/strong&gt;: &lt;code&gt;chsh -s &amp;quot;$(brew --prefix zsh)/bin/zsh&amp;quot;&lt;/code&gt; (한 번만).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패키지 목록 갱신&lt;/strong&gt;: 기존 맥에서 &lt;code&gt;brew leaves&lt;/code&gt; 등으로 확인한 뒤 &lt;code&gt;Brewfile&lt;/code&gt;을 수정한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Store / DMG 앱&lt;/strong&gt;은 Brewfile의 &lt;code&gt;cask&lt;/code&gt;로 옮길 수 있는 것만 넣는다. 나머지는 수동 설치 목록을 블로그에 따로 적어두면 된다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기타/scripts</category>
      <category>MAC OS Bootstraping</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/254</guid>
      <comments>https://happyengine.tistory.com/254#entry254comment</comments>
      <pubDate>Tue, 24 Mar 2026 17:35:56 +0900</pubDate>
    </item>
    <item>
      <title>[ISMS] AWS WorkSpaces Pools + Okta SAML 세부 구성 가이드 (2편)</title>
      <link>https://happyengine.tistory.com/253</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증심사를 위한 망분리를 위해 WorkSpaces Pools를 구성한 과정을 단계별로 정리했다. Okta SAML SSO 연동, non-persistent Pool, 커스텀 이미지(Chrome 기본)까지 포함한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: ISMS 인증심사 대응 망분리. 개인정보 접근 환경을 일반 업무망과 분리한 전용 WorkSpaces Pool 구성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사전 준비&lt;/b&gt;: 리전(예: ap-northeast-2), VPC(Private 서브넷 2개, NAT), Okta Admin 권한, AWS IAM&amp;middot;WorkSpaces 콘솔 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 글: &lt;a href=&quot;https://happyengine.tistory.com/252&quot;&gt;구성기 (1편)&lt;/a&gt;에서 WSP, 트러블슈팅 확인. 1편 먼저 읽기 권장.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[일반 업무망]                    [개인정보 접근 전용망]
  사용자 PC  &amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;►  admin (직접 접근 불가)
      │
      ▼
    Okta  ──(SAML)───►  WorkSpaces Pool  ───(NAT EIP)───►  admin&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사전 확인&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;확인&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;리전&lt;/td&gt;
&lt;td&gt;Pool 운영 리전 (예: ap-northeast-2 서울)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPC&lt;/td&gt;
&lt;td&gt;Private 서브넷 2개 (서로 다른 AZ), NAT Gateway 아웃바운드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Okta&lt;/td&gt;
&lt;td&gt;Admin 권한, SAML 앱 생성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;IAM, WorkSpaces 콘솔 접근 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;aws ec2 describe-subnets --filter &quot;Name=vpc-id,Values=YOUR_VPC_ID&quot; \
  --region ap-northeast-2 \
  --query 'Subnets[*].[SubnetId,AvailabilityZone,CidrBlock]' --output table&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 1: Pools 디렉토리 생성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/workspaces/v2/home?region=ap-northeast-2&quot;&gt;WorkSpaces 콘솔&lt;/a&gt; 접속&lt;/li&gt;
&lt;li&gt;Directories, Create directory&lt;/li&gt;
&lt;li&gt;WorkSpace type: Pool&lt;/li&gt;
&lt;li&gt;User identity source: User access URL &lt;code&gt;placeholder&lt;/code&gt; (나중에 Okta Sign on URL로 변경), Relay state parameter name 비움&lt;/li&gt;
&lt;li&gt;Directory information: Name, Description&lt;/li&gt;
&lt;li&gt;Networking: VPC, Private 서브넷 2개 (서로 다른 AZ), Access to internet 활성화 (Private 시 생성 후 CLI로 false)&lt;/li&gt;
&lt;li&gt;Security group: 아웃바운드 TCP 80, 443, UDP 4195&lt;/li&gt;
&lt;li&gt;Active Directory Config: 건너뜀&lt;/li&gt;
&lt;li&gt;Storage: Home folders 비활성화&lt;/li&gt;
&lt;li&gt;Create directory&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확인&lt;/b&gt;: 디렉토리 ID (wsd-로 시작), Registration code 메모&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 2: Okta SAML 앱 생성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Okta Admin, Applications, Create App Integration&lt;/li&gt;
&lt;li&gt;SAML 2.0, Next&lt;/li&gt;
&lt;li&gt;Single sign on URL: &lt;code&gt;https://signin.aws.amazon.com/saml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Audience URI: &lt;code&gt;https://signin.aws.amazon.com/saml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Name ID format: Persistent&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Sign On 탭, Identity Provider metadata URL 복사&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 3: IAM SAML IdP 생성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://console.aws.amazon.com/iam/home#/identity_providers&quot;&gt;IAM Identity providers&lt;/a&gt; 접속&lt;/li&gt;
&lt;li&gt;Create provider, Provider type: SAML&lt;/li&gt;
&lt;li&gt;Provider name: 예) OktaWorkSpacesPools&lt;/li&gt;
&lt;li&gt;Metadata document: Okta 메타데이터 URL 붙여넣기 또는 XML 파일 업로드&lt;/li&gt;
&lt;li&gt;Create provider&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 4: IAM SAML 역할 생성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://console.aws.amazon.com/iam/home#/roles&quot;&gt;IAM Roles&lt;/a&gt;, Create role&lt;/li&gt;
&lt;li&gt;Trusted entity: SAML 2.0 federation, Step 3 IdP 선택&lt;/li&gt;
&lt;li&gt;Allow programmatic access only&lt;/li&gt;
&lt;li&gt;Role name: 예) WorkSpacesPoolsOktaRole, Create role&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Trust relationships 수정&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sts:TagSession&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;Condition을 &lt;code&gt;SAML:aud&lt;/code&gt; = &lt;code&gt;https://signin.aws.amazon.com/saml&lt;/code&gt; 로 변경 (SAML:sub_type 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;StringEquals&quot;: {
    &quot;SAML:aud&quot;: &quot;https://signin.aws.amazon.com/saml&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인라인 정책 추가&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;Effect&quot;: &quot;Allow&quot;,
  &quot;Action&quot;: [
    &quot;workspaces:CreateStreamingSession&quot;,
    &quot;workspaces:DescribeWorkspacesPoolDirectory&quot;,
    &quot;workspaces:Stream&quot;
  ],
  &quot;Resource&quot;: &quot;arn:aws:workspaces:ap-northeast-2:YOUR_ACCOUNT_ID:directory/DIRECTORY_ID&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 5: workspaces_DefaultRole&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;IAM, Roles, &lt;code&gt;workspaces_DefaultRole&lt;/code&gt; 검색&lt;/li&gt;
&lt;li&gt;없으면: WorkSpaces Quick Setup 또는 Personal WorkSpace 1회 실행으로 자동 생성&lt;/li&gt;
&lt;li&gt;Add permissions, Attach policies, &lt;code&gt;AmazonWorkSpacesPoolServiceAccess&lt;/code&gt; 연결&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 6: Okta SAML 앱 속성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Okta Admin, Applications, Step 2 앱 클릭&lt;/li&gt;
&lt;li&gt;Sign On 탭, Edit&lt;/li&gt;
&lt;li&gt;Attribute statements, Add Attribute 3개:&lt;/li&gt;
&lt;/ol&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://aws.amazon.com/SAML/Attributes/Role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&quot;arn:aws:iam::YOUR_ACCOUNT_ID:role/WorkSpacesPoolsOktaRole,arn:aws:iam::YOUR_ACCOUNT_ID:saml-provider/OktaWorkSpacesPools&quot;&lt;/code&gt; (따옴표 포함, Constant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://aws.amazon.com/SAML/Attributes/RoleSessionName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user.profile.email&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://aws.amazon.com/SAML/Attributes/PrincipalTag:Email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user.profile.email&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Assign 탭, 사용자 또는 그룹 할당&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 7: Okta Relay State&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Okta 앱, Sign On, Edit, Show Advanced Settings&lt;/li&gt;
&lt;li&gt;Relay State URL: &lt;code&gt;https://workspaces.euc-sso.ap-northeast-2.aws.amazon.com/sso-idp?registrationCode=REGISTRATION_CODE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REGISTRATION_CODE를 Step 1 디렉토리 Registration code로 교체 (공백은 &lt;code&gt;+&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;파라미터명: RelayState&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 8: 디렉토리에 SAML 활성화&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces, Directories, Pools directories&lt;/li&gt;
&lt;li&gt;Step 1 디렉토리 선택&lt;/li&gt;
&lt;li&gt;Authentication, Edit, Edit SAML 2.0 Identity Provider&lt;/li&gt;
&lt;li&gt;User Access URL: Okta 앱 Sign on URL 전체 복사 (appId 포함 필수)&lt;/li&gt;
&lt;li&gt;IdP deep link parameter name: RelayState&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 9: WorkSpaces Pool 생성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces, Pool, Create WorkSpaces Pools&lt;/li&gt;
&lt;li&gt;Bundle: Value (Windows Server 2019). Pool은 Linux 미지원&lt;/li&gt;
&lt;li&gt;Running mode: AutoStop&lt;/li&gt;
&lt;li&gt;Manual scaling: Minimum 0, Maximum 사용 인원 + 여유&lt;/li&gt;
&lt;li&gt;Select directory: Step 1 디렉토리&lt;/li&gt;
&lt;li&gt;Create WorkSpace Pool&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 10: EnableInternetAccess 수정 (Private 서브넷 시)&lt;/h3&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;aws workspaces modify-workspace-creation-properties \
  --resource-id DIRECTORY_ID \
  --workspace-creation-properties EnableInternetAccess=false \
  --region ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 11: 접속 테스트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Okta 앱에 할당된 사용자로 로그인&lt;/li&gt;
&lt;li&gt;해당 앱 타일 클릭&lt;/li&gt;
&lt;li&gt;WorkSpaces Pool 세션 시작&lt;/li&gt;
&lt;li&gt;또는 &lt;code&gt;https://clients.amazonworkspaces.com&lt;/code&gt;에서 Registration code 입력&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;(선택) Step 12: 커스텀 이미지 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chrome 기본 브라우저 등 커스텀 설정이 필요하면 아래 순서로 진행. &lt;b&gt;이미지 빌더는 반드시 Value (Server 2019)&lt;/b&gt;.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.1 Simple AD 생성 (도쿄)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울에는 Simple AD 없음. 도쿄(ap-northeast-1)에서 생성.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces 콘솔, 리전 ap-northeast-1&lt;/li&gt;
&lt;li&gt;Directories, Create directory&lt;/li&gt;
&lt;li&gt;WorkSpace type: Personal, User identity source: Simple AD&lt;/li&gt;
&lt;li&gt;Directory DNS name: &lt;code&gt;imagebuilder.local&lt;/code&gt; (FQDN, 점 포함 필수)&lt;/li&gt;
&lt;li&gt;Directory NetBIOS name: IMAGEBUILDER&lt;/li&gt;
&lt;li&gt;Administrator password: 8-64자&lt;/li&gt;
&lt;li&gt;Networking: VPC, Private 서브넷 2개&lt;/li&gt;
&lt;li&gt;Create directory&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.2 이미지 빌더 WorkSpace (도쿄)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces (도쿄), Create WorkSpace&lt;/li&gt;
&lt;li&gt;Directory: 12.1 Simple AD&lt;/li&gt;
&lt;li&gt;Bundle: &lt;b&gt;Value (Windows Server 2019)&lt;/b&gt; (WSP 필수)&lt;/li&gt;
&lt;li&gt;User: imagebuilder 등 1명&lt;/li&gt;
&lt;li&gt;Create WorkSpace, Available 대기&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.3 Chrome 설치&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpace 접속&lt;/li&gt;
&lt;li&gt;Edge로 Chrome 다운로드 후 설치&lt;/li&gt;
&lt;li&gt;설정, 앱, 기본 앱, 웹 브라우저, Chrome&lt;/li&gt;
&lt;li&gt;캐시&amp;middot;히스토리 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.4 Image Checker&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpace 재부팅&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C:\Program Files\Amazon\ImageChecker.exe&lt;/code&gt; 실행&lt;/li&gt;
&lt;li&gt;Run, 모든 검사 PASSED&lt;/li&gt;
&lt;li&gt;Validation Successful 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.5 커스텀 이미지 생성 (도쿄)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces (도쿄), 해당 WorkSpace 선택&lt;/li&gt;
&lt;li&gt;Actions, Create image&lt;/li&gt;
&lt;li&gt;Image name: 예) pool-chrome&lt;/li&gt;
&lt;li&gt;Create image, 완료 대기&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.6 이미지 복사 (도쿄에서 서울로)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces, Images, Image Registry, ap-northeast-1&lt;/li&gt;
&lt;li&gt;이미지 선택, Actions, Copy image&lt;/li&gt;
&lt;li&gt;Destination: ap-northeast-2 (Seoul)&lt;/li&gt;
&lt;li&gt;Copy image, 완료 대기&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.7 커스텀 번들 생성 (서울)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;WorkSpaces, 리전 ap-northeast-2&lt;/li&gt;
&lt;li&gt;Images, Image Registry, 복사된 이미지, Create bundle&lt;/li&gt;
&lt;li&gt;Compute: Value (2 vCPU, 4GB RAM)&lt;/li&gt;
&lt;li&gt;Storage: Value와 동일 (Root 80GB)&lt;/li&gt;
&lt;li&gt;Bundle name: 예) pool-chrome-bundle&lt;/li&gt;
&lt;li&gt;Create bundle, Bundle ID 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.8 Pool에 커스텀 번들 적용&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;aws workspaces update-workspaces-pool \
  --pool-id POOL_ID \
  --bundle-id BUNDLE_ID \
  --region ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12.9 빌드 리소스 삭제&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;도쿄 이미지 빌더 WorkSpace 삭제&lt;/li&gt;
&lt;li&gt;도쿄 Simple AD 디렉토리 삭제&lt;/li&gt;
&lt;li&gt;도쿄 커스텀 이미지 삭제 (선택)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체크리스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 1: Pools 디렉토리&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 2-4: Okta, IAM IdP, IAM 역할&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 5: workspaces_DefaultRole&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 6-8: Okta 속성, Relay State, 디렉토리 SAML&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 9-11: Pool 생성, EnableInternetAccess, 접속 테스트&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;disabled&quot; type=&quot;checkbox&quot; /&gt; Step 12: 커스텀 이미지 (선택, Value/Server 2019 필수)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/managing-stacks-fleets.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/managing-stacks-fleets.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/workspaces-saml.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/workspaces-saml.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images-custom-image.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images-custom-image.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.okta.com/en-us/content/topics/apps/apps-add-saml-app.htm&quot;&gt;https://help.okta.com/en-us/content/topics/apps/apps-add-saml-app.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://happyengine.tistory.com/252&quot;&gt;구성기 (1편)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#AWS #WorkSpaces #WorkSpacesPools #Okta #SAML #SSO #ISMS #망분리 #인증심사 #커스텀이미지 #WSP #클라우드데스크톱&lt;/p&gt;</description>
      <category>기타/ISMS</category>
      <category>AWS</category>
      <category>Custom Image</category>
      <category>ISMS</category>
      <category>OKTA</category>
      <category>SAML</category>
      <category>SSO</category>
      <category>WorkSpaces</category>
      <category>wsp</category>
      <category>망분리</category>
      <category>인증심사</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/253</guid>
      <comments>https://happyengine.tistory.com/253#entry253comment</comments>
      <pubDate>Thu, 19 Mar 2026 10:20:02 +0900</pubDate>
    </item>
    <item>
      <title>[ISMS] AWS WorkSpaces Pools + Okta SAML + 커스텀 이미지 구성기 (1편)</title>
      <link>https://happyengine.tistory.com/252</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS 인증심사를 위한 망분리가 목적이었다. 개인정보를 다루는 내부 관리 페이지 접속을 일반 업무망과 분리하고, WorkSpaces Pools로 전환하면서 Okta SSO 연동과 Chrome 기본 설치 커스텀 이미지를 구성했다. 이 과정에서 겪은 것들을 정리해봤다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: ISMS 인증심사 대응 망분리. 개인정보 접근 환경을 일반 업무망과 분리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt;: WorkSpaces Pools (non-persistent), Okta SAML, 커스텀 이미지 (Chrome 기본)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;접속 흐름&lt;/b&gt;: Okta 앱 클릭, SAML 인증, Pool 세션 할당, 내부 페이지 접속&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 글: &lt;a href=&quot;https://happyengine.tistory.com/253&quot;&gt;세부 구성 가이드 (2편)&lt;/a&gt;에서 Step 1-12 절차 확인&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;망분리 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 업무망에서는 admin 페이지에 직접 접근할 수 없고, Okta 인증 후 WorkSpaces Pool(전용망) 세션을 통해서만 접근한다. Pool은 Private 서브넷에 있으며 NAT EIP만 admin 화이트리스트에 등록된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[일반 업무망]                         [개인정보 접근 전용망]
  사용자 PC  &amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;►  admin (직접 접근 불가)
      │
      ▼
    Okta  ──(SAML)────►  WorkSpaces Pool  ───(NAT EIP)───►  admin&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1차 시도: Server 2022 커스텀 이미지 &amp;ndash; 실패&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows Server 2022 기반으로 커스텀 이미지를 만들었다. Image Checker 통과, 서울 복사, 번들 생성까지 문제없이 됐다. Pool에 해당 번들을 적용하려 하니 다음 에러가 났다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Only bundles with WorkSpaces Streaming Protocol are supported&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: Server 2022 기반 이미지는 DCV 프로토콜 사용. Pool은 WSP 번들만 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과&lt;/b&gt;: Pool 적용 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차 시도: Server 2019 (Value) 기반으로 재생성 &amp;ndash; 성공&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 빌더 WorkSpace를 &lt;b&gt;Value (Windows Server 2019)&lt;/b&gt; 번들로 다시 만들고, 커스텀 이미지&amp;middot;번들도 모두 Server 2019 기반으로 재생성했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: 이미지 빌더 WorkSpace 생성 시 반드시 &lt;b&gt;Value (Windows Server 2019)&lt;/b&gt; 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비고&lt;/b&gt;: Server 2022는 Pool에서 사용 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Simple AD는 서울에 없음&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WorkSpaces 커스텀 이미지를 만들려면 Simple AD 또는 Managed AD가 필요하다. &lt;b&gt;서울(ap-northeast-2)에는 Simple AD가 없다&lt;/b&gt;. Managed AD만 지원한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;방법&lt;/b&gt;: 이미지 빌드용 WorkSpace를 &lt;b&gt;도쿄(ap-northeast-1)&lt;/b&gt; 에 두고, Simple AD + WorkSpace 생성 후 이미지 생성. 이미지는 서울로 복사, 서울에서 번들 생성, Pool 적용. 빌드 완료 후 도쿄 WorkSpace&amp;middot;Simple AD 삭제 (비용 절감)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[도쿄 ap-northeast-1]                    [서울 ap-northeast-2]
  Simple AD                               이미지 복사
      │                                       │
      ▼                                       ▼
  이미지 빌더 WorkSpace  ──────────────►   번들 생성
      │                                       │
      ▼                                       ▼
  커스텀 이미지 생성  ─────────────────►  Pool 적용&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커스텀 이미지 재빌드 시 기존 리소스 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server 2022로 잘못 만든 경우, 기존 WorkSpace는 OS 변경 불가. 삭제 후 새로 만들어야 한다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기존 리소스&lt;/th&gt;
&lt;th&gt;처리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;이미지 빌더 WorkSpace&lt;/td&gt;
&lt;td&gt;삭제 후 Value(Server 2019)로 새로 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple AD&lt;/td&gt;
&lt;td&gt;그대로 사용. 새 WorkSpace 생성 시 동일 디렉토리 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;도쿄 커스텀 이미지&lt;/td&gt;
&lt;td&gt;선택 삭제 (서울에 복사본 있으면 불필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서울 기존 이미지/번들&lt;/td&gt;
&lt;td&gt;새 번들로 Pool 업데이트 후 선택 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서: 기존 WorkSpace 삭제, Value(Server 2019)로 새 WorkSpace 생성, Chrome 설치&amp;middot;Image Checker, 이미지 생성, 서울 복사, 번들 생성, Pool 업데이트, 도쿄 빌드 리소스 삭제&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Okta SAML 연동 시 자주 나오는 에러&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;Not authorized to perform sts:AssumeRoleWithSAML&lt;/code&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: Trust Policy의 Condition이 &lt;code&gt;SAML:sub_type&lt;/code&gt;으로 되어 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: &lt;code&gt;SAML:aud&lt;/code&gt;로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;Condition&quot;: {
  &quot;StringEquals&quot;: {
    &quot;SAML:aud&quot;: &quot;https://signin.aws.amazon.com/saml&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;404 또는 접속 실패&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: User Access URL에 Okta 앱 Sign on URL 전체가 아님. appId(&lt;code&gt;xxx_yyy_1&lt;/code&gt;) 누락 시 404&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: Okta 앱, Sign On, Metadata details에서 Sign on URL 값 그대로 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;Invalid property email in expression user.email&lt;/code&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: &lt;code&gt;user.email&lt;/code&gt; 미지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: &lt;code&gt;user.profile.email&lt;/code&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;Something went wrong&lt;/code&gt; (WorkSpaces 클라이언트)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: IAM 역할에 &lt;code&gt;workspaces:Stream&lt;/code&gt; 권한 없음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: &lt;code&gt;workspaces:CreateStreamingSession&lt;/code&gt;, &lt;code&gt;workspaces:DescribeWorkspacesPoolDirectory&lt;/code&gt;, &lt;code&gt;workspaces:Stream&lt;/code&gt; 디렉토리 리소스에 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;Unable to connect&lt;/code&gt; (번들 변경 후)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인&lt;/b&gt;: 커스텀 번들이 WSP 아님 (Server 2022 기반), 또는 Pool capacity 0, STOPPED&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결&lt;/b&gt;: WSP 호환 번들(Server 2019 기반) 확인, Pool capacity 1 이상, RUNNING 상태 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Directory DNS name 규칙 (Simple AD)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FQDN 형식 필수. 점(.) 포함 &lt;code&gt;xxx.yyy&lt;/code&gt; 형태.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바름: &lt;code&gt;imagebuilder.local&lt;/code&gt;, &lt;code&gt;corp.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;잘못됨: &lt;code&gt;corp&lt;/code&gt; (점 없음), &lt;code&gt;admin-pool-image-builder&lt;/code&gt; (점 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Private 서브넷 + EnableInternetAccess&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pool 디렉토리를 Private 서브넷에 두고 NAT 사용 시, &lt;b&gt;EnableInternetAccess=false&lt;/b&gt; 로 설정. 콘솔 생성 시 true로 두고, 생성 후 CLI로 false 변경.&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;aws workspaces modify-workspace-creation-properties \
  --resource-id &amp;lt;DIRECTORY_ID&amp;gt; \
  --workspace-creation-properties EnableInternetAccess=false \
  --region ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Security Group 아웃바운드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로토콜&lt;/th&gt;
&lt;th&gt;포트&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;HTTP, EC2 메타데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;4195&lt;/td&gt;
&lt;td&gt;WorkSpaces 스트리밍&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게 된 점 정리&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Pool은 WSP 번들만 지원&lt;/b&gt;&lt;br /&gt;커스텀 이미지&amp;middot;번들은 반드시 Value (Windows Server 2019) 기반. Server 2022는 사용 불가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Simple AD는 서울에 없음&lt;/b&gt;&lt;br /&gt;이미지 빌드는 도쿄에서 하고, 이미지만 서울로 복사.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Okta Trust Policy는 SAML:aud&lt;/b&gt;&lt;br /&gt;IAM 마법사가 넣는 SAML:sub_type은 잘못됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;User Access URL에 appId 필수&lt;/b&gt;&lt;br /&gt;Sign on URL 전체 복사. appId 누락 시 404.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;EnableInternetAccess=false&lt;/b&gt;&lt;br /&gt;Private 서브넷 + NAT 사용 시 CLI로 설정. NAT EIP를 admin 화이트리스트에 등록.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images-custom-image.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images-custom-image.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/wsp-pools-troubleshooting.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/wsp-pools-troubleshooting.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/workspaces/latest/adminguide/workspaces-saml.html&quot;&gt;https://docs.aws.amazon.com/workspaces/latest/adminguide/workspaces-saml.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://happyengine.tistory.com/253&quot;&gt;세부 구성 가이드 (2편)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#AWS #WorkSpaces #WorkSpacesPools #Okta #SAML #SSO #ISMS #망분리 #인증심사 #커스텀이미지 #WSP #클라우드데스크톱&lt;/p&gt;</description>
      <category>기타/ISMS</category>
      <category>AWS</category>
      <category>ISMS</category>
      <category>OKTA</category>
      <category>SAML</category>
      <category>SSO</category>
      <category>VDI</category>
      <category>WorkSpaces</category>
      <category>WorkSpacesPools</category>
      <category>망분리</category>
      <category>인증심사</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/252</guid>
      <comments>https://happyengine.tistory.com/252#entry252comment</comments>
      <pubDate>Thu, 19 Mar 2026 10:15:27 +0900</pubDate>
    </item>
    <item>
      <title>Aurora MySQL 대용량 테이블 DROP COLUMN</title>
      <link>https://happyengine.tistory.com/251</link>
      <description>&lt;h1&gt;Aurora MySQL 대용량 테이블 DROP COLUMN, 두 번 실패 후 성공한 기록&lt;/h1&gt;
&lt;p&gt;수억 행, 200GB가 넘는 테이블에서 컬럼을 제거해야 할 때가 있다. &lt;code&gt;ALTER TABLE DROP COLUMN&lt;/code&gt;은 단순해 보이지만, 테이블 규모가 크면 예상보다 훨씬 오래 걸리고, 리소스 부족으로 실패하기도 한다. 이번에는 두 번 실패한 뒤 세 번째 시도에서 성공한 과정을 정리해봤다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;배경: 왜 컬럼을 제거했나&lt;/h2&gt;
&lt;p&gt;개인정보 보호를 위해 기존 평문 컬럼을 제거하고, 암호화된 컬럼만 남기는 작업이었다. 대상 테이블은 감사(audit) 로그용으로, 수억 행에 200GB 이상의 데이터와 인덱스를 가지고 있었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1차 시도: 일괄 DROP – 실패&lt;/h2&gt;
&lt;p&gt;첫 시도는 3개 컬럼을 한 번에 제거하는 방식이었다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE target_table
  DROP COLUMN col1,
  DROP COLUMN col2,
  DROP COLUMN col3,
  ALGORITHM=INPLACE,
  LOCK=NONE;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 스펙&lt;/strong&gt;: (2 vCPU, 16GB 메모리)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실행 시점&lt;/strong&gt;: 새벽 (트래픽 최소)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결과&lt;/strong&gt;: 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;추정 원인은 리소스 부족이었다. 대용량 테이블 리빌드 시 메모리, lock wait timeout 등에 여유가 부족했을 가능성이 크다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2차 시도: 컬럼별 분리 실행 – 또 실패&lt;/h2&gt;
&lt;p&gt;부담을 줄이려고 컬럼을 하나씩 나눠서 실행해봤다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE target_table DROP COLUMN col1, ALGORITHM=INPLACE, LOCK=NONE;
-- 완료 후
ALTER TABLE target_table DROP COLUMN col2, ALGORITHM=INPLACE, LOCK=NONE;
-- 완료 후
ALTER TABLE target_table DROP COLUMN col3, ALGORITHM=INPLACE, LOCK=NONE;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;결과&lt;/strong&gt;: 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;컬럼을 나눠도 &lt;strong&gt;테이블 전체 리빌드&lt;/strong&gt;가 필요하다는 점은 같다. 한 번에 3개를 하든 1개씩 하든, 처리해야 할 데이터 양은 비슷하고, 결국 같은 리소스 한계에 부딪혔다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3차 시도: 스펙업 후 재시도 – 성공&lt;/h2&gt;
&lt;h3&gt;사전 준비&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;인스턴스 스펙업&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;변경 전&lt;/th&gt;
&lt;th&gt;변경 후&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;vCPU&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;128GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Writer, Reader를 순차적으로 스펙업 (디비스펙업 시에는 Reader부터 하면 failover를 한 번만 할 수 있다)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage-optimization&lt;/strong&gt;이 끝난 뒤 ALTER 실행 (한 인스턴스가 Storage-optimization 중일 때 다른 인스턴스 수정은 가능하지만, DDL 복제 부담을 줄이려면 모두 &lt;code&gt;available&lt;/code&gt; 상태일 때 실행하는 것이 안전함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;세션 타임아웃 설정&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SET SESSION wait_timeout = 86400;
SET SESSION lock_wait_timeout = 86400;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SET SESSION&lt;/code&gt;은 해당 연결에만 적용되므로, 다른 서비스에는 영향을 주지 않는다.&lt;/p&gt;
&lt;h3&gt;실행 및 결과&lt;/h3&gt;
&lt;p&gt;동일한 ALTER를 다시 실행했고, &lt;strong&gt;약 3~4시간&lt;/strong&gt; 후 성공적으로 완료되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;진행 상황 모니터링&lt;/h2&gt;
&lt;p&gt;수 시간 걸리는 작업이라, 진행 여부를 확인할 방법이 필요했다.&lt;/p&gt;
&lt;h3&gt;1. Performance Schema&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM performance_schema.events_stages_current 
WHERE EVENT_NAME LIKE &amp;#39;%alter%&amp;#39; OR EVENT_NAME LIKE &amp;#39;%copy%&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stage/innodb/alter table (merge sort)&lt;/code&gt; → merge sort 단계 (가장 오래 걸림)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stage/innodb/alter table (insert)&lt;/code&gt; → insert 단계&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WORK_COMPLETED&lt;/code&gt;, &lt;code&gt;WORK_ESTIMATED&lt;/code&gt;가 함께 증가하면 진행 중&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Performance Insights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wait/io/file/innodb/innodb_temp_file&lt;/code&gt; wait가 보이기 시작하면, 임시 파일 I/O가 진행 중이라는 의미로, 실제 데이터 복사 단계에 진입한 것이다.&lt;/li&gt;
&lt;li&gt;CPU 사용률이 낮게 나와도(예: 11%) I/O bound 구간에서는 정상이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. CloudWatch – FreeLocalStorage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ALTER 진행 중: 임시 파일 사용으로 &lt;strong&gt;FreeLocalStorage 감소&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;완료 후: 정리되면서 &lt;strong&gt;원래 수준으로 복귀&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 지표만으로도 &amp;quot;진행 중인지&amp;quot;, &amp;quot;완료되었는지&amp;quot;를 대략 파악할 수 있었다.&lt;/p&gt;
&lt;h3&gt;4. 프로세스 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SHOW PROCESSLIST;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;State&lt;/code&gt;가 &lt;code&gt;copying to tmp table&lt;/code&gt; 또는 &lt;code&gt;altering table&lt;/code&gt;이면 진행 중이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;알게 된 점 정리&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;컬럼별 DROP이 항상 유리한 건 아니다&lt;/strong&gt;&lt;br&gt;테이블 리빌드 규모가 같다면, 나눠서 해도 리소스 부담은 비슷하다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;대용량 DDL은 인스턴스 스펙이 중요하다&lt;/strong&gt;&lt;br&gt;메모리와 CPU가 충분해야 버퍼 풀, 정렬, I/O를 감당할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage-optimization은 인스턴스별 제한&lt;/strong&gt;&lt;br&gt;한 인스턴스가 Storage-optimization 중이어도, 다른 인스턴스는 수정할 수 있다. 다만 DDL 복제 부담을 고려하면, 모두 &lt;code&gt;available&lt;/code&gt;일 때 실행하는 편이 안전하다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FreeLocalStorage로 진행 여부 추정 가능&lt;/strong&gt;&lt;br&gt;CloudWatch에서 이 지표가 줄었다가 다시 올라오면, ALTER가 끝났을 가능성이 높다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;디비스펙업 시 Reader부터&lt;/strong&gt;&lt;br&gt;Reader를 먼저 스펙 다운하면 failover를 한 번만 할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;실패 시 대안&lt;/h2&gt;
&lt;p&gt;같은 방식으로 또 실패한다면, 아래를 검토할 수 있다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pt-online-schema-change&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;청크 단위로 처리, Aurora에서도 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gh-ost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;바이너리 로그 기반 온라인 스키마 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;유지보수 시간 + ALGORITHM=COPY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;다운타임을 허용할 수 있다면, 한 번에 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;마치며&lt;/h2&gt;
&lt;p&gt;대용량 테이블 DDL은 &amp;quot;쿼리 한 줄&amp;quot;이지만, 실제로는 수 시간이 걸리고, 리소스 설계가 중요하다. 이번 경험을 바탕으로, 비슷한 규모의 작업을 할 때 참고할 수 있기를 바란다.&lt;/p&gt;</description>
      <category>Linux/MySQL</category>
      <category>alter</category>
      <category>Aurora MySQL</category>
      <category>AWS</category>
      <category>dba</category>
      <category>DDL</category>
      <category>DROP COLUMN</category>
      <category>Failover</category>
      <category>PerformanceInsights</category>
      <category>대용량테이블</category>
      <category>성능최적화</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/251</guid>
      <comments>https://happyengine.tistory.com/251#entry251comment</comments>
      <pubDate>Thu, 19 Mar 2026 01:02:24 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB 디스크 공간 정리 (compact 작업 정리)</title>
      <link>https://happyengine.tistory.com/249</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;MongoDB 디스크 공간 정리 (compact 작업 정리)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MongoDB에서 WiredTiger 스토리지 엔진을 사용할 때 삭제된 데이터로 인해 **디스크 공간 단편화(fragmentation)**가 발생할 수 있다. 이때 compact 명령어를 사용해 스토리지를 정리할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Secondary 노드 직접 접속&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compact는 &lt;b&gt;Primary가 아닌 Secondary 노드에서 실행해야 하므로&lt;/b&gt;,&lt;br /&gt;특정 노드에 직접 접속할 수 있도록 &lt;b&gt;directConnection 옵션을 사용한 connection string&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Compass를 사용해서 작업하면 한결 수월하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(민감 정보 제거 예시)&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;mongodb://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;secondary-host&amp;gt;:27017/?replicaSet=&amp;lt;replica-set-name&amp;gt;&amp;amp;directConnection=true&amp;amp;tls=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;mongodb://user:password@atlas-xxxxx-shard-00-01.xxxxx.mongodb.net:27017/?replicaSet=atlas-xxxxx-shard-0&amp;amp;directConnection=true&amp;amp;tls=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;directConnection=true 옵션을 사용하면 &lt;b&gt;특정 Secondary 노드에 직접 접속&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 작업 전 상태 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compact 작업 전에는 &lt;b&gt;Replica Set 상태와 replication 상태를 반드시 확인&lt;/b&gt;해야 한다.&lt;br /&gt;아래 명령어들은 &lt;b&gt;Primary 또는 Secondary 어느 노드에서든 실행 가능&lt;/b&gt;하지만 일반적으로 &lt;b&gt;Primary에서 전체 상태 확인&lt;/b&gt;을 진행한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;db.stats()
rs.status()
db.hello()
rs.printReplicationInfo()
rs.printSecondaryReplicationInfo()
rs.status().members.map(m =&amp;gt; ({name: m.name, state: m.stateStr, health: m.health}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 명령어 용도&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;db.stats()&lt;/b&gt;&lt;br /&gt;DB의 &lt;b&gt;data size / storage size / index size&lt;/b&gt; 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rs.status()&lt;/b&gt;&lt;br /&gt;Replica Set &lt;b&gt;전체 상태 및 노드 역할(PRIMARY / SECONDARY)&lt;/b&gt; 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;db.hello()&lt;/b&gt;&lt;br /&gt;현재 접속 노드가 &lt;b&gt;Primary인지 Secondary인지 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rs.printReplicationInfo()&lt;/b&gt;&lt;br /&gt;oplog 크기 및 replication window 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rs.printSecondaryReplicationInfo()&lt;/b&gt;&lt;br /&gt;Secondary replication lag 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt; rs.status().members.map(m =&amp;gt; ({name: m.name, state: m.stateStr, health: m.health})) &lt;/b&gt;&lt;br /&gt;모든 노드의 &lt;b&gt;name / state / health 요약 확인&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Compact 실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compact 명령어는 &lt;b&gt;서비스 영향 최소화를 위해 Secondary 노드에서 실행&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;db.runCommand({ compact: 'yourCollectionName' })
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Primary에서 실행할 경우 &lt;b&gt;해당 컬렉션 write가 block될 수 있고, &lt;/b&gt;force 옵션을 쓰라고 나오지만 무시하는게 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 작업 순서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 보통 아래 순서로 진행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Secondary 노드에서 compact 실행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;작업 완료 후 &lt;b&gt;stepdown / failover 진행하여 Primary 전환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;기존 Primary가 Secondary가 되면 동일하게 compact 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식으로 &lt;b&gt;서비스 영향 없이 모든 노드를 순차적으로 정리&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 작업 시 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Analytics Node&lt;/b&gt;는 다른 클라우드/VPC에 존재하는 경우가 있어&lt;br /&gt;접속이 되지 않으면 &lt;b&gt;IP Allowlist 추가가 필요할 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;MongoDB 디스크 공간 정리 완료 후 필요에 따라서는&lt;b&gt; Cluster Spec 변경 (스케일업 / 스케일다운)&lt;/b&gt; 작업이 필요할 경우&lt;br /&gt;&lt;b&gt;수 분 ~ 수 시간까지 소요될 수 있으므로&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그 모니터링&lt;/li&gt;
&lt;li&gt;Replica 상태 모니터링&lt;/li&gt;
&lt;li&gt;작업 상태 확인&lt;/li&gt;
&lt;/ul&gt;
을 지속적으로 수행해야 한다.&lt;/li&gt;
&lt;li&gt;작업이 장시간 진행되거나 문제가 발생하면&lt;br /&gt;&lt;b&gt;MongoDB Support 티켓을 열어 함께 진행하는 것이 안전하다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 문서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/faq/storage/#how-do-i-reclaim-disk-space-in-wiredtiger-&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/faq/storage/#how-do-i-reclaim-disk-space-in-wiredtiger-&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.mongodb.com/ko-kr/docs/manual/reference/command/compact/#mongodb-dbcommand-dbcmd.compact&quot;&gt;https://www.mongodb.com/ko-kr/docs/manual/reference/command/compact/#mongodb-dbcommand-dbcmd.compact&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타/Mongodb</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/249</guid>
      <comments>https://happyengine.tistory.com/249#entry249comment</comments>
      <pubDate>Thu, 5 Mar 2026 13:28:42 +0900</pubDate>
    </item>
    <item>
      <title>bitwarden 로그인할 때 에러가 날 경우</title>
      <link>https://happyengine.tistory.com/248</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Bitwarden을 처음 사용하거나 이전에 어렴풋이 사용했던 상황에서 로그인할 경우 에러가 나는 경우가 종종 있다. 패스워드가 틀렸거나 확인이 안되는 등 다양한 상황에서 제일 강력한 해결 방법중에 하나&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;https://vault.bitwarden.com/#/recover-delete 여기서 내 이메일 계정을 삭제하면 해결되는 경우가 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;https://vault.bitwarden.com/#/recover-delete&lt;/blockquote&gt;</description>
      <category>기타/Bitwarden</category>
      <category>bitwarden</category>
      <category>bitwarden 로그인할 때 에러가 날 경우</category>
      <category>delete old account</category>
      <category>https://vault.bitwarden.com/#/recover-delete</category>
      <category>recover account</category>
      <category>wrong password</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/248</guid>
      <comments>https://happyengine.tistory.com/248#entry248comment</comments>
      <pubDate>Tue, 21 Oct 2025 16:51:51 +0900</pubDate>
    </item>
    <item>
      <title>bitwarden enterprise my vault 안 보이는 이슈 (내 보관함)</title>
      <link>https://happyengine.tistory.com/247</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Bitwarden enterprise를 사용할 경우 admin이나 owner가 아닌 계정은 my vault (내 보관함)이 안 보인다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Owner 계정으로 로그인해서 Policies 에서 Enforce organization data ownership 을 off 하면 일반 계정에서 내 보관함이 확인 된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;https://bitwarden.com/help/policies/#enforce-organization-data-ownership&lt;/blockquote&gt;</description>
      <category>기타/Bitwarden</category>
      <category>bitwarden</category>
      <category>bitwarden enterprise my vault 안 보이는 이슈 (내 보관함)</category>
      <category>enforce-organization-data-ownership</category>
      <category>enterprise bitwarden</category>
      <category>my vault</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/247</guid>
      <comments>https://happyengine.tistory.com/247#entry247comment</comments>
      <pubDate>Mon, 13 Oct 2025 17:55:39 +0900</pubDate>
    </item>
    <item>
      <title>[ECR] [Scanning]: Ubuntu 24.04 not supported</title>
      <link>https://happyengine.tistory.com/246</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ECR image Scanning을 할 때 지원이 안한다는 메세지와 함께 멈추는 경우가 있다.&lt;br /&gt;[ECR] [Scanning]: Ubuntu 24.04 not supported&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방법&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Features &amp;amp; Settings &amp;gt;&amp;gt; Scanning &amp;gt;&amp;gt; Opt in &amp;gt;&amp;gt; Scan Type (Enhanced)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning-basic.html&lt;br /&gt;https://github.com/aws/containers-roadmap/issues/2434&lt;br /&gt;https://docs.aws.amazon.com/inspector/latest/user/supported.html#w123aac53c15&lt;/blockquote&gt;</description>
      <category>AWS/Amazon Elastic Container Registry</category>
      <category>ECR</category>
      <category>ecr scanning</category>
      <category>ubuntu 24</category>
      <category>[ECR] [Scanning]: Ubuntu 24.04 not supported</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/246</guid>
      <comments>https://happyengine.tistory.com/246#entry246comment</comments>
      <pubDate>Wed, 6 Aug 2025 11:26:30 +0900</pubDate>
    </item>
    <item>
      <title>CloudFront Route53 HTTPS DNS record 지원</title>
      <link>https://happyengine.tistory.com/245</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;CloudFront alias로 Route53에서 HTTPS DNS record를 지원 (2025년 7월 1일)&lt;br /&gt;https://aws.amazon.com/ko/blogs/networking-and-content-delivery/boost-application-performance-amazon-cloudfront-enables-https-record/&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;DNS 쿼리 비용 절감&lt;br /&gt;DNS RTT 절감&lt;br /&gt;HTTPS 바로 시작&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적용방법&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. CloudFront HTTP/2, HTTP/3 enable&lt;br /&gt;2. Route53 a record alias CloudFront 생성&lt;br /&gt;3. Route53 HTTPS record alias CloudFront 생성&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확인방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751509207793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### MAC 기본 유틸 dig
# dig -v
DiG 9.10.6
# dig exmaple TYPE65

#### dig latest
# brew install bind
# echo 'alias dig=&quot;/opt/homebrew/bin/dig&quot;' &amp;gt;&amp;gt; ~/.zshrc
# source ~/.zshrc
# dig -v                                        
DiG 9.20.10
# dig example.com HTTPS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비고 (AWS는 적용안되어 있고, 구글 이나 클라우드플레어는 잘 되어 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1751509264628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;➜  ~ dig amazonaws.com HTTPS

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.20.10 &amp;lt;&amp;lt;&amp;gt;&amp;gt; amazonaws.com HTTPS
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 63616
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: ba13fd850a96cabf010000006865e55ec520d43d566125a5 (good)
;; QUESTION SECTION:
;amazonaws.com.			IN	HTTPS

;; AUTHORITY SECTION:
amazonaws.com.		900	IN	SOA	dns-external-master.amazon.com. hostmaster.amazon.com. 2017224478 180 60 604800 900

;; Query time: 8 msec
;; SERVER: 168.126.63.1#53(168.126.63.1) (UDP)
;; WHEN: Thu Jul 03 11:05:18 KST 2025
;; MSG SIZE  rcvd: 147

➜  ~ dig google.com HTTPS

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.20.10 &amp;lt;&amp;lt;&amp;gt;&amp;gt; google.com HTTPS
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 43173
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: d6431d33010ba853010000006865e5665cb50cbf6aa8f0af (good)
;; QUESTION SECTION:
;google.com.			IN	HTTPS

;; ANSWER SECTION:
google.com.		1415	IN	HTTPS	1 . alpn=&quot;h2,h3&quot;

;; ADDITIONAL SECTION:
google.com.		70	IN	A	142.250.198.46
google.com.		21	IN	AAAA	2404:6800:4005:81b::200e

;; Query time: 8 msec
;; SERVER: 168.126.63.1#53(168.126.63.1) (UDP)
;; WHEN: Thu Jul 03 11:05:26 KST 2025
;; MSG SIZE  rcvd: 136

➜  ~ dig cloudflare.com HTTPS

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.20.10 &amp;lt;&amp;lt;&amp;gt;&amp;gt; cloudflare.com HTTPS
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 9447
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: c43ae3d6d007332d010000006865e56e1ef19160a3c47d37 (good)
;; QUESTION SECTION:
;cloudflare.com.			IN	HTTPS

;; ANSWER SECTION:
cloudflare.com.		184	IN	HTTPS	1 . alpn=&quot;h3,h2&quot; ipv4hint=104.16.132.229,104.16.133.229 ipv6hint=2606:4700::6810:84e5,2606:4700::6810:85e5

;; ADDITIONAL SECTION:
cloudflare.com.		294	IN	A	104.16.132.229
cloudflare.com.		294	IN	A	104.16.133.229

;; Query time: 9 msec
;; SERVER: 168.126.63.1#53(168.126.63.1) (UDP)
;; WHEN: Thu Jul 03 11:05:35 KST 2025
;; MSG SIZE  rcvd: 176&lt;/code&gt;&lt;/pre&gt;</description>
      <category>AWS/Amazon CloudFront</category>
      <category>cloudfront https dns record</category>
      <category>Dig</category>
      <category>https dns record</category>
      <category>https://aws.amazon.com/ko/blogs/networking-and-content-delivery/boost-application-performance-amazon-cloudfront-enables-https-record/</category>
      <category>route53 query</category>
      <author>워니주니구니</author>
      <guid isPermaLink="true">https://happyengine.tistory.com/245</guid>
      <comments>https://happyengine.tistory.com/245#entry245comment</comments>
      <pubDate>Thu, 3 Jul 2025 11:24:20 +0900</pubDate>
    </item>
  </channel>
</rss>