<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>go_sbchi.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 13 Aug 2025 16:50:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>go_sbchi.log</title>
            <url>https://velog.velcdn.com/images/go_sbchi/profile/97a58d22-243a-42e3-9c6e-261cdbd4d64f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. go_sbchi.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/go_sbchi" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Cloud Portfolio — 최승범]]></title>
            <link>https://velog.io/@go_sbchi/Cloud-Portfolio-%EC%B5%9C%EC%8A%B9%EB%B2%94</link>
            <guid>https://velog.io/@go_sbchi/Cloud-Portfolio-%EC%B5%9C%EC%8A%B9%EB%B2%94</guid>
            <pubDate>Wed, 13 Aug 2025 16:50:24 GMT</pubDate>
            <description><![CDATA[<p>Email: <a href="mailto:csb19989@gmail.com">csb19989@gmail.com</a> · GitHub: <a href="https://github.com/ChoiSeungBeom">https://github.com/ChoiSeungBeom</a></p>
<hr>
<h2 id="about">About</h2>
<p>AWS 기반 <strong>운영/기술지원</strong>에 강점이 있습니다. IaC(재현성), CI/CD(속도), Observability+RCA(안정성)를 중심으로
<strong>“변경은 작게, 기록은 정확히”</strong> 원칙으로 재발을 줄이는 운영을 지향합니다.</p>
<h2 id="skill-map">Skill Map</h2>
<ul>
<li><strong>Cloud</strong>: AWS VPC, EC2/Auto Scaling, ALB, RDS, S3, CloudFront, Route 53, ACM, ECR, EKS, WAF</li>
<li><strong>IaC/CI/CD</strong>: Terraform(모듈화), Jenkins, Argo CD, Git</li>
<li><strong>Observability</strong>: CloudWatch, Prometheus, Grafana(대시보드·알람)</li>
<li><strong>Ops/Sec</strong>: 최소권한 SG, 프라이빗 서브넷, HTTPS 강제, 캐시/Invalidation, 변경관리</li>
</ul>
<h2 id="highlights">Highlights</h2>
<ul>
<li><strong>반복 가능한 인프라</strong>: CloudFront→ALB(HTTPS)→EC2(ASG)→RDS 아키텍처를 Terraform으로 모듈화  </li>
<li><strong>자동 배포</strong>: Jenkins(빌드)→Argo CD(배포)로 릴리스 절차 표준화  </li>
<li><strong>관측성 기반 운영</strong>: Grafana/Prometheus 대시보드 + 로그 분석으로 이상 조기 탐지  </li>
<li><strong>대표 성과</strong>: 배포 리드타임 <strong>수시간 → 수십 분</strong>, Webhook <strong>중복 빌드 0건</strong>, RCA 정례화로 재발 건수 감소</li>
</ul>
<hr>
<h2 id="projects">Projects</h2>
<h3 id="tpb--wordpress-https-인프라-개인-202506202508">TPB — WordPress HTTPS 인프라 (개인, 2025.06–2025.08)</h3>
<p><strong>역할</strong>: 전체 설계·구현, Terraform 모듈화, 운영 가이드<br><strong>아키텍처</strong><br><img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/infra-architecture.png" alt="TPB Architecture" width="900" />
<br>
<strong>TLS/ACM 구조</strong><br><img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/tls-acm-architecture.png" alt="TLS/ACM" width="900" /></p>
<p><strong>핵심 기여</strong></p>
<ul>
<li>VPC/ALB/EC2/ASG/RDS/CloudFront/Route 53/ACM/Bastion <strong>모듈화</strong>로 동일 환경 반복 배포</li>
<li>UserData 자동 설치(Nginx·PHP-FPM·WordPress), HTTP→HTTPS 강제</li>
<li><strong>헬스체크</strong>·캐시 정책·DNS A(ALIAS) 정합성 확보</li>
</ul>
<p><strong>운영(선별 스크린)</strong></p>
<ul>
<li>VPC &amp; Subnets  <img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/vpc-subnets.png" alt="VPC & Subnets" width="900" /></li>
<li>ALB 리스너  <img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/alb-listeners.png" alt="ALB Listeners" width="900" /></li>
<li>CloudFront 배포/헤더  <img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/cloudfront-distribution.png" alt="CloudFront Behaviors" width="900" />
<img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/cf-response-headers.png" alt="CF Response Headers" width="900" />

</li>
</ul>
<p><strong>Troubleshooting (RCA)</strong></p>
<ul>
<li><strong>HTTPS 리다이렉션 루프</strong><br>원인: 프록시 헤더(<code>X-Forwarded-Proto</code>) 미처리 + 중복 리다이렉션<br>조치: Nginx·wp-config 보완, ALB/CloudFront 정책 정리<br>재발방지: <strong>배포 체크리스트</strong> 항목화(HTTPS 강제/헤더 확인)</li>
<li><strong>CloudFront 캐시 지연</strong><br>원인: TTL 과다·Invalidation 누락<br>조치: TTL 합리화 + Invalidation 절차화</li>
</ul>
<p><strong>결과</strong></p>
<ul>
<li>배포 리드타임 <strong>수시간→수십 분</strong>, HTTPS 기본화로 안정성·보안 강화  </li>
<li><code>terraform apply</code>로 리소스 일괄 생성(39 added)  <img src="https://github.com/ChoiSeungBeom/tpb-project/raw/main/docs/images/terraform-apply.png" alt="Terraform Apply" width="900" />

</li>
</ul>
<hr>
<h3 id="weasel--ai-문제-해설-서비스-인프라-팀-202504202507">Weasel — AI 문제 해설 서비스 인프라 (팀, 2025.04–2025.07)</h3>
<p><strong>역할</strong>: Jenkins 전체 관리, 관측성 구축, Terraform 일부 코드화<br><strong>구성</strong>: ECR→EKS, ALB/CloudFront, Jenkins(빌드)→Argo CD(배포), Prometheus/Grafana, CloudWatch</p>
<p><strong>아키텍처</strong>
<img src="https://velog.velcdn.com/images/go_sbchi/post/7eb4fcdf-a4b1-4d22-992a-42aef5723bf7/image.png" alt="Weasel Architecture (Route 53→CloudFront+WAF→ALB→EKS, RDS/S3 연동)" width="900" /></p>
<p><strong>CI/CD 흐름</strong>
<img src="https://velog.velcdn.com/images/go_sbchi/post/540a19b6-52b4-4627-b955-7c51e479bae3/image.png" alt="Jenkins→ECR/Manifest Repo→Argo CD→EKS, FE는 S3/CloudFront" width="900" /></p>
<p><strong>핵심 기여</strong></p>
<ul>
<li>Generic Webhook + 브랜치 필터링으로 <strong>main 단일 파이프라인</strong> 유지(중복 빌드 제거)</li>
<li>Grafana 대시보드로 CPU/메모리/지연/에러율 <strong>상시 모니터링</strong>, Slack 알림 연동</li>
</ul>
<p><strong>운영 스크린샷</strong></p>
<!-- Jenkins 빌드/알림 -->
<img src="https://velog.velcdn.com/images/go_sbchi/post/9fc18e1a-ec4a-45d0-83ea-9eff85c9efa3/image.png" alt="Slack 채널 Jenkins 빌드 알림" width="900" />
<!-- Grafana -->
<img src="https://velog.velcdn.com/images/go_sbchi/post/c7162e2d-e299-4330-b75e-90b921141a3e/image.png" alt="Grafana 대시보드 (노드 CPU/메모리/버전)" width="900" />

<p><strong>Webhook/필터링 설정(증빙)</strong>
<img src="https://velog.velcdn.com/images/go_sbchi/post/f29fe7ae-e3e6-4f66-b30c-c916b075f02c/image.png" alt="Jenkins Generic Webhook Trigger - JSONPath 변수(ref)" width="900" />
<img src="https://velog.velcdn.com/images/go_sbchi/post/fe380a3a-f5d6-482a-a7c9-c0e58fd21855/image.png" alt="Jenkins Generic Webhook Trigger - Optional filter (refs/heads/main)" width="900" />
<img src="https://velog.velcdn.com/images/go_sbchi/post/e888d231-7004-4d6d-97c4-a1ccd8b1c68c/image.png" alt="GitHub Webhook 설정 (payload URL/token)" width="900" /></p>
<p><strong>Troubleshooting (RCA)</strong></p>
<ul>
<li><strong>Jenkins Webhook 다중 실행</strong><br>원인: 모든 브랜치 트리거 → 설정에 브랜치 필터링 부재<br>조치: JSONPath(<code>$.ref</code>) 변수 추출 + 정규식 <code>refs/heads/main</code>으로 <strong>main만 빌드</strong><br>결과: 불필요 빌드 <strong>0건</strong></li>
</ul>
<p><strong>결과</strong></p>
<ul>
<li>코드 푸시→배포 자동화로 릴리스 속도 및 안정성 개선  </li>
<li>대시보드/알람 기반 운영으로 <strong>탐지→원인 파악 시간 단축</strong></li>
</ul>
<hr>
<h2 id="qa--qc-요약">QA &amp; QC 요약</h2>
<table>
<thead>
<tr>
<th>프로젝트</th>
<th>QA (예방 중심)</th>
<th>QC (사후 점검 중심)</th>
</tr>
</thead>
<tbody><tr>
<td><nobr><strong>Weasel</strong></nobr></td>
<td>CI/CD 자동화(Jenkins·Argo CD)로 <strong>일관된 배포 절차</strong></td>
<td>Prometheus·Grafana <strong>모니터링</strong>과 로그 분석으로 이슈 탐지·대응</td>
</tr>
<tr>
<td><nobr><strong>TPB</strong></nobr></td>
<td>Terraform <strong>자동화 배포</strong>, HTTPS/보안 구성, <strong>헬스체크 설계</strong></td>
<td><strong>체크리스트 기반</strong> 트러블슈팅과 절차 문서화</td>
</tr>
</tbody></table>
<hr>
<h2 id="contact">Contact</h2>
<p>Email: <a href="mailto:csb19989@gmail.com">csb19989@gmail.com</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[실수로 만든 계정 Close Account 활용해보기 : AWS Organizations 트러블슈팅]]></title>
            <link>https://velog.io/@go_sbchi/troubleshooting-aws-organizations-closeaccount</link>
            <guid>https://velog.io/@go_sbchi/troubleshooting-aws-organizations-closeaccount</guid>
            <pubDate>Tue, 29 Jul 2025 11:13:31 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p>AWS Organizations를 이용해 다중 계정을 중앙에서 관리하기 위해서는 기존에 사용하던 계정 또는 Organizations를 이용해 새로 만든 계정이 필요하다. 이번 포스팅에서는 AWS Organizations에서 계정 생성 후 실수로 잘못 만든 계정을 삭제하려다 발생한 문제와 해결 과정을 정리했다.</p>
<hr>
<h2 id="📚-참고자료">📚 참고자료</h2>
<ul>
<li><p><a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_close.html">AWS 공식 문서: Closing a member account in an organization with AWS Organizations</a></p>
</li>
<li><p><a href="https://docs.aws.amazon.com/accounts/latest/reference/using-orgs-trusted-access.html">AWS 공식 문서 : Enable trusted access for AWS Account Management</a></p>
</li>
</ul>
<hr>
<h2 id="배경-왜-계정-삭제가-필요했는가">배경: 왜 계정 삭제가 필요했는가?</h2>
<p> Organizations로 생성한 멤버 계정의 이름을 목표한 조직의 구조와 맞지 않아 편집하려고 했는데 찾기가 어려워 삭제 후 계정 재생성을 하려고 했다.</p>
<hr>
<h2 id="문제-해결-시도">문제 해결 시도</h2>
<blockquote>
<h3 id="문제-해결-시도-1--멤버-계정에서-조직-탈퇴-시도--실패">문제 해결 시도 #1 : 멤버 계정에서 조직 탈퇴 시도  (실패)</h3>
</blockquote>
<ul>
<li>방금 생성한 계정에 들어가 조직 탈퇴를 눌러봤지만 결제 방법 등록 및 주소 등록 등의 복잡한 절차를 요구해서 1차 실패, 후에 모든 요소 등록 후 재시도 해봤지만 AWS Organizations로 계정 생성 시 AWS는 보안 상의 이유로 일정 기간 동안 조직 탈퇴를 제한해서 실패했다.
<code>조직을 탈퇴하려면 독립적인 계정으로 인정받아야 한다. (standalone)</code></li>
</ul>
<blockquote>
<h3 id="문제-해결-시도-2--관리-계정에서-close-account-이용해-삭제-시도">문제 해결 시도 #2 : 관리 계정에서 Close Account 이용해 삭제 시도</h3>
</blockquote>
<ul>
<li><p>관리 계정 AWS Organizations 콘솔에서 삭제할 계정 선택 ➡️ 계정 닫기(Close Account) 클릭 </p>
</li>
<li><p>Close Account 를 하려면 멤버 계정이 결제 및 주소 등록을 마친 상태</p>
<blockquote>
<p>⚠️ 예상과 다른 결과: 계정은 여전히 존재
<code>계정 상태 : Suspended(중지) 상태로 변경</code></p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="계정-닫기close-account-기능의-의미">계정 닫기(Close Account) 기능의 의미</h2>
<ul>
<li><p><code>계정 닫기</code>는 즉시 삭제가 아닌 90일간 유예 기간을 두고 계정을 비활성화하는 상태</p>
</li>
<li><p>이 기간 동안 계정은 비활성화 상태로 유지되고, 필요 시 복구 가능하다.
<code>AWS의 과금, 보안, 법적 문제 대비 정책</code></p>
<p>  ⛔ 즉시 삭제되지 않는 이유 : 청구 및 보안 문제로 인해 계정을 즉시 삭제하지 않음</p>
</li>
<li><p>🛠️ 복구</p>
<ul>
<li>90일 내 AWS Support를 통해 계정 복구 가능</li>
</ul>
</li>
<li><p>90일이 지난 후 계정 삭제</p>
</li>
</ul>
<hr>
<h3 id="계정-문의-방법">계정 문의 방법</h3>
<ul>
<li>AWS Organizations의 관리 계정으로 AWS Support에 접속해 문의하면 복구 시켜줌</li>
</ul>
<blockquote>
<p>💡 주의 : Root 계정으로 문의해야 한다.</p>
</blockquote>
<p> <img src="https://velog.velcdn.com/images/go_sbchi/post/188ca56d-e8ab-4640-90c5-5b2405201bb4/image.png" alt=""></p>
<hr>
<h2 id="문제-해결">문제 해결</h2>
<p>멤버 계정 이름을 조직 구조에 맞게 변경 시키고 계정을 Suspend 상태에서 복구 요청했다.</p>
<blockquote>
<p>계정 이름 변경 방법</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/87aa3e02-1857-4add-bec2-5ffa8321bde5/image.png" alt=""></p>
<p>관리 계정 ➡️ AWS Organizations ➡️ AWS 계정 ➡️ 멤버 계정 클릭 </p>
<ul>
<li>아래쪽에 AWS Account Management의 신뢰할 수 있는 액세스가 활성화되지 않았다는 문구가 뜬다. </li>
</ul>
<blockquote>
<p>AWS Account Management란?</p>
</blockquote>
<ul>
<li><p>AWS Organizations 내에서 계정 관리 기능을 확장하기 위해 사용되는 기능</p>
<table>
<thead>
<tr>
<th>기능</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>계정 이름 변경</strong></td>
<td>멤버 계정의 이름(Name)을 콘솔에서 직접 수정 가능</td>
</tr>
<tr>
<td><strong>이메일 주소 변경</strong></td>
<td>계정의 이메일 주소도 변경 가능 (조건 있음)</td>
</tr>
<tr>
<td><strong>계정 보안 설정 조회</strong></td>
<td>MFA 활성 여부, 루트 계정 로그인 여부 등 확인</td>
</tr>
<tr>
<td><strong>계정 태그 관리</strong></td>
<td>계정에 태그를 달아 분류 및 검색 가능</td>
</tr>
</tbody></table>
<ul>
<li>활성화 하는 법 : AWS Organization ➡️ 서비스 탭에서 AWS Account Management 찾고 클릭 ➡️ 신뢰할 수 있는 액세스 활성화
<img src="https://velog.velcdn.com/images/go_sbchi/post/b5cf0709-79df-4e9c-afad-20e8b7f5d4a6/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/885eaa00-3d8a-44f0-8591-52576667a65c/image.png" alt=""></p>
<ul>
<li>다시 멤버계정에 돌아가보면 아까와 다르게 계정 이름을 업데이트 할 수 있는 작업 버튼이 생겼다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1dd1c2b1-12df-4027-a131-9c338fe6ecc6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/517f5b46-9a67-4f41-957d-c1d4fec8b7ab/image.png" alt=""></p>
<hr>
<h3 id="💡-정리">💡 정리</h3>
<ul>
<li><p>Close Account 기능은 계정 삭제를 시키긴 하지만, 90일의 소요 시간이 걸린다.</p>
</li>
<li><p>실수 방지를 위한 계정 네이밍 및 메모 전략 또는 네이밍을 잘못했다고 리소스를 지우고 다시 생성하는 습관을 버리자..</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[환경 구축 - AWS Organizations로 계정 구조화와 SCP연결]]></title>
            <link>https://velog.io/@go_sbchi/env-aws-organizations</link>
            <guid>https://velog.io/@go_sbchi/env-aws-organizations</guid>
            <pubDate>Sat, 26 Jul 2025 08:04:59 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p> 이전 글에서는 <code>Assume Role</code>을 이용해 다중 계정 간 리소스를 안전하게 공유하고 권한을 위임하는 방법을 정리했다.
 하지만 계정 수가 많아지고 팀/조직 단위로 운영이 복잡해질수록, 단순한 역할 위임만으로는 통합적인 관리가 어려워진다.
 이번 시간에는 <code>AWS Organizations</code>라는 <code>계정 중앙 관리 시스템</code>을 이용해 
효율적인 계정 통합과 정책 관리를 어떻게 하는지에 대해 정리해보았다.</p>
<hr>
<h3 id="🔗-관련링크">🔗 관련링크</h3>
<p><a href="https://velog.io/@go_sbchi/account-management">AWS 계정의 기초 관리</a></p>
<p><a href="https://velog.io/@go_sbchi/env-aws-multi-account-management">AWS 다중 계정 구조에서 Assume Role로 권한 위임해보기</a> </p>
<p><a href="https://velog.io/@go_sbchi/troubleshooting-aws-organizations-closeaccount">TroubleShooting-AWS Organizations로 잘못 만든 계정 Closeaccount로 삭제하기</a></p>
<hr>
<blockquote>
<h2 id="aws-organizations-개념">AWS Organizations 개념</h2>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/91740b4e-4e37-42d1-9606-a0b416748b81/image.png" alt=""></p>
<h2 id="aws-organizations란">AWS Organizations란?</h2>
<ul>
<li><p>여러 개의 AWS 계정을 중앙에서 통합 관리할 수 있는 서비스</p>
</li>
<li><p>계정 생성 및 관리, 정책 적용, 액세스 제어 등을 중앙에서 수행 가능</p>
</li>
<li><p>하나의 Organization은 하나의 관리 계정과 0개 이상의 멤버 계정으로 구성됨
<code>AWS계정은 단 하나의 Organization 소속만 가능하다.</code></p>
</li>
<li><p>Organizations로 생성된 계정은 계정 닫기를 통해 비활성화 후 제거할 수 있다.</p>
</li>
</ul>
<blockquote>
<p>계정 닫기(Close Account)란? </p>
</blockquote>
<p>AWS Organizations 환경에서 계정 닫기(Close Account)는 다중 계정 운영 시 불필요해진 계정을 안전하게 종료하고 관리 비용을 줄이기 위한 절차</p>
<hr>
<h3 id="📕-써야-하는-이유">📕 써야 하는 이유</h3>
<ul>
<li><p><strong>OU 단위 조직 관리</strong><br>계정을 <code>조직 단위(OU)</code>로 그룹화해서 정책을 적용하고 제어 가능</p>
</li>
<li><p><strong>비용 통합 관리</strong><br>모든 계정의 리소스 사용 비용을 하나의 <strong>관리 계정으로 <code>통합 청구</code></strong>  </p>
</li>
<li><p><strong>보안 정책 일괄 적용</strong><br>모든 계정에 대해 <strong>SCP(서비스 제어 정책)</strong>을 일괄 적용 가능</p>
</li>
<li><p><strong>계정 생성 자동화 및 초대</strong><br>새 계정을 Organizations에서 간편하게 생성할 수 있고, 새 계정은 OU에 자동 분류가 가능한 서비스가 있다.
<code>기존 계정도 OU에 배치 가능</code></p>
</li>
<li><p><strong>실수 방지</strong> 
프로덕션 과 개발 계정을 분리하여 실수로 리소스를 삭제하는 사고 예방 가능</p>
</li>
</ul>
<hr>
<blockquote>
<h3 id="조직에서의-팀-단위-계정-설계-예시">조직에서의 팀 단위 계정 설계 예시</h3>
</blockquote>
<ul>
<li><p>Infra Team, Dev Team , Prod Team으로 분리해서 관리</p>
</li>
<li><p>Team 별 역할 :  </p>
<ul>
<li><p>Infra Team: 공통 인프라 리소스를 별도 계정에서 관리하여, 운영 환경과의 권한 분리를 실현</p>
</li>
<li><p>Dev Team: 개발 전용 계정에서 자유롭게 테스트 및 개발을 수행하면서 운영 계정과 격리</p>
</li>
<li><p>Prod Team: 운영 서비스가 배포되는 계정으로, 보안 및 안정성이 중요한 리소스만 존재</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/198708b7-b60a-41fc-8d67-22329fc7aba5/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>팀 구분</th>
<th>계정 이름</th>
<th>주요 역할 설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Infra Team</strong></td>
<td><code>shared-network</code></td>
<td>VPC, Subnet, IGW, NAT 등 네트워크 리소스를 중앙 관리</td>
</tr>
<tr>
<td></td>
<td><code>central-logging</code></td>
<td>각 팀 계정에서 발생하는 로그 수집 (CloudTrail, S3, Config 등)</td>
</tr>
<tr>
<td></td>
<td><code>security-tooling</code></td>
<td>GuardDuty, Security Hub 등 통합 보안 도구 운영</td>
</tr>
<tr>
<td><strong>Dev Team</strong></td>
<td><code>dev-backend</code></td>
<td>개발 중인 백엔드 애플리케이션 테스트 및 배포 환경 운영</td>
</tr>
<tr>
<td></td>
<td><code>dev-frontend</code></td>
<td>프론트엔드 정적 리소스 배포(S3 + CloudFront 등)</td>
</tr>
<tr>
<td></td>
<td><code>dev-tools</code></td>
<td>CodePipeline, CodeBuild 등 CI/CD 도구 계정</td>
</tr>
<tr>
<td><strong>Prod Team</strong></td>
<td><code>prod-app</code></td>
<td>실제 서비스가 운영되는 운영 환경 애플리케이션 배포</td>
</tr>
<tr>
<td></td>
<td><code>prod-monitoring</code></td>
<td>운영 중인 서비스의 모니터링 전용 계정 (CloudWatch, X-Ray 등)</td>
</tr>
<tr>
<td></td>
<td><code>prod-backup</code></td>
<td>백업 전용 계정, DR(재해복구) 전략 적용</td>
</tr>
</tbody></table>
<hr>
<h3 id="aws-organizations-사용해보기">AWS Organizations 사용해보기</h3>
<blockquote>
<h3 id="🧾-준비">🧾 준비</h3>
</blockquote>
<p>AWS Organizations를 쓰려면 계정이 두 개 이상 필요하다.
이때, Gmail의 +기능을 써서 하나의 Gmail 주소로 여러 AWS 계정을 만들어서 이용하는 게 가능하다.</p>
<p>예시 : 
<a href="mailto:test@gmail.com">test@gmail.com</a> ➡️ <a href="mailto:test+dev@gmail.com">test+dev@gmail.com</a> <code>또는</code> test+prod@gmail.com </p>
<p>AWS는 이걸 각각 다른 이메일로 보고 계정을 만드는게 인정이 된다.
<code>메일은 전부 원래 Gmail 계정으로 온다.</code></p>
<blockquote>
<h4 id="🧪-구성-목표">🧪 구성 목표</h4>
</blockquote>
<p>⚠️ 관리 계정 + 인프라 OU 및 하위 계정 생성</p>
<ol>
<li><p>AWS Organizations에서 관리 계정(Management Account)을 기준으로 조직을 구성한다.</p>
</li>
<li><p><strong>OU(조직 단위, Organizational Unit)</strong>를 생성하여 팀 또는 기능 단위로 계정을 분리한다.</p>
</li>
<li><p>인프라 OU를 생성하고, 여기에 로그 관리 전용 계정을 하나 생성하여 소속시킨다.</p>
</li>
<li><p>큰 단위의 인프라팀 OU 와 로그 확인 용도의 계정에 각각 <strong>SCP(Service Control Policy)</strong>를 적용하여, 어떻게 동작되는지 확인한다.</p>
</li>
</ol>
<table>
<thead>
<tr>
<th>항목</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>관리 계정</td>
<td>Organizations 생성 및 제어를 담당하는 루트 계정</td>
</tr>
<tr>
<td>OU 이름</td>
<td>OU-Infra</td>
</tr>
<tr>
<td>하위 계정</td>
<td>LogAccount</td>
</tr>
<tr>
<td>적용 정책</td>
<td><code>cloudtrail:*</code> ➡️ CloudTrail 생성, 수정, 시작, 중지<br><code>s3:PutObject</code>, <code>s3:ListBucket</code>, <code>s3:GetObject</code> ➡️ 로그 저장용 S3 접근</td>
</tr>
</tbody></table>
<hr>
<h3 id="구성하기">구성하기</h3>
<blockquote>
<ol>
<li>관리 계정 접속 ➡️ AWS 콘솔 ➡️ AWS Organizations ➡️ 조직 생성</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/387b939f-a77c-47a0-88c4-20b9def5bf78/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/fcc90d6c-ac71-4410-9129-0ac018e7cedd/image.png" alt=""></p>
<blockquote>
<ol start="2">
<li>OU 생성</li>
</ol>
</blockquote>
<p>Root 체크 ➡️ 작업 클릭 ➡️ 새로 생성</p>
<ul>
<li>OU 이름 : OU-Infra</li>
</ul>
<p>  <img src="https://velog.velcdn.com/images/go_sbchi/post/8b2f54c9-aef3-4f75-bf48-3c1db80ab582/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/go_sbchi/post/2feb3b6c-38ac-4c2e-b039-ef64c8410e50/image.png" alt=""></p>
<p>  <img src="https://velog.velcdn.com/images/go_sbchi/post/745fd141-4256-4e4e-be9b-34e4dcaf6502/image.png" alt=""></p>
<blockquote>
<ol start="3">
<li>계정 추가 </li>
</ol>
</blockquote>
<ul>
<li><p>상단에 있는 AWS 계정 추가 클릭</p>
</li>
<li><p>AWS 계정 생성에서 정보 입력
<code>기존 계정이 있으면 기존 AWS 계정 초대에서 초대할 수 있다.</code></p>
</li>
</ul>
<p>Gmail의 Alias 기능을 이용해 <code>자신계정+infra@gmail.com</code> 이런식으로 계정을 생성할 수 있다. 이메일 인증은 자신의 원래 계정으로 오게 된다.</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/2149a8eb-4217-4011-8053-335cb3e72ca2/image.png" alt=""></p>
<blockquote>
<ol start="4">
<li>정책 생성</li>
</ol>
</blockquote>
<p>AWS Organizations ➡️ 정책 ➡️ 서비스 제어 정책  ➡️ 서비스 제어 정책 활성화 ➡️ 정책 생성</p>
<table>
<thead>
<tr>
<th>대상</th>
<th>계정 역할</th>
<th>권한 설정</th>
</tr>
</thead>
<tbody><tr>
<td>OU-Infra</td>
<td>인프라 운영 계정 그룹</td>
<td>인프라 서비스 대부분 허용, 위험 작업 제한</td>
</tr>
<tr>
<td>logAccount</td>
<td>로그 수집, 분석 전용</td>
<td>로그 및 Athena 서비스만 허용, 그 외 제한, S3 삭제 차단</td>
</tr>
</tbody></table>
<blockquote>
<p>SCP-OU-Infra</p>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>권한 및 영향</th>
</tr>
</thead>
<tbody><tr>
<td>허용</td>
<td>인프라 운영에 필요한 거의 모든 EC2, 네트워크, 스토리지, DB, 로그, 알림, 보안 키 작업 가능</td>
</tr>
<tr>
<td>제한</td>
<td>IAM 사용자/역할/정책 삭제, S3 버킷 및 객체 삭제 불가 (실수 방지 목적)</td>
</tr>
<tr>
<td>기본 동작</td>
<td>명시하지 않은 권한은 SCP 기준으로 제한됨</td>
</tr>
</tbody></table>
<br>
<br>


<details style="margin-top: 3rem; margin-bottom: 3rem;">
  <summary> 📕 OU-Infra Json Code </summary>



  <pre><code>

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowBasicInfraServices",
      "Effect": "Allow",
      "Action": [
        "ec2:*",
        "s3:*",
        "iam:Get*",
        "iam:List*",
        "logs:*",
        "cloudwatch:*",
        "elasticloadbalancing:*",
        "autoscaling:*",
        "rds:*",
        "sns:*",
        "sqs:*",
        "cloudtrail:*",
        "kms:*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyHighRiskDeleteActions",
      "Effect": "Deny",
      "Action": [
        "iam:DeleteUser",
        "iam:DeleteRole",
        "iam:DeletePolicy",
        "s3:DeleteBucket",
        "s3:DeleteObject"
      ],
      "Resource": "*"
    }
  ]
}


</pre></code>

 </details> 

<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ed7a85ba-0892-4b06-bb86-29fc4726aefe/image.png" alt=""></p>
<blockquote>
<p>SCP-Log-Account</p>
</blockquote>
<table>
<thead>
<tr>
<th>구분</th>
<th>권한 및 영향</th>
</tr>
</thead>
<tbody><tr>
<td>허용</td>
<td>로그 수집 및 분석 관련 서비스(CoudTrail, S3, Athena, Glue, Config, GuardDuty 등) 사용 가능</td>
</tr>
<tr>
<td>제한</td>
<td>명시된 서비스 외 모든 AWS 서비스 사용 불가<br>S3 버킷 및 객체 삭제 차단</td>
</tr>
<tr>
<td>기본 동작</td>
<td>허용된 서비스만 사용 가능하며, 그 외는 모두 차단됨</td>
</tr>
</tbody></table>
<br>
<br>

<details style="margin-top: 3rem; margin-bottom: 3rem;">
  <summary> 📕 SCP-Log-Account Json Code </summary>



  <pre><code>


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowOnlyLoggingAndAnalysis",
      "Effect": "Allow",
      "Action": [
        "cloudtrail:*",
        "s3:*",
        "glue:*",
        "athena:*",
        "logs:*",
        "config:*",
        "guardduty:*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyAllOtherServices",
      "Effect": "Deny",
      "NotAction": [
        "cloudtrail:*",
        "s3:*",
        "glue:*",
        "athena:*",
        "logs:*",
        "config:*",
        "guardduty:*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyS3DeleteActions",
      "Effect": "Deny",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteBucket"
      ],
      "Resource": "*"
    }
  ]
}


</details>

  </pre></code>


<p><img src="https://velog.velcdn.com/images/go_sbchi/post/593b6747-9d84-4a56-8f0a-a6a75e0a639f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/49737705-048f-472b-a70c-66e782eca6ca/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/01ff55a3-84b5-49a7-8a7d-28f5c14d0b9c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1ec5f18f-9583-4e7e-bbd1-ba86cd19fbfa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/3e9f2f53-5b4f-4ec3-b90d-49033d395a5c/image.png" alt=""></p>
<blockquote>
<ol start="5">
<li>정책연결</li>
</ol>
</blockquote>
<p>만들어진 SCP 정책 또는 OU나 계정에서 정책 연결을 하면된다. </p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/bb3119e3-f52a-4de6-952e-e6d17139c0d5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/813be8bd-3bd9-44fa-8262-91729a3f494a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1a57fab6-17e8-4dd0-83b4-41222db541d4/image.png" alt=""></p>
<blockquote>
<ol start="6">
<li>정책 작동 확인</li>
</ol>
</blockquote>
<p>OU-Infra에 속해있는 로그 관리 계정에 접속해 ec2 생성을 하려고 했지만, OU-Infra에는 ec2*(ec2에 관한 모든 행위 허용) SCP가 있어도 로그 관리 계정의 ec2 생성 및 보기 권한이 차단되어있어 접근할 수 없는 것을 확인할 수 있다.</p>
<blockquote>
<p>💡 계정에 <code>FullAWSAccess</code>와 <code>사용자 정의 SCP</code>가 <code>모두 연결</code>되어 있더라도, 두 정책의 <code>교집합만</code> 허용되기 때문에 FullAccess 정책의 모든 권한을 사용할 수는 없다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/4ff2ac03-29fe-4989-9b64-ff6b6f477905/image.png" alt=""></p>
<hr>
<h3 id="📓-정리">📓 정리</h3>
<ul>
<li><p><strong>AWS Organizations</strong>는 여러 AWS 계정을 중앙에서 통합 관리할 수 있게 해주는 서비스로, 대규모 팀 운영에 필수적이다.</p>
</li>
<li><p><strong>OU(Organizational Unit)</strong>를 사용하면 팀, 기능 또는 목적에 따라 계정을 그룹화하고, 각 그룹별로 다른 정책(SCP)을 적용할 수 있다.</p>
</li>
<li><p><strong>SCP(Service Control Policy)</strong>를 통해 각 계정의 권한을 <em>루트 레벨에서 제어</em>할 수 있다. <code>(IAM보다 상위 개념)</code></p>
</li>
<li><p>계정에 두 개 이상의 정책이 <code>모두 연결</code>되어 있더라도, 두 정책의 <code>교집합만</code> 허용되기 때문에 그 중 하나가 FullAccess 정책이라도 모든 권한을 사용할 수는 없다.</p>
</li>
</ul>
<ul>
<li><p>Gmail의 <code>+Alias</code> 기능을 이용하면 하나의 메일 주소로 여러 AWS 계정을 만들어 테스트할 수 있어 비용 없이 학습과 실습이 가능하다.</p>
</li>
<li><p>조직 내 각 팀(Infrastructure, Dev, Prod)은 역할과 책임을 분리해 실수 방지와 보안 강화를 도모할 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[환경 구축 - AWS 다중 계정 구조에서 Assume Role로 권한 위임]]></title>
            <link>https://velog.io/@go_sbchi/env-aws-multi-account-management</link>
            <guid>https://velog.io/@go_sbchi/env-aws-multi-account-management</guid>
            <pubDate>Thu, 10 Jul 2025 19:29:29 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p> 지난 시간에는 <code>IAM User</code>를 통해 관리자 권한을 가진 계정을 만들었다.
 이 방식은 소규모 환경에서는 효율적이지만, 
 팀 단위나 프로젝트 단위로 운영하는 업무 환경에서 하나의 계정으로 모든 리소스를 관리하는 것이 제한적이다.
 이번 시간에는 AWS에서 다계정을 운영할 때, 어떻게 리소스를 관리하고 계정 간 권한을 연동하는지에 대해 정리했다.</p>
<hr>
<h3 id="🔗-관련링크">🔗 관련링크</h3>
<p>AWS 계정 생성 후 초기 설정 
<a href="https://velog.io/@go_sbchi/account-management">https://velog.io/@go_sbchi/account-management</a></p>
<p>환경 구축 - AWS 계정 관리(IAM을 이용해 관리자 계정 만들기) 
<a href="https://velog.io/@go_sbchi/env-aws-iam">https://velog.io/@go_sbchi/env-aws-iam</a></p>
<hr>
<h3 id="다중-계정을-사용하는-이유">다중 계정을 사용하는 이유</h3>
<p>각 목적별, 용도별로 팀단위로 묶어서 관리하기 위해서이다.</p>
<ul>
<li><p>보안과 안정성
<code>하나의 계정으로 모든 것을 관리하게 되면 보안에 취약해지고, 계정을 사용하는 여러 개의 팀중에 하나의 팀만 문제가 생겨도, 전체 시스템에 문제가 생길 수 있기 때문에 분리하여 안정성과 보안을 높인다.</code></p>
</li>
<li><p>비용 관리
<code>비용 청구가 계정 각각에 발생하기 때문에 계정을 사용하는 팀은 다른 팀의 비용청구 내용을 알 필요가 없어서 관리하기 좋다.</code></p>
</li>
<li><p>관리 효율성
<code>각각의 계정별로 리소스나 권한 등을 관리하기 때문에 관리가 편하다.</code></p>
</li>
</ul>
<hr>
<h3 id="계정-간-리소스-접근을-하는-방법">계정 간 리소스 접근을 하는 방법</h3>
<p>팀 단위로 계정을 분리하더라도, 
계정 간에 리소스를 공유하거나 접근해야 하는 상황이 발생한다.
이때 사용하는 기능이 Assume Role이다.</p>
<blockquote>
<p>Assume Role이란?</p>
</blockquote>
<p>다른 계정의 역할을 임시로 해당 계정의 권한을 사용하는 기능</p>
<p><code>내 계정의 사용자가 다른 계정의 권한을 일시적으로 빌려서 그 계정의 리소스를 사용할 수 있도록 해주는 기능</code></p>
<blockquote>
<p>👉 운영 계정에 로그인한 내가, 개발 계정의 S3 버킷을 잠깐 보고 싶을 때 , <code>개발 계정에서 운영 계정에서 사용할 수 있게 역할을 설정</code>해 놓으면 운영 계정에서 나는 개발 계정의 역할을 잠깐 빌려와서 S3를 볼 수 있다.</p>
</blockquote>
<ul>
<li><p>이후 원래 계정의 사용자는 다른 계정의 역할이 허용한 범위 내에서 권한 행사</p>
</li>
<li><p>AWS 콘솔 UI에서 스위칭 가능
<code>AWS 서비스 중 하나인 멀티 세션을 이용하면 세션 만료없이 두개 이상의 계정을 관리할 수 있다.</code></p>
</li>
</ul>
<hr>
<h3 id="🧪-구성-흐름">🧪 구성 흐름</h3>
<ol>
<li><p>A계정에서 로그인 후 역할 생성</p>
</li>
<li><p>멀티 세션을 이용해 A,B 계정 세션 만료 없이 사용</p>
</li>
<li><p>역할 전환으로 B계정으로 A계정 접근</p>
</li>
<li><p>B계정으로 접속중인 상태로 A계정에 S3 버킷 생성해보기</p>
</li>
</ol>
<hr>
<h3 id="📕-assume-role-활용해보기">📕 Assume Role 활용해보기</h3>
<blockquote>
<p>💡 계정 구분</p>
</blockquote>
<p><code>A계정 ID : 05**********</code></p>
<p><code>B계정 ID : 00**********</code></p>
<blockquote>
<ol>
<li>A계정 접속</li>
</ol>
</blockquote>
<ul>
<li>계정 접속 ➡️  IAM 콘솔에 접속 ➡️ 역할 탭 클릭 ➡️ 역할 생성 ➡️ 다음 클릭</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/6c5da619-0daf-4c5a-b6a4-8bd75d137958/image.png" alt=""></p>
<blockquote>
<ol start="2">
<li>세부 정보 구성하기(역할 생성)</li>
</ol>
</blockquote>
<ul>
<li>엔터티 유형 : AWS 계정</li>
<li>아래에 AWS 계정에서 다른 AWS 계정 클릭 : B계정의 계정 ID를 복사 붙여넣기한다. ➡️ 다음 클릭</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7612251a-0c5d-4a03-b2c0-a842613af990/image.png" alt=""></p>
<blockquote>
<ol start="3">
<li>권한 부여</li>
</ol>
</blockquote>
<ul>
<li>테스트이기 때문에 모든 접근이 가능한 AdministratorAccess를 권한으로 부여했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ca35f478-a286-4978-8e37-b42dc1b99cfd/image.png" alt=""></p>
<blockquote>
<ol start="4">
<li>역할 이름 주기 후 완료 클릭</li>
</ol>
</blockquote>
<ul>
<li>역할 이름: aws-multi-account-management</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/add9b629-cf59-4151-b495-f17d48521021/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f46a3e6e-8150-47e1-8dcf-1e7e05970f25/image.png" alt=""></p>
<p><code>이제 B계정에 만들어진 역할만 넘겨주면 A계정에 접근해 동작시킬 수 있다.</code></p>
<blockquote>
<ol start="5">
<li>멀티 세션 키기</li>
</ol>
</blockquote>
<ul>
<li>멀티 세션 지원 켜기 클릭 ➡️ 세션 추가 클릭</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d00df270-4644-4342-9fda-e6a337334bec/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/b732bc21-5b93-4b34-ad26-aa0e930704f5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/6341781a-0615-45e2-9cd4-58c7d669bb1b/image.png" alt=""></p>
<p><code>서로 다른 세션이 켜진게 확인된다.</code></p>
<h4 id="💡-멀티-세션이란">💡 멀티 세션이란?</h4>
<ul>
<li><p>동시에 여러 개의 세션에 접속 유지 시켜주는 AWS 기능 </p>
</li>
<li><p>켜져 있지 않으면 브라우저창을 두 개 띄워놓고 각각 다른 계정으로 로그인 해도, 제일 최근에 로그인한 계정으로 두 개다 바뀐다.</p>
</li>
</ul>
<blockquote>
<ol start="6">
<li>역할 전환</li>
</ol>
</blockquote>
<ul>
<li>B계정에서 아래쪽에 새 역할 클릭</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/76f6d5e9-8aca-4826-92da-8170dedb1d22/image.png" alt=""></p>
<blockquote>
<ol start="7">
<li>구성하기(역할 전환)</li>
</ol>
</blockquote>
<ul>
<li><p>Account ID : A계정 ID</p>
</li>
<li><p>IAM role name : aws-multi-account-management</p>
</li>
<li><p>Display name - optional : login-beom-account ➡️ 선택사항(별명)</p>
</li>
<li><p>Display color - optional : Blue ➡️ 선택사항(역할이 무슨 색으로 표시될 것인가)</p>
</li>
<li><p>완료되면 Switch Role 클릭</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/b1a45263-3ce6-431c-87a4-45d3e947d147/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/6a9d429c-187c-499c-aeee-0f5b8baa9f3f/image.png" alt=""></p>
<p><code>B계정으로 A계정에 접속이 된게 확인된다.</code></p>
<hr>
<blockquote>
<ol start="8">
<li>S3 생성해보기 </li>
</ol>
</blockquote>
<p><code>A 계정에 접근했으니, 아까 주어진 AdministratorAccess 권한을 활용해 S3 버킷이 A계정에 만들어지는지 확인해보자</code> </p>
<ul>
<li><p>Region : ap-northeast-2 , Seoul로 변경</p>
</li>
<li><p>간단한 S3버킷 생성 </p>
</li>
<li><p>이름 : test-bucket-beom</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f50690be-9aed-475e-bebd-2ebfa22a1f5d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/e7e4166c-a976-4f70-868f-496c2cf427b2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/c33850c5-2fe8-4022-bc9c-9d8a6c9c5e15/image.png" alt=""></p>
<p>A계정에 돌아가 확인해 봐도 잘 만들어진게 확인된다.</p>
<hr>
<h3 id="🧾-정리">🧾 정리</h3>
<ul>
<li>계정을 분리하면 보안과 비용 관리를 강화되고, Assume Role로 계정 간 권한을 임시 위임해 리소스를 안전하고 효율적으로 공유할 수 있다.</li>
</ul>
<table>
<thead>
<tr>
<th>항목</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>계정 분리의 장점</strong></td>
<td>보안 강화, 비용 관리 등등</td>
</tr>
<tr>
<td><strong>Assume Role 기능</strong></td>
<td>계정 간 권한 위임을 위한 역할 전환</td>
</tr>
<tr>
<td>*<em>A 계정 *</em></td>
<td>역할을 생성하고 B 계정의 접근을 허용</td>
</tr>
<tr>
<td>*<em>B 계정 *</em></td>
<td>A 계정의 역할을 위임받아 임시 권한 획득 후 리소스 접근</td>
</tr>
<tr>
<td><strong>멀티 세션 기능</strong></td>
<td>여러 계정 간 전환의 간편화</td>
</tr>
<tr>
<td><strong>테스트</strong></td>
<td>B 계정이 A 계정의 S3 버킷에 접근 후 버킷 생성</td>
</tr>
</tbody></table>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[환경 구축 - AWS 계정 관리(IAM을 이용해 관리자 계정 만들기)]]></title>
            <link>https://velog.io/@go_sbchi/env-aws-iam</link>
            <guid>https://velog.io/@go_sbchi/env-aws-iam</guid>
            <pubDate>Thu, 10 Jul 2025 19:29:20 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p> 모든 사용자에게 제한 없이 리소스 접근을 허용하면 보안상 큰 문제가 생길 수 있기 때문에, AWS 환경에서는 <code>사용자마다 권한을 명확히 구분</code>하는 것이 매우 중요하다.</p>
<p> 이번 실습에서는 하나의 AWS 계정 내에서 <code>IAM</code> 을 이용해
관리자에 해당하는 유저를 만들고 , 필요한 권한을 넣어서 관리자의 권한을 수행하게 했다.</p>
<hr>
<h3 id="🔗-관련-링크">🔗 관련 링크</h3>
<p><a href="https://velog.io/@go_sbchi/account-management">AWS 계정의 기초 관리</a></p>
<p><a href="https://velog.io/@go_sbchi/IAM">인증과 인가 - IAM의 AWS에서의 역할</a></p>
<hr>
<h3 id="🧪-구성-목표">🧪 구성 목표</h3>
<p>IAM 사용자 생성으로 루트 계정을 대신할 관리자 계정 구성해보기</p>
<hr>
<h3 id="🛠️-실습-흐름">🛠️ 실습 흐름</h3>
<ol>
<li><p>Root 계정으로 접속 후 IAM 사용자(관리자) 개별 구성</p>
</li>
<li><p>IAM Group을 이용해 관리자의 권한을 가지지 않은 계정에 관리자 권한 부여</p>
</li>
</ol>
<hr>
<blockquote>
<p>👤 IAM 권한 부여는 크게 두 가지 방식이 있다.</p>
</blockquote>
<h3 id="1️⃣-개별-사용자에게-직접-권한-부여">1️⃣ 개별 사용자에게 직접 권한 부여</h3>
<ol>
<li>IAM 사용자 생성하기</li>
</ol>
<ul>
<li>검색에 IAM 검색 ➡️ 사용자 탭에서 사용자 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7dd6efc3-4428-4051-8dc7-01b68b9393a6/image.png" alt=""></p>
<ol start="2">
<li>세부 정보 쓰기</li>
</ol>
<ul>
<li><p>사용자 이름: admin</p>
</li>
<li><p>AWS Management Console에 대한 사용자 액세스 권한 제공 체크</p>
</li>
<li><p>IAM 사용자 생성 클릭 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1cd145fd-4972-470b-80d1-008d67e38673/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/729be522-6d25-4103-8dd2-326fad06a05a/image.png" alt=""></p>
<blockquote>
<p>⚙️ 콘솔 암호의 경우 
사용자 지정 암호 설정 시 - <code>사용자는 다음 로그인 시 새 암호를 생성해야 합니다</code> 체크 해제
선택돼있으면 다음 로그인 때 무조건 다른 비밀번호로 변경해야한다.</p>
</blockquote>
<ul>
<li>완료 후 다음 클릭</li>
</ul>
<ol start="3">
<li>정책 연결 </li>
</ol>
<ul>
<li><p>직접 정책 연결 체크 후 권한 정책은 복잡하게 하지 않고, AdministratorAccess를 넣었다.</p>
<pre><code>  * AdministratorAccess란?  : 

  모든 서비스(*)의 모든 작업(*)을 모든 리소스(*)에 허용

  {
  &quot;Effect&quot;: &quot;Allow&quot;,
  &quot;Action&quot;: &quot;*&quot;,
  &quot;Resource&quot;: &quot;*&quot;
  }</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ddec1a77-fc23-4cac-b237-9e2eebe5ad2d/image.png" alt=""></p>
<ol start="4">
<li>관리자 권한의 IAM 계정 생성 </li>
</ol>
<ul>
<li>콘솔 로그인 URL을 통해 로그인을 할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/8304650e-91be-4595-8e17-654a89a89ed1/image.png" alt=""></p>
<ol start="5">
<li>계정 생성 완료</li>
</ol>
<ul>
<li>🔐 Root 계정에 이어서 추가로 관리자 계정은 보안 강화를 위해 반드시 MFA를 설정한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/6b460d4b-ae69-4365-ae5a-d68451224129/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1381bc4e-31ef-4c21-938e-353ec7a487d0/image.png" alt=""></p>
<pre><code>* 특징 

- 사용자 수가 적거나 임시, 테스트용 계정일 때 사용  

- 빠르고 간단하게 권한 부여 가능  

- 사용자가 많아지면 관리가 어려워지고, 권한 변경 시 일일이 수정해야 함</code></pre><h3 id="2️⃣-그룹에-권한-부여-후-사용자-할당">2️⃣ 그룹에 권한 부여 후 사용자 할당</h3>
<ol>
<li>그룹 생성하기 </li>
</ol>
<ul>
<li>IAM ➡️ 사용자 그룹 ➡️ 그룹 생성 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/416a1b02-4101-4e28-a288-f15ad7296bd1/image.png" alt=""></p>
<ol start="2">
<li>세부 정보 입력 </li>
</ol>
<ul>
<li><p>그룹이름 : admin-group</p>
</li>
<li><p>그룹 권한 AdministratorAccess </p>
</li>
<li><p>클릭 후 생성 </p>
</li>
</ul>
<p>(기존에 만들었던 admin IAM 계정은 이미 관리자 권한이 있기때문에 제외하고 그룹만 생성)</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1497a345-0ec2-4910-9cfe-494c9adadb60/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7d9e44cd-cfb4-4cb1-afa9-53bdb9cf8b9e/image.png" alt=""></p>
<ol start="3">
<li>새로운 IAM User 하나 생성</li>
</ol>
<ul>
<li>이름 : no-role-user </li>
</ul>
<p><code>기존과 같이 IAM 사용자 생성 클릭 후 다음</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/8907e708-0f86-4329-b1b4-9fef671c385b/image.png" alt=""></p>
<ol start="4">
<li>그룹에 추가하지 않음</li>
</ol>
<ul>
<li>권한을 부여하지 않으면 어떤식으로 동작하는지 보기위해 그룹에 넣지않음</li>
</ul>
<p><code>아무것도 하지 않고 다음 클릭</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d28d99d3-d739-42b8-977e-729c2e9c22d6/image.png" alt=""></p>
<ol start="5">
<li>사용자 생성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/99a00ab7-2c6f-4b90-a126-58e122f33884/image.png" alt=""></p>
<ol start="6">
<li>로그인</li>
</ol>
<blockquote>
<p>☁️ ec2를 만드려 했으나 권한이 없으므로 아무 것도 사용할 수가 없다 다시 admin 계정으로 접속 후 그룹에 연결해보자</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/a9d65fa4-85f3-4bb0-824a-81d10c054ed7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/a6533798-d3fc-4228-b26c-ee475b32fc58/image.png" alt=""></p>
<ol start="7">
<li>admin으로 접속 후 사용자 그룹에서 사용자 추가 클릭</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/2e5d82f1-0cfb-4e0d-a089-deb94bae2651/image.png" alt=""></p>
<ol start="8">
<li>admin group에 no-role-user을 넣어보자</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f69c7c62-061b-42c0-91c6-7c940becc46a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f4fa33dc-7db3-465b-8e1c-b630459b3c60/image.png" alt=""></p>
<ol start="9">
<li>no-role-user의 작동 확인</li>
</ol>
<p>ec2가 정상적으로 만들어지는게 확인된다.</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/e6d4390f-ae3d-4f4a-85f6-4ea5381e7355/image.png" alt=""></p>
<pre><code>- 여러 사용자나 역할별 권한 관리가 필요할 때 사용  

- 그룹 권한 변경 시 해당 그룹 모든 사용자에게 자동 적용  

- 신규 사용자 추가가 편리하며 관리 효율성이 높음  

- 초기 그룹 설정과 관리가 필요하고, 그룹이 많아지면 복잡해질 수 있음</code></pre><hr>
<h3 id="정리">정리</h3>
<pre><code>소수 사용자나 빠른 설정은 개별 권한 부여,

다수의 사용자나 조직 관리는 그룹 기반 권한 관리가 적합하다.</code></pre><hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS에서의 Auto Scaling과 LoadBalancer]]></title>
            <link>https://velog.io/@go_sbchi/ASGELB</link>
            <guid>https://velog.io/@go_sbchi/ASGELB</guid>
            <pubDate>Wed, 18 Jun 2025 11:04:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1b992bd6-f267-410f-9a43-cbde62e0c087/image.png" alt=""></p>
<h1 id="🔍-intro">🔍 Intro</h1>
<p>AWS 서비스의 가장 큰 장점은 다른 서비스들과의 유기적인 연결이다. 이번 시간에는 ASG와 ELB를 활용해 트래픽 증가에 대응하고, 서비스 안정성을 높이는 방법을 정리했다.</p>
<hr>
<blockquote>
<h2 id="auto-scaling-이란-">*<em>Auto Scaling 이란? *</em></h2>
</blockquote>
<p><strong>Auto Scaling</strong> :  서버의 부하에 따라 컴퓨팅 자원을 자동으로 늘리거나 줄이는 기능</p>
<ul>
<li><p><code>서버</code>를 사용하려는 사용자가 평소보다 많을 때</p>
<p>  서버에 부하가 발생할 경우, 서버 인스턴스를 자동으로 추가해 서버에 트래픽을 분산시켜서 서비스가 끊기지 않게 한다.</p>
</li>
<li><p><code>서버</code>를 사용하려는 사용자가 평소보다 적을 때</p>
<p>  서비스를 이용하려는 고객이 줄어들어, 부하가 줄면 불필요한 서버를 줄여 비용을 절감한다.</p>
</li>
</ul>
<blockquote>
<p>💡  <strong>Auto Scaling</strong> :  <code>트래픽 변화</code>에 유연하게 대응해 <code>서비스 안정성</code>과 <code>비용 효율성</code>을 동시에 확보하는 기술 </p>
</blockquote>
<ul>
<li>고가용성 보장 및 장애 대비와 안정적인 서비스 운영</li>
</ul>
<pre><code>📌

Auto Scaling: 원리

ASG : Auto Scaling 이라는 원리를 AWS에서 실제로 실행하는 도구</code></pre><hr>
<blockquote>
<h3 id="💡-aws-서비스에서-auto-scaling을-구현하기-위한-기능">💡 <strong>AWS</strong> 서비스에서 Auto Scaling을 구현하기 위한 기능</h3>
</blockquote>
<p><strong>1. Launch Template</strong></p>
<p><strong>2. Auto Scaling Group</strong></p>
<p><strong>3. Scaling Policy</strong></p>
<hr>
<h2 id="aws에서의-auto-scaling">AWS에서의 Auto Scaling</h2>
<blockquote>
<h3 id="1-launch-template의-기능">1. Launch Template의 기능</h3>
</blockquote>
<ul>
<li>EC2 인스턴스 생성 시 사용할 값들을 미리 정의해 놓고, Auto Scaling으로 인스턴스가 증감할 때에, 템플릿을 기반으로 인스턴스가 생성되게 하는 것</li>
</ul>
<table>
<thead>
<tr>
<th>항목</th>
<th>설명</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AMI</strong></td>
<td>어떤 운영체제(OS)를 쓸지</td>
<td>Ubuntu, Amazon Linux, Windows 등</td>
</tr>
<tr>
<td><strong>인스턴스 타입</strong></td>
<td><strong>컴퓨터 사양</strong>  (CPU, 메모리)</td>
<td><code>t3.micro</code>, <code>m5.large</code> 등</td>
</tr>
<tr>
<td><strong>키 페어</strong></td>
<td>EC2에 접속할 수 있는 Key pair</td>
<td><code>MyKey.pem</code> (개인 키 파일)</td>
</tr>
<tr>
<td><strong>보안 그룹</strong></td>
<td>어떤 포트를 열지 정하는 <strong>방화벽</strong></td>
<td>80번(web), 22번(SSH) 허용 등</td>
</tr>
<tr>
<td><strong>User Data</strong></td>
<td>인스턴스가 <strong>처음 켜질 때 자동으로 실행할 스크립트</strong></td>
<td>웹 서버 자동 설치 명령어 등</td>
</tr>
<tr>
<td><strong>IAM Role</strong></td>
<td>인스턴스가 <strong>AWS 자원에 접근할 수 있는 권한</strong></td>
<td>S3, CloudWatch 로그 전송 권한 등</td>
</tr>
<tr>
<td><strong>네트워크 설정</strong></td>
<td>어느 <strong>VPC, 서브넷에 속할지</strong>와 <strong>공인 IP 할당 여부</strong></td>
<td>퍼블릭/프라이빗 서브넷 설정 등</td>
</tr>
</tbody></table>
<hr>
<blockquote>
<h4 id="launch-template-구성-예시"><strong>Launch Template</strong> 구성 예시</h4>
</blockquote>
<table>
<thead>
<tr>
<th>항목</th>
<th>설정 값</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AMI</strong></td>
<td>Amazon Linux 2023 (<code>ami-xxxxxxxxxxxxxxxxx</code>)</td>
</tr>
<tr>
<td><strong>인스턴스 타입</strong></td>
<td><code>t3.micro</code></td>
</tr>
<tr>
<td><strong>키 페어</strong></td>
<td><code>MyKeyPair</code></td>
</tr>
<tr>
<td><strong>보안 그룹</strong></td>
<td><code>sg-xxxxxxxx</code> (포트 80 허용)</td>
</tr>
<tr>
<td><strong>User Data</strong></td>
<td></td>
</tr>
</tbody></table>
<pre><code># UserData 작성

#!/bin/bash
yum update -y
amazon-linux-extras install nginx1 -y
systemctl start nginx
systemctl enable nginx</code></pre><p>목적에 따른 EC2 인스턴스 선택</p>
<table>
<thead>
<tr>
<th>타입 계열</th>
<th>특징</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td>t 계열 (t2, t3)</td>
<td>버스트 성능, 저렴</td>
<td>테스트/개발</td>
</tr>
<tr>
<td>m 계열 (m5, m6)</td>
<td>균형 잡힌 성능</td>
<td>웹 서버, 일반 백엔드</td>
</tr>
<tr>
<td>c 계열</td>
<td>CPU 중심</td>
<td>게임 서버, 데이터 처리</td>
</tr>
<tr>
<td>r 계열</td>
<td>메모리 중심</td>
<td>캐시 서버, DB 서버</td>
</tr>
</tbody></table>
<hr>
<p>🔒 보안 그룹 설정</p>
<table>
<thead>
<tr>
<th>방향</th>
<th>프로토콜</th>
<th>포트 범위</th>
<th>소스</th>
</tr>
</thead>
<tbody><tr>
<td>Inbound</td>
<td>TCP</td>
<td>80</td>
<td>0.0.0.0/0</td>
</tr>
</tbody></table>
<blockquote>
<p>🎯 Launch Template이 Auto Scaling에서 하는 역할</p>
</blockquote>
<p>Auto Scaling Group은 인스턴스를 자동으로 만들고 없애야 하는데, EC2가</p>
<p>무슨 OS를 써야 하고 , 무슨 사양으로 만들어야 하는지를 알아야 되기 때문에,</p>
<p>이걸 미리 정리해둔 Launch Template의 역할이 되게 중요하다.</p>
<hr>
<blockquote>
<h3 id="2-auto-scaling-groupasg란">2. Auto Scaling Group(ASG)란?</h3>
</blockquote>
<ul>
<li>AWS에서 실제로 Auto Scaling을 구현하는 리소스</li>
</ul>
<ul>
<li><p>주요 기능</p>
<ul>
<li><p>📌 1. EC2 인스턴스를 자동으로 늘리고 줄이며, 원하는 수의 인스턴스를 사용하게 조정</p>
<pre><code>  `CloudWatch 지표를 기반으로 자동 확장도 가능`</code></pre></li>
<li><p>📌 2. EC2 자체 헬스 체크 , ELB 헬스 체크로 인스턴스 상태 확인(인스턴스가 죽으면, 종료 후 새로 생성)</p>
</li>
<li><p>📌 3. ASG에 여러 가용영역을 지정하면, 인스턴스를 자동으로 분산 배치해서, 장애 대비</p>
</li>
<li><p>📌 4. 원하는 시간대(<code>Traffic 포화, 비포화 시간</code>)에 미리 맞춰서 인스턴수 수를 변경 가능</p>
</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<h3 id="3-scaling-policy란">3. Scaling Policy란?</h3>
</blockquote>
<ul>
<li><p>클라우드 컴퓨팅 환경에서 리소스를 자동으로 조정하는 규칙을 정의하는 정책
<code>ASG가 언제 인스턴스 숫자를 늘리고 줄이지를 정하는 자동화 규칙</code></p>
</li>
<li><p>Scaling Policy의 보편적인 3가지 방법</p>
<p><code>- Target Tracking  : CPU 사용률의 목표치를 정하고 목표치에 근사하게 자동으로 늘리고 줄임</code></p>
<p><code>- Step Tracking : CPU 사용률 올라갈 시 인스턴스를 더 많이 늘림</code></p>
<p><code>- Scheduled Scaling : 정해진 시간에 자동으로 인스턴스 수 조정</code></p>
</li>
<li><p>Scaling Policy의 특징</p>
<ol>
<li><p>사용자가 갑자기 많아져도 대응 가능</p>
</li>
<li><p>트래픽이 적을 땐 자동으로 인스턴스를 줄여 비용 절감</p>
</li>
<li><p>서버의 증감을 자동으로 해주기 때문에 사람이 직접 서버 수를 늘리거나 줄일 필요없다.</p>
</li>
<li><p>부하에 대한 대응이 가능하기 때문에 고가용성 확보</p>
</li>
</ol>
</li>
</ul>
<hr>
<blockquote>
<h2 id="load-balancer란">Load Balancer란?</h2>
</blockquote>
<p><strong>Load Balancer</strong> : 여러 개의 서버에 들어오는 트래픽을 분산시켜주는 서비스</p>
<ol>
<li><p>서버에 들어오는 접속자 수가 갑자기 많아짐</p>
</li>
<li><p>적은 수의 서버로 갑자기 들어오는 트래픽 처리가 어려워짐</p>
</li>
<li><p>서버를 몇개 더 띄워서 트래픽 처리 예정</p>
</li>
<li><p>트래픽 분산을 Load Balancer라는 것을 통해 처리</p>
</li>
</ol>
<pre><code>🔥 Auto Scaling을 통해 인스턴스 수를 자동으로 늘리거나 줄이고, 

여러 대의 인스턴스에 사용자의 요청을 효율적으로 분산시키지 않으면,

트래픽이 특정 인스턴스에 몰려 서버가 과부하가 걸리거나 서비스 장애가 발생할 수 있다.

또한, 인스턴스가 늘고 줄어들 때마다 직접 IP나 주소를 관리하기 위해, Auto Scaling과 함께 ELB를 사용한다.</code></pre><hr>
<blockquote>
<h3 id="elb-elastic-load-balancer-란">ELB (Elastic Load Balancer) 란?</h3>
</blockquote>
<ul>
<li><p><code>AWS</code>에서 제공하는 로드 밸런서 </p>
</li>
<li><p>사용자의 요청을 여러 대의 EC2 서버에 분산</p>
</li>
<li><p>Target Group을 통한 트래픽 분산 : 죽은 서버를 확인하고, 살아있는 서버에만 트래픽 전달</p>
</li>
<li><p>Auto Scaling과 연결되어 EC2가 늘어나도 자동으로 연결</p>
</li>
<li><p>하나의 도메인 주소로 여러 서버 관리 가능</p>
</li>
<li><p>SSL 인증서를 붙여서 보안 접속 가능 (HTTPS)</p>
</li>
</ul>
<p><code>👉 보통 사용하는 ELB는 ALB(Application Load Balancer) : 웹 트래픽을 URL, 도메인 기준으로 나눠주는 로드밸런서</code></p>
<hr>
<blockquote>
<h3 id="asg와-elb의-동작-흐름">ASG와 ELB의 동작 흐름</h3>
</blockquote>
<ol>
<li><p>사용자가 도메인 접속 → 요청은 ELB로 진입</p>
</li>
<li><p>Target Group을 참고해서 트래픽을 보낼 대상을 결정</p>
</li>
<li><p>Target Group 내부의 헬스 체크 결과를 보고, 이상 없는 대상에게만 트래픽 분산</p>
</li>
<li><p>Auto Scaling이 트래픽이나 CPU에 따라 EC2를 자동으로 증가/축소</p>
</li>
<li><p>ELB는 새 EC2에 자동 연결, 종료된 인스턴스는 자동 제외</p>
</li>
</ol>
<hr>
<blockquote>
<h3 id="🔗-정리">🔗 정리</h3>
</blockquote>
<p><code>1. Auto Scaling</code></p>
<p><code>서버의 부하</code>에 따라 EC2 인스턴스를 자동으로 <code>늘리거나 줄이는 기능</code></p>
<p>이를 통해 트래픽 변화에 유연하게 대응하고 비용을 절감한다.</p>
<p><code>2. Load Balancer</code></p>
<p>Elastic Load Balancer(ELB)는 여러 서버에 들어오는 <code>트래픽을 분산</code>시켜주는 서비스
사용자 요청을 효율적으로 처리하여 Traffic Jam을 막는다.</p>
<p><code>3. ASG와 ELB의 사용</code></p>
<p>ASG와 ELB를 함께 사용하면, ASG가 인스턴스를 자동으로 조정하고, 
ELB가 트래픽을 이상없는 EC2 인스턴스에 분산시켜 서비스 안정성을 높인다.</p>
<p><code>4. 헬스 체크와 트래픽 분산</code></p>
<p>헬스 체크 기능을 통해 비정상 인스턴스를 신속히 감지하고, 문제가 있는 인스턴스를 ASG를 통해 자동으로 교체하거나 트래픽에서 제외하여 안정적인 서비스를 제공한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ENI와 ElasticIP]]></title>
            <link>https://velog.io/@go_sbchi/ENI%EC%99%80-ElasticIP</link>
            <guid>https://velog.io/@go_sbchi/ENI%EC%99%80-ElasticIP</guid>
            <pubDate>Wed, 18 Jun 2025 11:03:35 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p>컴퓨터에 네트워크 인터페이스 카드(NIC)가 있어 네트워크에 연결되듯, AWS의 EC2 인스턴스에도 가상 네트워크 인터페이스인 ENI가 부착되는데, 이번 포스팅에서는 ENI의 구성 요소와 역할을 정리하고, 그 과정에서 Elastic IP(EIP)가 어떤 역할을 하며 ENI와 어떻게 연결되는지 정리했다.</p>
<hr>
<h2 id="🌐-eni란">🌐 ENI란?</h2>
<ul>
<li><p>물리 서버의 NIC 역할을 하는 EC2의 가상 NIC</p>
<pre><code>  `-&gt; EC2 인스턴스가 VPC 네트워크와 통신하기 위해 사용되는 가상 네트워크 인터페이스`</code></pre></li>
<li><p>하나의 ENI에는 다음이 포함됨:</p>
<pre><code>1. MAC 주소

2. 프라이빗 IP 주소

3. 하나 이상의 보안 그룹

4. 탄력적 IP 주소 (선택)</code></pre></li>
<li><p>하나의 EC2 인스턴스에 여러 개의 ENI 부착 가능</p>
<pre><code>  `하나의 인스턴스가 한 개 이상의 IP 주소를 보유 가능`</code></pre></li>
<li><p>ENI는 다른 인스턴스로 이동 가능</p>
<pre><code>  `1.인스턴스 장애 발생 시 빠른 복구`
  `2.ENI에 고정된 IP, MAC 주소를 그대로 가져가서 새 인스턴스에 붙이면 문제 없이 동작`</code></pre></li>
<li><p>ENI는 인스턴스 종료 시에도 사라지지 않고 <strong>독립적으로 존재 가능</strong></p>
</li>
</ul>
<hr>
<h3 id="eni-연결-순서">ENI 연결 순서</h3>
<table>
<thead>
<tr>
<th>순번</th>
<th>단계</th>
<th>이유</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><strong>VPC 및 서브넷 생성</strong></td>
<td>네트워크의 기본 구조 설정 후 ENI 또는 EC2에 할당</td>
</tr>
<tr>
<td>2</td>
<td><strong>보안 그룹 생성</strong></td>
<td>ENI에 붙을 보안 정책 생성</td>
</tr>
<tr>
<td>3</td>
<td><strong>EC2 인스턴스 생성 (기본 ENI 자동 생성)</strong></td>
<td>대부분 이때 자동으로 ENI도 같이 생성됨</td>
</tr>
<tr>
<td>4</td>
<td><strong>추가 ENI가 필요한 경우에만 ENI 수동 생성</strong></td>
<td>다중 NIC, 장애 조치 등의 특수한 경우, ENI를 따로 만듦</td>
</tr>
<tr>
<td>5</td>
<td><strong>EC2에 ENI 추가 부착 (Attach)</strong></td>
<td>이미 만들어진 EC2에 ENI를 붙이거나 교체할 수도 있음</td>
</tr>
<tr>
<td>6</td>
<td><strong>모니터링 및 테스트</strong></td>
<td>CloudWatch, Ping, curl 등으로 확인</td>
</tr>
</tbody></table>
<hr>
<h2 id="🌐-eip란">🌐 EIP란?</h2>
<blockquote>
<p>Elastic IP는 AWS에서 제공하는 고정 IP 주소로, EC2 인스턴스에 연결할 수 있는 서비스다.</p>
</blockquote>
<p><code>✨ ENI에 할당되어 인스턴스가 재부팅되거나 장애가 발생해도 동일한 IP 주소를 유지할 수 있도록 지원한다.</code></p>
<pre><code>  💡 EC2 인스턴스의 Public IP는 인스턴스를 중지 후 다시 시작할 때마다 퍼블릭 IP가 새로 할당되어 바뀐다. 

       도메인을 Route53같은 서비스로 IP에 부착할때 IP가 유동적이면 연결 시,

       중지가 되면 제대로 도메인에 연결이 안되기 때문에 고정 IP인 EIP를 사용하여 해결할 수 있다.</code></pre><h3 id="eip의-기능">EIP의 기능</h3>
<blockquote>
<ol>
<li>고정 IP 주소</li>
</ol>
</blockquote>
<p><strong>EIP</strong>를 사용하면 인스턴스의 IP 주소가 변경되지 않아, DNS 설정이나 외부 시스템과의 연결이 안정적이다. </p>
<p><code>클라이언트가 특정 IP 주소를 통해 서비스에 접근해야 하는 경우에 유용</code></p>
<blockquote>
<ol start="2">
<li>장애 조치</li>
</ol>
</blockquote>
<p>인스턴스에 문제가 발생했을 때, EIP를 다른 인스턴스에 쉽게 재할당하여 빠른 복구가 가능하다.</p>
<p>EX :</p>
<p><code>주 인스턴스에 장애가 발생하면 EIP를 대체 인스턴스에 할당하여 서비스 중단 없이 운영</code></p>
<hr>
<h3 id="eip의-요금">EIP의 요금</h3>
<table>
<thead>
<tr>
<th>상태</th>
<th>요금</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>EIP가 EC2에 <strong>연결됨</strong> (1개)</td>
<td><strong>무료</strong></td>
<td>EC2에 연결된 첫 번째 EIP는 무료 (단, 인스턴스가 <strong>실행 중</strong>이어야 함)</td>
</tr>
<tr>
<td>EIP가 <strong>연결되어 있지만 인스턴스가 중지됨</strong></td>
<td>시간당 <strong>$0.005</strong></td>
<td>중지 상태인데 IP를 점유 중이기 때문</td>
</tr>
<tr>
<td><strong>연결되지 않은</strong> EIP</td>
<td>시간당 <strong>$0.005</strong></td>
<td>낭비 방지 목적 요금</td>
</tr>
<tr>
<td>EC2 하나에 <strong>2개 이상 EIP 연결</strong></td>
<td>추가당 시간당 <strong>$0.005</strong></td>
<td>1개 이상은 유료</td>
</tr>
</tbody></table>
<hr>
<h3 id="💡-정리">💡 정리</h3>
<p><strong>Elastic IP</strong>는 <strong>ENI</strong>와 함께 사용하여 EC2 인스턴스의 외부 접근성(도메인 연결)을 향상시키고, 장애 조치 및 고가용성을 위한 중요한 역할을 한다. EIP를 활용하면 IP 주소의 변동 없이 안정적인 서비스를 제공하고, 인스턴스 장애 시에도 빠르게 복구할 수 있는 유연성을 제공한다.</p>
<h4 id="eni와-eip">ENI와 EIP</h4>
<table>
<thead>
<tr>
<th>항목</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>ENI</strong></td>
<td>EC2 인스턴스의 가상 NIC으로, 다수의 IP 주소를 지원하고 인스턴스 장애 시 복구를 용이하게 함.</td>
</tr>
<tr>
<td><strong>Elastic IP</strong></td>
<td>고정 IP 주소로, 인스턴스의 IP 주소 변동을 방지하고 외부 시스템과의 안정적인 연결을 지원.</td>
</tr>
<tr>
<td><strong>장애 조치</strong></td>
<td>EIP와 ENI의 조합을 통해 인스턴스 장애 시 빠른 복구와 안정적인 서비스 제공 가능.</td>
</tr>
<tr>
<td><strong>고가용성</strong></td>
<td>EIP를 활용하여 IP 주소의 변동 없이 안정적인 서비스를 제공하며, 서비스 중단 없이 운영 가능.</td>
</tr>
</tbody></table>
<h4 id="eip-요금">EIP 요금</h4>
<table>
<thead>
<tr>
<th>항목</th>
<th>기본 요금</th>
<th>예외 요금 조건</th>
</tr>
</thead>
<tbody><tr>
<td><strong>EIP</strong></td>
<td>1개/EC2 실행 중이면 무료</td>
<td>중지 상태거나 연결 안 됐거나 2개 이상일 때 유료</td>
</tr>
<tr>
<td><strong>ENI</strong></td>
<td>무료</td>
<td>자체 비용 없음 (EIP 붙은 경우는 EIP 비용 발생)</td>
</tr>
</tbody></table>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS 인스턴스 사용하기]]></title>
            <link>https://velog.io/@go_sbchi/AWS-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@go_sbchi/AWS-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Jun 2025 20:15:26 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p>AWS에서 가장 기본적이면서도 핵심적인 서비스 중 하나인 EC2에 대해 정리해봤다.</p>
<p>기본적이고 많이 쓰이는 서비스인 만큼, 내가 제대로 이해하고 있는지 다시 한번 점검하는 의미에서 내용을 정리했다.</p>
<hr>
<h2 id="ec2-란">EC2 란?</h2>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/e924f0ee-427b-457a-9b35-991e4889fe48/image.png" alt=""></p>
<blockquote>
<p>안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹 서비스</p>
</blockquote>
<p><code>개발자가 더 쉽게 웹 규모의 클라우드 컴퓨팅 작업을 할 수 있도록 설계됐다.</code></p>
<pre><code>클라우드는 IT 자원을 인터넷을 통해 빌려 쓰는 개념이고,

클라우드 컴퓨팅은 그중에서도 서버, 저장공간, 네트워크 같은 컴퓨팅 자원을 빌려 쓰는 것.

EC2는 그중 &#39;서버(가상 컴퓨터)&#39;를 빌려 쓸 수 있게 해주는 AWS의 서비스다.</code></pre><hr>
<h3 id="📘-ec2의-장점">📘 EC2의 장점</h3>
<blockquote>
<p>초 단위 온디맨드 가격 모델</p>
</blockquote>
<ul>
<li><p>온디맨드모델에서는 가격이 초 단위로 결정</p>
</li>
<li><p>서비스 요금을 미리 약정하거나 선입금이 필요 없음</p>
</li>
</ul>
<blockquote>
<p>빠른 구축 속도와 확장성</p>
</blockquote>
<ul>
<li>몇분이면 전 세계에 인스턴스 수백여대를 구축 가능</li>
</ul>
<blockquote>
<p>다양한 구성방법 지원</p>
</blockquote>
<ul>
<li><p>머신러닝, 웹서버, 게임서버, 이미지처리 등 다양한 용도에 최적화된 서버 구성 가능</p>
</li>
<li><p>다양한  과금 모델 사용 가능</p>
</li>
</ul>
<blockquote>
<p>여러 AWS 서비스와 연동</p>
</blockquote>
<ul>
<li>오토스케일링, ELB, CloudWatch 등등 다양한 서비스와 연동가능하다.</li>
</ul>
<hr>
<h3 id="ec2-인프라-아키텍처">EC2 인프라 아키텍처</h3>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ba717e81-155d-48bf-bf16-2cf94703d27b/image.png" alt=""></p>
<ul>
<li><p>사용자는 AWS 관리 콘솔, CLI 또는 SDK를 통해 AWS에 액세스 </p>
</li>
<li><p>인스턴스 타입, AMI, 네트워크 설정, 보안 구성 등 모든 필요한 설정을 완료한 후 최종적으로 실행 중인 EC2 인스턴스를 생성한다.</p>
</li>
</ul>
<pre><code>  - AWS 콘솔/CLI: 사용자가 AWS 관리 콘솔 또는 CLI를 통해 EC2 인스턴스 생성을 시작 

  - EC2 인스턴스 설정: 인스턴스 유형, AMI(운영 체제 이미지), 스토리지, 키 페어 등의 옵션 구성

  - 네트워크 및 보안: VPC, 서브넷, 보안 그룹, IAM 역할 등 네트워크와 보안 관련 설정

  - 고급 설정: 사용자 데이터, 테넌시, 메타데이터, 스팟 인스턴스 등 추가적인 구성 옵션을 설정

  - EC2 인스턴스: 구성된 EC2 인스턴스를 실행 중 상태로 배포한다.

  (인스턴스 ID, 퍼블릭/프라이빗 IP 주소 등의 정보를 확인 가능)</code></pre><hr>
<h2 id="인스턴스란">인스턴스란?</h2>
<blockquote>
<p>EC2 서비스를 통해 사용자가 생성하여 실행된 하나의 가상 서버</p>
</blockquote>
<ul>
<li><p>실제 서버처럼 작동</p>
</li>
<li><p>물리적으로는 AWS의 데이터 센터 어딘가에 존재</p>
</li>
<li><p>사용자는 이 인스턴스를 통해 리눅스/윈도우 서버 운영, 웹 애플리케이션 호스팅, 데이터 처리 등 다양한 작업을 수행</p>
</li>
</ul>
<blockquote>
<p><strong>인스턴스 구성 요소</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>구성 요소</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AMI (Amazon Machine Image)</strong></td>
<td>인스턴스에 설치할 운영체제 및 초기 설정</td>
</tr>
<tr>
<td><strong>Instance Type</strong></td>
<td>CPU, 메모리, 네트워크 성능이 정해진 서버 사양 (예: <code>t2.micro</code>, <code>m5.large</code>)</td>
</tr>
<tr>
<td><strong>Storage</strong></td>
<td>인스턴스에 연결되는 디스크 (EBS 등)</td>
</tr>
<tr>
<td><strong>Network 설정</strong></td>
<td>VPC, 서브넷, 보안 그룹 등 네트워크 환경</td>
</tr>
<tr>
<td><strong>Key Pair</strong></td>
<td>인스턴스 접속을 위한 인증 수단 (SSH 키 등)</td>
</tr>
</tbody></table>
<hr>
<h3 id="💡-가용영역az과-인스턴스-위치">💡 가용영역(AZ)과 인스턴스 위치</h3>
<ul>
<li><p>하나의 EC2 인스턴스는 <strong>항상 하나의 가용영역(AZ)</strong> 에 생성한다.</p>
</li>
<li><p>여러 AZ에 인스턴스를 배포하고 싶다면, <strong>여러 인스턴스를 각각 다른 AZ에 생성</strong>해야 하는데, 
고가용성(HA)이나 장애 대비 목적이라면, 오토스케일링 그룹과 함께 여러 AZ를 사용하는 구성이 일반적이다.</p>
</li>
</ul>
<hr>
<h2 id="📌-정리">📌 정리</h2>
<blockquote>
<p><strong>EC2(Elastic Compute Cloud)</strong>  </p>
</blockquote>
<ul>
<li><p>AWS에서 제공하는 <strong>가상 서버</strong>를 생성하고 운영할 수 있는 서비스</p>
</li>
<li><p>클라우드 컴퓨팅 환경에서 서버를 직접 구축하지 않고도 몇 분 만에 전 세계에 수백 대의 서버 인프라를 구성할 수 있다.</p>
</li>
<li><p>온디맨드 과금, 빠른 확장성, 다양한 인스턴스 구성, 다른 AWS 서비스와의 <code>연동</code>이 장점</p>
</li>
</ul>
<blockquote>
<p>인스턴스</p>
</blockquote>
<ul>
<li><p><code>EC2를 통해</code> 생성된 <code>하나의</code> 가상 서버로, 사용자는 이 <strong>인스턴스</strong>를 통해 다양한 애플리케이션을 운영 가능</p>
</li>
<li><p>인스턴스는 AMI, 인스턴스 타입, 스토리지, 네트워크, 키 페어 등의 설정으로 구성된다.</p>
</li>
<li><p><code>하나의</code> 인스턴스는 항상 <code>하나의</code> 가용영역(AZ) 에 생성되며, 여러 AZ에 인스턴스를 배포하려면 각 AZ에 별도로 생성해야 한다</p>
</li>
<li><p>고가용성 확보와 장애 대비를 위해서는 오토스케일링 그룹(ASG)을 활용해 여러 AZ에 인스턴스를 자동으로 분산 배포하는 구성이 일반적이다.</p>
</li>
</ul>
<p>예)
<strong>🏢EC2는 식당</strong><br><strong>🪑인스턴스는 식당 안의 테이블 하나</strong>다.</p>
<p><code>식당이라는 공간 안에 여러 테이블이 있고,  EC2 안에 여러 인스턴스가 생성되어 각자 독립적으로 작동하는 느낌이다..</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS 계정 기초 관리법]]></title>
            <link>https://velog.io/@go_sbchi/account-management</link>
            <guid>https://velog.io/@go_sbchi/account-management</guid>
            <pubDate>Fri, 06 Jun 2025 17:03:26 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p><code>AWS</code> 계정을 만든 직후 기본 보안, 사용자 관리, 비용 설정을 제대로 하지 않으면 <strong>보안 사고</strong>나 <strong>예상치 못한 과금</strong>이 발생할 수 있다.</p>
<p>이 글에서는 <strong>AWS 계정을 만든 직후 해야 할 초기 설정</strong>을 정리했다.</p>
<hr>
<h2 id="1-root-사용자-보안-강화">1. Root 사용자 보안 강화</h2>
<blockquote>
<p>AWS 계정 생성 시 자동으로 만들어지는 최고 권한 사용자이다.</p>
</blockquote>
<p>Root 계정은 모든 AWS 리소스를 삭제하거나 변경할 수 있는 강력한 권한을 갖고 있다.<br><strong>해킹 시 피해가 크기 때문에 바로 보안 설정을 강화해야 한다.</strong></p>
<h3 id="필수-설정">필수 설정</h3>
<ul>
<li>✅ <strong>MFA (Multi-Factor Authentication) 설정</strong></li>
</ul>
<blockquote>
<p>MFA는 Google Authenticator, Authy 등의 앱으로 설정 가능</p>
</blockquote>
<h3 id="실습">실습</h3>
<ol>
<li><p><a href="https://console.aws.amazon.com/">AWS 콘솔</a>에 로그인  </p>
</li>
<li><p>우측 상단에서 <strong>보안 자격 증명(Security credentials)</strong> 클릭  </p>
</li>
<li><p><strong>MFA 활성화 &gt; 가상 MFA 디바이스 설정</strong> 선택  </p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d3a45418-2b09-4908-b6d8-c436071eba18/image.png" alt=""></p>
<hr>
<h2 id="2-iam-사용자-생성-및-권한-분리">2. IAM 사용자 생성 및 권한 분리</h2>
<blockquote>
<p>Root 계정은 비상시에만 사용하고, 실사용은 IAM 사용자로 진행한다.</p>
</blockquote>
<p>IAM은 AWS 리소스를 안전하게 제어하기 위한 사용자 및 권한 관리 시스템이다.  </p>
<p>IAM 사용자를 생성해 역할에 맞는 권한을 나누는 것이 필수다.</p>
<h3 id="📌-예시">📌 예시</h3>
<table>
<thead>
<tr>
<th>사용자 ID</th>
<th>역할 설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>admin-user</code></td>
<td>전체 관리자 권한</td>
</tr>
<tr>
<td><code>dev-user</code></td>
<td>EC2, Lambda 등 개발 권한</td>
</tr>
<tr>
<td><code>design-user</code></td>
<td>S3, CloudFront 권한</td>
</tr>
<tr>
<td><code>billing-user</code></td>
<td>결제 정보만 접근 가능</td>
</tr>
</tbody></table>
<pre><code> 💡 IAM 그룹을 활용하면 여러 사용자에게 
    동일한 권한을 제공하는 것을 한 번에 설정할 수 있다.</code></pre><hr>
<h2 id="3-비용-통제-설정-프리티어--예산-설정">3. 비용 통제 설정 (프리티어 + 예산 설정)</h2>
<p>초기에는 AWS 프리티어로 대부분의 리소스를 무료로 사용할 수 있다.<br>하지만 잘못 설정하면 금방 요금이 발생하므로 <strong>비용 감시 도구 설정은 필수</strong>다.</p>
<h3 id="aws-프리티어란">AWS 프리티어란?</h3>
<ul>
<li><p><strong>12개월 무료</strong>: EC2, RDS, S3 등 일부 서비스는 가입 후 12개월간 무료</p>
</li>
<li><p><strong>항상 무료</strong>: Lambda, SNS 등 일부 서비스는 무제한 무료 사용 가능</p>
</li>
<li><p>⚠️ <strong>초과 시 과금</strong>: 무료 사용량을 초과하면 바로 요금 부과</p>
</li>
</ul>
<h3 id="💡-설정-방법">💡 설정 방법</h3>
<ul>
<li><p><strong>AWS Budgets</strong><br>예산을 초과하면 이메일로 알림을 받을 수 있음<br><code>Billing &gt; Budgets &gt; Create Budget</code>에서 설정 가능</p>
</li>
<li><p><strong>Cost Explorer</strong><br>서비스별 비용을 시각적으로 분석할 수 있는 도구</p>
</li>
</ul>
<ol>
<li><p>콘솔에서 <code>결제 및 비용 관리</code> 검색  </p>
</li>
<li><p>좌측 메뉴 → 예산(Budgets) &gt; 예산 생성 <strong>Create Budget</strong> 클릭  </p>
</li>
<li><p>예산 이름: <code>My Zero-Spend Budget</code>, 금액: <code>$1</code>  </p>
</li>
<li><p>알림 이메일 설정  </p>
</li>
<li><p>저장 후 알림 수신 테스트</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/028b7ff1-d888-4478-86c2-95a73020a826/image.png" alt=""></p>
<p><code>**Cost Explorer**에서 서비스별 요금 시각화가능</code>
<img src="https://velog.velcdn.com/images/go_sbchi/post/414daef6-4ad4-4a07-8703-9448cf90cec2/image.png" alt=""></p>
<hr>
<h2 id="4-리전region-확인-및-설정">4. 리전(Region) 확인 및 설정</h2>
<p>AWS는 <strong>리전(Region)</strong> 단위로 리소스를 관리한다.  </p>
<p>선택한 리전에 따라 가격, 성능, 서비스 종류가 달라지기 때문에 신중히 선택해야 한다.</p>
<p><code>AWS 콘솔 우측 상단에서 리전 변경 가능</code></p>
<ol>
<li><p>AWS 콘솔 오른쪽 상단에서 <code>ap-northeast-2 (Seoul)</code> 선택  </p>
</li>
<li><p>EC2 또는 S3를 생성할 때, 현재 선택된 리전이 반영되는지 확인</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/70b17e27-6eed-4623-8e39-cfdd6c2a5894/image.png" alt=""></p>
<hr>
<h2 id="5-조직이-커지면-aws-organizations">5. 조직이 커지면? AWS Organizations</h2>
<blockquote>
<p>여러 계정을 관리해야 할 경우 <strong>AWS Organizations</strong>를 활용해 중앙에서 통제할 수 있다.</p>
</blockquote>
<h3 id="주요-기능-요약">주요 기능 요약</h3>
<table>
<thead>
<tr>
<th>구성 요소</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>관리 계정</td>
<td>조직 전체를 통제하는 마스터 계정</td>
</tr>
<tr>
<td>OU (조직 단위)</td>
<td>dev, prod, security 등 계정을 논리적으로 그룹화</td>
</tr>
<tr>
<td>SCP</td>
<td>특정 계정 또는 OU에 제약 정책을 적용할 수 있음</td>
</tr>
<tr>
<td>통합 결제</td>
<td>모든 계정의 비용을 하나로 통합하여 청구 가능</td>
</tr>
</tbody></table>
<h3 id="예시-구성">예시 구성</h3>
<table>
<thead>
<tr>
<th>계정 이름</th>
<th>설명</th>
<th>OU 분류</th>
</tr>
</thead>
<tbody><tr>
<td>dev-account</td>
<td>개발 환경 전용 계정</td>
<td>dev</td>
</tr>
<tr>
<td>prod-account</td>
<td>운영 서비스 전용 계정</td>
<td>prod</td>
</tr>
<tr>
<td>security-account</td>
<td>보안 로그, 감사 로그 저장용</td>
<td>security</td>
</tr>
</tbody></table>
<blockquote>
<p>규모가 커질수록 AWS Organizations 구조가 유용해진다.</p>
</blockquote>
<ol>
<li><p>관리 계정으로 로그인  </p>
</li>
<li><p><code>AWS Organizations</code> 검색 &gt; 조직 생성  </p>
</li>
<li><p>OU (예: <code>dev</code>, <code>prod</code>) 생성  </p>
</li>
<li><p>새 계정 추가 또는 기존 계정 초대  </p>
</li>
<li><p>각 OU에 계정을 할당하고 SCP 정책 설정</p>
</li>
</ol>
<hr>
<h1 id="📌-정리">📌 정리</h1>
<blockquote>
<ol>
<li>Root 계정 MFA 설정 – 해킹 방지를 위해 다중 인증(MFA)을 설정해야 한다</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>IAM 사용자 생성 및 권한 분리 – Root 계정은 잠그고, 역할별 사용자로 안전하게 관리</li>
</ol>
</blockquote>
<blockquote>
<ol start="3">
<li>예산 알림 및 비용 모니터링 설정 – 예상치 못한 과금 방지를 위해 예산 알림을 설정</li>
</ol>
</blockquote>
<blockquote>
<ol start="4">
<li>리전(Region) 확인 및 설정 – 리전을 잘못 설정하면 리소스 위치와 과금에 영향이 있음</li>
</ol>
</blockquote>
<blockquote>
<ol start="5">
<li>AWS Organizations 구성 – 여러 계정을 효율적으로 통제하고 관리하기 위한 구조화</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS 기본 구조 이해하기]]></title>
            <link>https://velog.io/@go_sbchi/AWS</link>
            <guid>https://velog.io/@go_sbchi/AWS</guid>
            <pubDate>Fri, 06 Jun 2025 12:49:11 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p> 블로그 포스팅 초기에 다뤘던 클라우드 컴퓨팅의 대표 서비스인 AWS에 대해 다뤄볼 것이다.
 이번 시간에는, AWS의 기본 구조 및 가상화가 무엇인지에 대해 정리해보았다.</p>
<hr>
<h1 id="가상화란">가상화란?</h1>
<blockquote>
<p>하나의 물리적인 컴퓨터 자원을 <strong>여러 개의 독립된 가상 환경(가상 머신)으로 분할</strong>하여 사용할 수 있게 해주는 기술.</p>
</blockquote>
<p>각 <strong>가상 머신</strong>은 자체 운영체제와 애플리케이션을 실행할 수 있으며, 실제 컴퓨터처럼 동작한다.</p>
<p><code>장점 : 자원을 효율적으로 활용하고, 시스템 운영의 유연성과 확장성을 높일 수 있다.</code></p>
<pre><code>☁️ 클라우드 서비스(AWS)는 이 가상화 기술을 바탕으로, 

한 물리 서버에서 여러 사용자가 자원을 나눠 쓰도록 만든다.

가상화를 통해 서버를 효율적으로 운영하고, 필요한 만큼 자원을 빠르게 제공하는 것이 가능해진다.</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/bfc6cf4e-b712-47ff-8ac1-8420f3506ca9/image.png" alt=""></p>
<hr>
<h1 id="aws-구조-이해하기">AWS 구조 이해하기</h1>
<p>AWS는 전 세계 어디에서나 안정적으로 서비스를 제공하기 위해 계층적인 인프라 구조를 가지고 있다.</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/cc57e3ca-eb4d-4361-946d-b8093c29bf87/image.png" alt=""></p>
<p><code>각각의 역할이 뭔지 알아보자</code></p>
<hr>
<blockquote>
<p>🧾 1. AWS 계정 (Account) : AWS 리소스를 생성하고 관리하기 위한 기본 단위</p>
</blockquote>
<p>이 계정을 이용해 사용자는 AWS의 다양한 서비스를 사용할 수 있다. 
예를 들어, <code>과금</code>은 <strong>계정 *<em>기준으로 발생,
IAM 사용자나 역할 같은 <code>권한 설정</code>도 *</em>계정 내부</strong>에서 가능하다.</p>
<blockquote>
<p>🌍 2. 리전 :  <strong>AWS서비스</strong>가 제공되는 서버의 <strong>물리적인 위치</strong></p>
</blockquote>
<p><strong>특징</strong></p>
<p><code>1. 전 세계에 걸쳐 여러 대륙에 분산되어있다.</code></p>
<p><code>2. 리전 간은 서로 독립적이라 장애가 전파되지 않는다.</code></p>
<p><code>3. 각 리전은 여러 개의 가용 영역(Availability Zone)으로 구성한다.</code></p>
<p><code>4. 리전별로 가능한 서비스가 다르다.</code></p>
<p><code>5. 사용자는 원하는 리전을 직접 선택해서 리소스를 배포 가능하다.</code></p>
<blockquote>
<p>⚠️ 리전 선택시 고려할 점</p>
</blockquote>
<ul>
<li><p>지연속도
사용자가 있는 위치에서 가까운 리전을 선택하면 응답 속도가 빨라지고 서비스 체감 품질이 좋아진다.</p>
</li>
<li><p>법률</p>
<p>각 나라별로 데이터 저장과 처리에 관한 법률이 다르기 때문에,
법적 요구사항을 충족하려면 해당 리전에 필요한 AWS 서비스가 제공되는지 반드시 확인해야 한다.</p>
</li>
</ul>
<blockquote>
<p>🏢 3. 가용 영역 (Availability Zone, AZ) : 리전 내에 속한 하위 단위로, 하나의 리전은 보통 3개 이상의 가용 영역으로 구성된다.</p>
</blockquote>
<p><strong>가용영역의 구성</strong></p>
<ul>
<li><p>하나 이상의 독립된 데이터 센터로 이루어져 있다.</p>
</li>
<li><p>가용 영역 간에는 초고속 전용 네트워크로 연결되어 있다.</p>
</li>
<li><p>물리적으로 어느 정도 떨어져 있다. (100km 이내의 거리에 위치)</p>
<p>  여러 재해에 대한 대비 및 보안</p>
</li>
</ul>
<p><strong>이런 구조 덕분에 여러 재해에 대비할 수 있고, 보안성도 강화된다.</strong></p>
<hr>
<h2 id="가용영역의-위치">가용영역의 위치</h2>
<blockquote>
<p>안정성을 높이기 위해, 인프라는 반드시 하나 이상의 가용 영역(AZ)에 분산(provision)해야 한다.</p>
</blockquote>
<blockquote>
<p>각 AWS 계정별로 AZ 코드(예: us-east-1a)가 실제 물리적 위치와 1:1로 일치하지 않는다.</p>
</blockquote>
<p><code>예시그림</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/72f6a085-4d5f-43f9-a5f4-289fe7b38f14/image.png" alt=""></p>
<p>UserA가 사용하는 AZ-A와 UserB가 사용하는 AZ-A는 서로 다른 물리적 데이터 센터일 수 있다.
<code>AWS에서는 AZ 이름이 계정마다 다르게 매핑되기 때문에, 동일한 AZ 이름이라도 서로 다른 실제 위치일 수 있다.</code></p>
<p><code>AWS</code>가 리전 내 AZ 분산을 균형 있게 유지하고, 특정 AZ에 <code>너무 많은 트래픽</code>이 몰리지 않도록 하기 위한 설계다.</p>
<hr>
<h2 id="리전-안에서의-리소스-배치와-vpc-역할">리전 안에서의 리소스 배치와 VPC 역할</h2>
<p><code>AWS 계정</code> 아래에는 여러 <code>리전</code>이 있고, 각 <code>리전</code>은 여러 <code>가용 영역</code>으로 구성된다.
<code>가용 영역</code> 내에서는 <code>VPC</code>라는 논리적 네트워크를 통해 <code>리소스(예: EC2, RDS 등)</code>가 운영된다.</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/255767de-4e03-4a95-a93d-7f0cabba11a9/image.png" alt=""></p>
<hr>
<h2 id="엣지-로케이션-edge-location">엣지 로케이션 (Edge Location)</h2>
<blockquote>
<p><strong>AWS의 CDN등의 여러 서비스들을 가장 빠른 속도로 제공(캐싱)하기 위한 거점</strong></p>
</blockquote>
<pre><code>즉, Global Accelerator와 유저를 연결하는 거점이고, 전세계 여러 장소에 흩어져 있다.</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/24a846f9-6d27-4c6c-b73a-b72a8c5b9244/image.png" alt=""></p>
<p><code>* CDN (Content Delivery Network) : 사용자와 가까운 서버에 웹 콘텐츠를 캐시해, 빠르고 안정적으로 전달하는 서비스</code></p>
<p><code>* AWS Global Accelerator: 전 세계에 분산된 AWS 네트워크 인프라를 활용해,
사용자와 애플리케이션 간의 트래픽을 가장 빠르고 안정적인 경로로 최적화하는 서비스</code></p>
<blockquote>
<p>👉 AWS는 엣지 로케이션, 리전, 가용 영역 등 다양한 인프라 구성 요소를 통해 글로벌하게 서비스를 제공한다.</p>
</blockquote>
<p>하지만 , 어떤 서비스는 전 세계 어디서나 동일하게 제공되고,
어떤 서비스는 특정 리전에서만 사용할 수 있다.
그래서 AWS는 서비스의 제공 범위에 따라 크게 두 가지로 구분한다.</p>
<hr>
<h2 id="aws-서비스--글로벌-서비스와-리전-서비스">AWS 서비스 : 글로벌 서비스와 리전 서비스</h2>
<p> <code>AWS 서비스에는 서비스가 제공되는 지역의 기반에 따라 글로벌 서비스와 리전 서비스로 분류한다.</code></p>
<blockquote>
<p>글로벌 서비스 </p>
</blockquote>
<p> 데이터 및 서비스를 전 세계의 모든 인프라가 공유</p>
<p> ** 예: IAM, Route 53, WAF (웹 방화벽)**</p>
<p><code>WAF :  HTTP 요청을 필터링하는 역할을 한다.</code></p>
<blockquote>
<p> 지역 서비스</p>
</blockquote>
<p> 특정 리전을 기반으로 데이터와 서비스를 제공한다.</p>
<p>대부분의 서비스는 리전 내 여러 가용 영역에서 운영되거나, 하나의 가용 영역에서만 제공된다.</p>
<p><strong>예 : EC2, RDS, S3 등등</strong></p>
<hr>
<h2 id="arn">ARN</h2>
<blockquote>
<p>AWS의 리소스에 부여되는 고유 식별자</p>
</blockquote>
<p> <code>전 세계 AWS에서 특정 리소스를 정확히 식별할 수 있게 해준다</code></p>
<hr>
<h2 id="💡정리">💡정리</h2>
<blockquote>
<p>AWS의 구성</p>
</blockquote>
<ul>
<li><p>AWS는 여러 리전과 리전 안의 3개 이상의 가용영역, 엣지 로케이션으로 구성</p>
</li>
<li><p>리전: AWS서비스가 제공되는 서버의 물리적인 위치</p>
</li>
<li><p>가용영역 : 리전 내에 속한 하위 단위로, 하나의 리전은 보통 3개 이상의 가용 영역으로 구성</p>
</li>
<li><p>엣지 로케이션 : AWS의 여러 서비스를 빠르게 제공하기 위한(캐싱) 거점</p>
</li>
<li><p>AWS 서비스는 글로벌 서비스와 리전서비스로 구분</p>
</li>
<li><p>AWS의 모든 리소스는 ARN(AWS의 리소스에 부여되는 고유 식별자)이 부여</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[인증과 인가- AWS 보안 기초 IAM]]></title>
            <link>https://velog.io/@go_sbchi/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80-AWS-%EB%B3%B4%EC%95%88-%EA%B8%B0%EC%B4%88-IAM</link>
            <guid>https://velog.io/@go_sbchi/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80-AWS-%EB%B3%B4%EC%95%88-%EA%B8%B0%EC%B4%88-IAM</guid>
            <pubDate>Wed, 04 Jun 2025 11:00:12 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p>AWS를 본격적으로 다루기 전에, 클라우드 환경에서 <strong>보안 관리의 중요성</strong>을 먼저 짚고 넘어가야 한다. 이 글에서는 인증(Authentication)과 인가(Authorization)의 개념, 그리고 IAM이 클라우드 보안에서 어떤 역할을 하는지 정리했다.</p>
<hr>
<h3 id="📚-관련-문서">📚 관련 문서</h3>
<ul>
<li><p><a href="https://www.okta.com/identity-101/what-is-ldap/">What is LDAP? (Lightweight Directory Access Protocol)</a></p>
</li>
<li><p><a href="https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/access_policies_managed-vs-inline.html">관리형 정책과 인라인 정책 - AWS 공식 문서</a></p>
</li>
</ul>
<hr>
<h2 id="인증과-인가란">인증과 인가란?</h2>
<p>클라우드 보안을 이야기할 때 빠질 수 없는 두 가지 개념이 있다: <strong>인증(Authentication)</strong> 과 <strong>인가(Authorization)</strong> 이다.</p>
<ul>
<li><strong>인증</strong>: 시스템에 접근하려는 사용자가 누구인지 확인하는 절차이다. 보통 ID/PW, OTP, 인증서 등을 통해 사용자의 신원을 검증한다.</li>
<li><strong>인가</strong>: 인증이 완료된 사용자에게 어떤 리소스에 어떤 작업을 허용할지를 결정하는 절차이다. 역할(role), 정책(policy), 권한(permission)을 기반으로 설정된다.</li>
</ul>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>인증</td>
<td>사용자가 누구인지 확인하는 절차이다</td>
<td>로그인 시 ID/PW 확인, MFA</td>
</tr>
<tr>
<td>인가</td>
<td>인증된 사용자의 권한을 결정하는 절차이다</td>
<td>S3 버킷 접근 권한 여부</td>
</tr>
</tbody></table>
<p>💡 <strong>AWS에서는 다음과 같이 구분된다:</strong></p>
<ul>
<li><p>인증: IAM 사용자가 AWS Management Console에 로그인할 때 ID와 비밀번호 또는 MFA를 입력하는 행위</p>
</li>
<li><p>인가: 로그인 후, 사용자가 EC2 인스턴스를 시작할 수 있는지, S3 버킷을 열람할 수 있는지를 IAM 정책(Policy)을 통해 판단한다.</p>
</li>
</ul>
<hr>
<h2 id="iam이란">IAM이란?</h2>
<ul>
<li><p>IAM(Identity and Access Management)은 AWS에서 인증과 권한을 부여하기 위한 핵심 서비스</p>
</li>
<li><p>사용자, 그룹, 역할, 정책을 기반으로 AWS 리소스에 대한 접근 제어를 수행한다.</p>
</li>
</ul>
<h3 id="🔑-주요-개념">🔑 주요 개념</h3>
<ul>
<li><p><strong>Root 계정</strong>: AWS 서비스에 대한 전체 권한을 가진 내장된 계정이다. </p>
<ul>
<li>Root 계정은 사용을 최소화하고, IAM 계정을 만들어 필요한 권한만 부여해 사용하는 것이 보안상 바람직하다.</li>
</ul>
</li>
<li><p><strong>보안 주체(Security Principal)</strong>: AWS 리소스에 대한 작업을 요청하는 주체로, IAM 사용자, AWS 서비스, 페더레이션 사용자 등을 포함한다.</p>
</li>
</ul>
<h3 id="ldap-ad-idp와의-관계">LDAP, AD, IdP와의 관계</h3>
<ul>
<li><strong>LDAP</strong>: 디렉터리 정보를 검색 및 관리하기 위한 프로토콜이다.</li>
<li><strong>Active Directory (AD)</strong>: Microsoft가 개발한 디렉터리 서비스로 LDAP 기반으로 작동한다.</li>
<li><strong>IdP (Identity Provider)</strong>: 사용자 인증 및 권한 부여를 제공하는 시스템이다. LDAP을 이용해 사용자 정보를 저장하고 검색할 수 있다.</li>
</ul>
<p>이들은 서로 포함 관계가 아니라, 인증 구조를 구성하는 서로 다른 역할의 기술들이다.</p>
<hr>
<h2 id="iam의-구성-요소">IAM의 구성 요소</h2>
<h3 id="👤-iam-사용자">👤 IAM 사용자</h3>
<ul>
<li>AWS 계정 내 개별 사용자이다.</li>
<li>기본적으로 아무런 권한도 없으며, 정책을 통해 명시적으로 권한을 부여해야 한다.</li>
</ul>
<h3 id="👥-iam-사용자-그룹">👥 IAM 사용자 그룹</h3>
<ul>
<li>여러 사용자를 하나의 그룹으로 묶고, 그룹 단위로 권한을 부여할 수 있다.</li>
<li>하나의 사용자는 여러 그룹에 속할 수 있으며, 그룹별 권한을 모두 적용받는다.</li>
</ul>
<h3 id="🎭-iam-역할role">🎭 IAM 역할(Role)</h3>
<ul>
<li><p>일시적인 권한을 부여하는 메커니즘이다.</p>
</li>
<li><p>사용자는 직접 권한을 갖는 대신, 필요할 때 역할을 수임(AssumeRole) 하여 해당 역할의 권한으로 작업을 수행할 수 있다.</p>
</li>
<li><p>역할 수임은 IAM 사용자뿐 아니라 EC2, Lambda 같은 AWS 서비스도 가능하며, 이때 <strong>STS(Security Token Service)</strong>가 임시 자격 증명을 발급한다.</p>
</li>
</ul>
<br>

<blockquote>
<p>🌀 역할 수임(AssumeRole) 흐름 예시</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/08bba2ca-a7ff-41c7-83f0-2ff8e467f241/image.png" alt=""></p>
<ol>
<li><p>EC2 인스턴스 또는 IAM 사용자가 역할을 요청</p>
</li>
<li><p>AWS STS가 임시 자격 증명을 발급</p>
</li>
<li><p>해당 자격으로 S3 버킷 등 리소스에 접근</p>
</li>
</ol>
<hr>
<h2 id="iam-정책">IAM 정책</h2>
<p>IAM 정책은 어떤 작업을 어떤 리소스에 대해 허용할지를 정의하는 JSON 형식의 문서이다. IAM 정책은 여러 범주로 나뉜다:</p>
<blockquote>
<h3 id="자격-증명-기반-정책-identity-based-policies">자격 증명 기반 정책 (Identity-based Policies)</h3>
</blockquote>
<ul>
<li><strong>역할 기반 접근 제어(RBAC)</strong> 구조를 따른다.</li>
<li><strong>관리형 정책</strong>: 여러 사용자나 그룹에서 재사용할 수 있도록 AWS 또는 사용자가 생성한 정책이다.</li>
<li><strong>인라인 정책</strong>: 특정 사용자 또는 역할에 직접 연결되는 1:1 정책이다.</li>
</ul>
<blockquote>
<h3 id="리소스-기반-정책">리소스 기반 정책</h3>
</blockquote>
<ul>
<li>S3 버킷, SQS 큐 등 리소스에 직접 연결되어 해당 리소스에 대한 접근 권한을 정의한다.</li>
</ul>
<blockquote>
<h3 id="서비스-제어-정책-scp">서비스 제어 정책 (SCP)</h3>
</blockquote>
<ul>
<li>AWS Organizations에서 조직 단위(OU) 또는 계정 단위로 적용되는 정책이다.</li>
<li>조직의 최대 권한을 제한하여 보안 수준을 제어한다.</li>
</ul>
<blockquote>
<h3 id="권한-경계-permissions-boundary">권한 경계 (Permissions Boundary)</h3>
</blockquote>
<ul>
<li>IAM 사용자 또는 역할이 가질 수 있는 최대 권한을 제한한다.</li>
<li>개발자에게 자율성을 부여하되, 허용된 범위를 초과하지 않도록 하는 데 유용하다.</li>
</ul>
<blockquote>
<p>🔁 <strong>SCP vs 권한 경계</strong></p>
<ul>
<li>SCP는 조직 전체 또는 계정 단위로 적용된다.</li>
<li>권한 경계는 개별 IAM 사용자나 역할에 적용된다.</li>
</ul>
</blockquote>
<hr>
<h2 id="🔐-심층-방어-전략-defense-in-depth">🔐 심층 방어 전략 (Defense in Depth)</h2>
<p>보안을 하나의 계층이 아닌, 여러 겹으로 구성하는 전략이다. 하나의 계층이 뚫려도 전체가 뚫리지 않도록 방어한다.</p>
<ul>
<li><strong>KMS (Key Management Service)</strong>: 키 페어를 기반으로 데이터 암호화 및 복호화를 수행한다.</li>
<li><strong>IAM 역할 변경 주의</strong>: EC2 인스턴스 등에서 IAM 역할을 실시간으로 삭제/변경하면 곧바로 반영되어 시스템에 영향을 줄 수 있으므로 주의해야 한다.</li>
</ul>
<hr>
<h2 id="정리">정리</h2>
<ul>
<li>인증은 &quot;이 사용자가 누구인지&quot;를 확인하는 절차이다.</li>
<li>인가는 &quot;무엇을 할 수 있는가&quot;를 결정하는 절차이다.</li>
<li>IAM은 AWS의 핵심 보안 서비스로, 사용자/역할/그룹/정책을 통해 인증과 인가를 관리한다.</li>
<li>IAM 정책은 자격 증명 기반, 리소스 기반, 서비스 제어 정책, 권한 경계로 나뉘며 각각의 보안 목적에 따라 활용된다.</li>
<li>IAM은 클라우드 보안을 구성하는 핵심 축이며, KMS, STS와 함께 사용할 때 더욱 강력한 보안 체계를 제공한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[캐싱]]></title>
            <link>https://velog.io/@go_sbchi/%EC%BA%90%EC%8B%B1-%EC%95%94%ED%98%B8%ED%99%94-SSLTLS-RDBMS-vs-NoSQL</link>
            <guid>https://velog.io/@go_sbchi/%EC%BA%90%EC%8B%B1-%EC%95%94%ED%98%B8%ED%99%94-SSLTLS-RDBMS-vs-NoSQL</guid>
            <pubDate>Sat, 31 May 2025 09:13:04 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>웹사이트나 애플리케이션을 빠르게 작동시키려면 데이터를 빠르게 불러오는 게 중요하다. 

이때 캐싱이라는 기술이 큰 역할을 한다.

캐싱은 자주 사용하는 데이터를 임시로 저장해두어, 필요할 때 빠르게 꺼내 쓰도록 도와준다.

이번 글에서는 캐싱이 무엇인지, 왜 필요한지에 대해 정리했다.</code></pre><hr>
<h1 id="캐싱"><strong>캐싱</strong></h1>
<blockquote>
<p>데이터의 복제본 혹은 연산 결과를 임시로 저장해서, 자주 사용되는 복잡한 연산, 자주 찾는 데이터의 결과를 효율적으로 전달하는 것을 목적으로 두는 기술</p>
</blockquote>
<p><strong>장점</strong></p>
<ol>
<li><p>요청에 따라 빠르게 데이터 전달</p>
</li>
<li><p>복잡한 연산 리소스 / 부하를 줄임</p>
</li>
</ol>
<p>*<em>단점 *</em></p>
<ol>
<li><p>일관성 유지 어려움</p>
</li>
<li><p>아키텍처의 복잡도 증가 (일관성 유지 위함)</p>
</li>
<li><p>비용 증가</p>
</li>
</ol>
<hr>
<p><strong>캐싱을 사용하지 않는 방식</strong></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/a030f30c-41ce-4c43-9e28-976e533f7ce1/image.png" alt=""></p>
<blockquote>
<p>조회 서버에서 데이버베이스에 대한 작업을 한 후 클라이언트에 정보를 넘기는 시스템</p>
</blockquote>
<pre><code>📊 매 조회마다 데이터 수집, 데이터 가공, 데이터 통계, 데이터 리턴이라는 순서를 가지고 조회를 해야함</code></pre><hr>
<p>**
캐시 서버 이용**</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/c3a8a2e8-0933-47d6-826d-b48f47a5c87e/image.png" alt=""></p>
<blockquote>
<p>조회서버에서 한번 조회한 데이터베이스의 기록을 가공 후 저장해놓은 다음, 클라이언트에서 요청이 일어날때 캐시서버에 저장후 다른 곳에서 요청이 일어나면 캐시서버의 내용을 바로 가져다 씀</p>
</blockquote>
<p><code>💡 장점 : 연산의 부하, 요청의 부하, 네트워크 트래픽 해결</code></p>
<hr>
<h1 id="캐싱-주요-개념">캐싱 주요 개념</h1>
<blockquote>
<p>*<em>원본 *</em></p>
</blockquote>
<pre><code>- 캐싱할 데이터 혹은 연산 결과를 제공하는 주체</code></pre><blockquote>
<p><strong>Cache Hit</strong> </p>
</blockquote>
<pre><code>- 요청에 따라 캐시에 저장된 데이터로 응답할 수 있는 상황

- 캐싱에서 지향할 상황이며 원본에 요청 없이 응답 가능</code></pre><blockquote>
<p><strong>Cache Miss</strong> </p>
</blockquote>
<pre><code>- 요청에 따른 데이터를 캐시에서 찾을 수 없는 상황

- 별도로 원본에 요청 혹은 다른 방식으로 응답 필요 </code></pre><blockquote>
<p><strong>캐시 만료</strong> </p>
</blockquote>
<pre><code>- 캐시를 삭제하는 행위

- TTL : 캐시가 얼마만큼 살아있는지를 나타내는 시간 단위 ( TTL 10초 : 10초 동안 캐시가 살아잇음)</code></pre><hr>
<h1 id="캐싱-방식">캐싱 방식</h1>
<h2 id="개념"><strong>개념</strong></h2>
<blockquote>
<p>캐시에 원본 데이터를 채우는 다양한 정책</p>
</blockquote>
<hr>
<pre><code>1. Lazy Loading</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/440bc718-2291-4e56-a94f-507d088190ff/image.png" alt=""></p>
<blockquote>
<p>작동 방식</p>
</blockquote>
<p> <code>첫요청이 있으면 조회 서버에서 통계를 만들고, 캐시 서버에 가공 후 저장한다.</code>
 <code>그 이후 캐시서버에서 가져와서 사용한다.</code></p>
<p> <code>💾 단점 : 첫번째 요청에서 엄청난 시간이 걸림</code></p>
<hr>
<pre><code>2. Eager Loading</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/e2b79c0d-ebb6-44bf-a023-4aea84b0eebe/image.png" alt=""></p>
<blockquote>
<p>작동 방식</p>
</blockquote>
<pre><code> 조회 요청이 없어도 미리 데이터를 조회하고,

 캐시서버에 저장 후 클라이언트 조회 요청에 캐시 서버 조회     </code></pre><p><code>💾 단점 : 요청이 다양한 기간, 분야 등등 다방면에서 오면 효율적일 수 있으나,</code></p>
<p><code>특정 기간에 있는 특정 데이터를 가져오는 작업을 할 때에는 효율적이지 않을 수 있다.</code></p>
<hr>
<pre><code>3. Write Through</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/a226392e-1cbd-4761-8f8c-02c6ba244dc7/image.png" alt=""></p>
<blockquote>
<p>작동 방식</p>
</blockquote>
<pre><code>클라이언트에서 이미지 업데이트나 자료 업데이트할 때,

캐시서버와 저장 서버 동시에 자료를 저장할 때 사용</code></pre><p><code>💾 단점: 데이터의 일관성이 항상 보장되지만 쓰기 과정이 복잡해지고 느려질 수 있음</code></p>
<hr>
<p>조회를 하기 위한 아키텍처(Write Back)</p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7cb4d54e-30e9-446c-9d5f-a50eff54b396/image.png" alt=""></p>
<blockquote>
<p>작동방식</p>
</blockquote>
<pre><code>데이터를 캐시에 먼저 쓰고 후에 원본에 업데이트</code></pre><p><code>💾 단점: 쓰기가 빠르고 간단하지만 원본에 업데이트 전에 유실될 가능성이 있다.</code></p>
<hr>
<p>💡 <strong>결론</strong></p>
<ol>
<li><p>Lazy Loading : 요청이 있을 때만 캐시에 원본데이터를 채움</p>
<ul>
<li>불필요한 요청이 줄어들지만 최초 데이터 로딩 필요</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p>Eager Loading : 미리 캐시에 데이터를 채워두고 요청을 기다리는 정책</p>
<ul>
<li>데이터가 항상 준비되어 있지만, 모든 데이터를 채우려면 불필요한 캐시 용량이 낭비되고 처음에 모든 데이터를 채울 때, 매우 큰 리소스가 필요</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p>Write Through : 데이터가 변경되거나 저장되는 시점에 원본과 캐시에 동시에 저장</p>
<ul>
<li>데이터의 일관성이 항상 보장되지만 쓰기 과정이 복잡해지고 느려질 수 있음</li>
</ul>
</li>
<li><p>Write Back : 데이터를 캐시에 먼저 쓰고 후에 원본에 업데이트</p>
<ul>
<li>쓰기가 빠르고 간단하지만 원본에 업데이트 전에 유실될 가능성이 있음</li>
</ul>
</li>
</ol>
<hr>
<h1 id="캐시-만료-방식">캐시 만료 방식</h1>
<blockquote>
<ol>
<li>TTL : 일정 시간이 지나면 만료</li>
</ol>
</blockquote>
<ul>
<li>항상 일정 시간 후 데이터가 만료되고 갱신할 수 있으나 모든 데이터를 항상 갱신 필요</li>
</ul>
<blockquote>
<ol start="2">
<li>Least Recently Used : 가장 사용시점이 먼 캐싱 데이터부터 만료</li>
</ol>
</blockquote>
<ul>
<li>사용이 발생한 데이터들을 계속 보관할 수 있으나 상황에 따라 비효율적일 수 있다.</li>
</ul>
<blockquote>
<ol start="3">
<li>Least Frequently Used : 가장 덜 사용된 데이터부터 만료</li>
</ol>
</blockquote>
<ul>
<li>자주 사용된 데이터를 남겨둘 수 있으나 현재 시점에 자주 사용되지 않는 데이터도 같이 남겨둘 수 있다.</li>
</ul>
<blockquote>
<ol start="4">
<li>First in First Out : 먼저 들어온 데이터부터 만료</li>
</ol>
</blockquote>
<ul>
<li>간단하지만 패턴을 고려하지 않아 비효율적이다.</li>
</ul>
<hr>
<p>*<em>캐싱 사용 사례 *</em></p>
<p><code>💻 CDN, ElastiCache,웹 브라우저,RAM,DNS 등 연산이나 기록에 대한 저장을 몇일 동안 캐시에 저장해놓는다. (거의 대부분의 경우 TTL의 방식을 사용)</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[암호화]]></title>
            <link>https://velog.io/@go_sbchi/ds</link>
            <guid>https://velog.io/@go_sbchi/ds</guid>
            <pubDate>Mon, 12 May 2025 23:08:06 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>인터넷에서 데이터를 주고받을 때는 정보가 노출되거나 변조될 위험이 있다. 

그걸 방지하기 위해 암호화 기술이 필수적이며, 웹 보안에선 SSL/TLS 프로토콜이 주로 사용된다.

AWS에서도 이런 보안 기능을 지원해 안전한 통신 환경을 제공하는데,

이번 글에서는 AWS에 들어가기 전, 암호화와 SSL/TLS의 기본 개념을 정리했다.</code></pre><hr>
<h1 id="암호화-및-ssltls">암호화 및 SSL/TLS</h1>
<p><strong>암호화</strong></p>
<blockquote>
<p>수학적인 과정으로 어떤 정보를 읽을 수 없는 데이터로 변환하는 행위</p>
</blockquote>
<hr>
<p><strong>용어</strong></p>
<blockquote>
<ol>
<li>평문 </li>
</ol>
</blockquote>
<pre><code>암호화 하기 전의 데이터</code></pre><blockquote>
<ol start="2">
<li>암호문  </li>
</ol>
</blockquote>
<pre><code>평문을 암호 키와 알고리즘을 사용해 암호화 한 데이터</code></pre><blockquote>
<ol start="3">
<li>암호화  </li>
</ol>
</blockquote>
<pre><code>평문에 암호화 알고리즘, 키를 적용하여 소유한 주체가 아니면 알아볼 수 없는 암호문으로 만드는 과정</code></pre><blockquote>
<ol start="4">
<li>복호화  </li>
</ol>
</blockquote>
<pre><code>암호문에 키와 복호화 알고리즘을 적용하여 평문으로 되돌리는 과정</code></pre><blockquote>
<ol start="5">
<li>키  </li>
</ol>
</blockquote>
<pre><code>평문을 암호화하거나 암호문을 평문으로 돌리기 위한 비밀번호(값)</code></pre><blockquote>
<ol start="6">
<li>암호 알고리즘  </li>
</ol>
</blockquote>
<pre><code>암호화/복호화를 위한 알고리즘 (AES/DES)</code></pre><hr>
<p>💡<code>AES/DES?</code></p>
<p>🔐 <strong>DES</strong> (Data Encryption Standard)
<code>1. 옛날 방식의 암호화 기술 (1970년)</code></p>
<p><code>2. 64비트 블록 단위로 데이터를 암호화</code></p>
<p><code>3. Key가 지금 기준으로는 너무 짧아서 쉽게 뚫림</code></p>
<p><code>4. 과거에 많이 썼지만, 보안이 약해서 지금은 거의 안 씀</code></p>
<p>🔐 <strong>AES</strong> (Advanced Encryption Standard)</p>
<p> <code>1. DES를 대체한 현대적인 암호화 방식</code></p>
<p> <code>2. AES에 비해 길고 훨씬 안전함</code></p>
<p><code>3. 128비트 블록으로 데이터 처리</code></p>
<p><code>4. 속도도 빠르고, 스마트폰, 인터넷, 군사 통신 등에서 표준으로 널리 사용</code></p>
<hr>
<blockquote>
<p>저장된 데이터의 보호</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1fae8a75-51ab-4840-a34c-3feb8972c949/image.png" alt=""></p>
<p><code>유저가 어플리케이션에 파일을 업로드하면 디스크에 암호화 상태로 저장하고, 복호화시 키가 필요한 기술</code></p>
<blockquote>
<p>💡디스크를 도난당햇을 때 암호화가 되있기 때문에 쉽게 데이터를 열어볼 수 없다.</p>
</blockquote>
<p><code>1. 하나의 물리적인 기기에 보안을 적용하기 위해 사용</code>
<code>2. 키파일 혹은 암호를 사용하여 암호화/복호화</code></p>
<hr>
<blockquote>
<p>전송 중 데이터 보호</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/2448b8b0-6a2c-44db-be0a-6daa57aec68b/image.png" alt=""></p>
<p><code>데이터의 전송 중 암호화를 적용하여 데이터가 탈취 되지 않도록 보호</code></p>
<blockquote>
<p>💡주로 여러 시스템/기기 간에 보안을 적용하기 위해 사용</p>
</blockquote>
<p><code>SSL/TLS,HTTPS 등</code></p>
<hr>
<h1 id="대칭키-암호화">대칭키 암호화</h1>
<blockquote>
<p>하나의 키를 암호화, 복호화 하는 알고리즘</p>
</blockquote>
<ul>
<li>연산이 빠름</li>
<li>키를 전달하는 방법에 대한 고민이 필요함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/a3c7665b-eccc-4a4b-be7e-16ea57a7d9fc/image.png" alt=""></p>
<p><code>가정</code></p>
<p><strong>Bob : 전송자</strong></p>
<p><strong>Alice : 수신자</strong></p>
<p><strong>Chuck : 도청자</strong></p>
<p><code>Bob과 Alice가 정보를 주고받을 때, Chuck이 중간에 데이터를 빼내면 키만 가지고 있으면 데이터를 복호화 할 수 있는 문제가 있다.</code></p>
<hr>
<h1 id="비대칭키-암호화">비대칭키 암호화</h1>
<blockquote>
<p><strong>한 쌍</strong>의 키를 활용한 암호화</p>
</blockquote>
<ul>
<li>하나의 키는 암호화만 가능하고, 다른 하나는 복호화만 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/10d6c4a2-0d35-4c45-9e6e-3e7af4b2d52b/image.png" alt=""></p>
<p><code>가정</code></p>
<p><strong>Bob : 전송자</strong></p>
<p><strong>Alice : 수신자</strong></p>
<p><strong>Chuck : 도청자</strong></p>
<p><code>Bob이 공개키를 통해 자신의 비밀키를 Alice에게 전달하고 Alice는 자신의 키를 통해 복호화를 진행한다.</code>
<code>이 과정에서 Chuck이 공개키를 가지고 있더라도 복호화를 할 수 있는 비밀키가 없기 때문에 복호화를 할 수 없다.</code></p>
<blockquote>
<p>단점</p>
</blockquote>
<p><code>매우 느리다. 그래서 키를 교환하거나 특별한 정보를 교환할 때말고는 대칭키를 사용한다.</code></p>
<hr>
<h1 id="암호화-서명">암호화 서명</h1>
<blockquote>
<p>키를 사용해서 데이터의 생성자가 데이터를 생성했음을 보장하는 방법</p>
</blockquote>
<p><code>Private 키를 사용하여 Public 키로 검증 가능한 데이터의 서명을 생성</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/59816ea9-d1a9-422d-883b-49fa6b0a32a4/image.png" alt=""></p>
<ul>
<li>Alice가 비밀키를 통해 데이터를 암호화 하고, 복호화 할 수 있는 공개키를 가진 사람(Bob)은 검증을 통해 데이터가 원본인지 아닌지 확인할 수 있다.</li>
</ul>
<hr>
<blockquote>
<p>AWS 활용</p>
</blockquote>
<p><code>Presigned URL</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d9bb5b2d-8c47-4e45-9062-852891a2a697/image.png" alt=""></p>
<ul>
<li>어플리케이션이 가지고 있는 키로 서명(Presigned URL)을 하면 이것을 토대로 S3나 AWS application에 파일을 달라고 검증을 할 수 있다.</li>
</ul>
<hr>
<h1 id="ssltls">SSL/TLS</h1>
<blockquote>
<p>클라이언트와 서버간에 데이터의 무결성과 기밀성을 보장하는 프로토콜</p>
</blockquote>
<p><code>상호간의 통신 암호화 후 전달되며 중간에서 탈취당해도 안전함</code></p>
<p><code>HTTPS등 다양한 프로토콜에 활용</code></p>
<ul>
<li>HTTPS : HTTP + SSL</li>
</ul>
<h1 id="ssltls-3단계-과정">SSL/TLS 3단계 과정</h1>
<blockquote>
<ol>
<li>Cipher Suites 교환</li>
</ol>
</blockquote>
<p><code>* Cipher Suites : TLS에서 활용하는 보안 알고리즘</code></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/c63b187f-2e53-4928-bc76-1eb7655faedf/image.png" alt=""></p>
<p>*<em>클라이언트와 서버가 만나면 정보를 교환함 
*</em>
<code>클라이언트 -&gt; 서버</code></p>
<ol>
<li><p>SSL/TLS 버전</p>
</li>
<li><p>지원하는 Cipher Suites 목록</p>
</li>
<li><p>기타정보</p>
</li>
</ol>
<p><code>서버 -&gt; 클라이언트</code></p>
<ol>
<li><p>SSL/TLS 버전</p>
</li>
<li><p>지원하는 Cipher Suites 목록</p>
</li>
<li><p>기타정보</p>
</li>
<li><p><strong>인증서</strong></p>
</li>
</ol>
<p>*인증서 : 믿을 수 있는 인증 기관(CA)에서 배포하는 서버 신원에 대한 검증 확인</p>
<blockquote>
<p>💡 클라이언트가 서버에 접속할 때 신뢰할 수 있는 서버인지 판단해야 한다. 어떤식으로 인증이 진행되고 있을까?</p>
</blockquote>
<hr>
<blockquote>
<ol start="2">
<li>인증</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/252370fc-809e-4a3e-bf02-477276666b43/image.png" alt=""></p>
<p><code>인증 과정</code></p>
<ol>
<li><p>공신력있는 기관 CA에서 클라이언트와 서버에 CA공개키를 제공</p>
</li>
<li><p>서버에서 공개 키와 비밀키를 만든다.</p>
</li>
<li><p>서버는 서버에 대한 정보와 서버의 공개키를 묶어서 CA에 인증서를 만들어 달라 요청</p>
</li>
<li><p>CA에서는 정보에 대한 검증을 끝내고 CA비밀키를 통해 그 정보를 암호화해서 인증서를 발급해줌</p>
</li>
<li><p>서버는 정보를 요청한 클라이언트에 받은 인증서를 건네줌</p>
</li>
<li><p>클라이언트는 암호화 된 정보를 CA 공개키를 사용하여 복호화함</p>
</li>
</ol>
<blockquote>
<ol start="3">
<li>키교환</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/55ad0cfc-a2ef-458e-b679-1c1498d56ab2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/a85d01b3-451f-4a45-b83b-e48130534f6d/image.png" alt=""></p>
<p><code>클라이언트는 서버의 공개키를 사용하여 서버와 통신하고 CA비밀키를 사용해서 RSA를 만들고 서버에서는 공개키와 대응하는 비밀키를 통해 키를 만들고 만들어진 키를 기반으로 통신</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DNS 기초 정리]]></title>
            <link>https://velog.io/@go_sbchi/dsa</link>
            <guid>https://velog.io/@go_sbchi/dsa</guid>
            <pubDate>Tue, 29 Apr 2025 11:07:23 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code> 웹사이트에 접속할 때 도메인 주소를 입력하면, 실제 서버의 IP 주소로 연결되는데, 

 도메인과 IP를 연결해주는 역할을 하는 것이 DNS다.

 AWS에서는 이런 DNS 기능을 제공하는 서비스도 운영하고 있고,

 이번 글에서는 AWS에 대해 제대로 공부하기 전, DNS의 기본 개념들과 구조를 간단히 정리해보자</code></pre><hr>
<h1 id="dns-">DNS ?</h1>
<blockquote>
<p>사람이 읽을 수 있는 도메인 이름을 머신이 읽을 수 있는 IP주소로 변환하는 시스템</p>
</blockquote>
<h1 id="dns-주요-개념">DNS 주요 개념</h1>
<pre><code>    - 도메인 : 대상의 IP 주소등의 정보와 맵핑되는, 사람이 알아볼 수 있는 문자열

        - 서브도메인 : 도메인 중 스트링 앞에 추가 문자열이 붙은 도메인 ex) a.example.com -&gt; (a)

        - APEX도메인(Zone Apex, Root Domain...) : 도메인 중 앞에 추가 문자열이 없는 순수한 최상위 도메인 
        ex) example.com -&gt; (example)

        - 레코드  (DNS Record) : 도메인이 어떤 방식으로 데이터와 매칭되는지 정의하는 기록  ( 주소록의 역할 )

            1. A 레코드
            설명: 도메인 이름을 IPv4 주소에 매핑
            ex)
            example.com → 192.0.2.1

            2. AAAA 레코드
            설명: 도메인 이름을 IPv6 주소에 매핑
            ex)
            example.com → 2001:0db8:85a3:0000:0000:8a2e:0370:7334

            3. CNAME 레코드
            설명: 도메인 이름을 다른 도메인 이름에 매핑
            ex)
            www.example.com → example.com

            4. MX 레코드
            설명: 이메일 서버를 정의
            ex)
             example.com → mail.example.com

        - Domain Zone : 도메인 정보를 담은 레코드 모음

        - Zone File : Domain Zone 정보를 저장한 텍스트 파일

        - DNS Query : 주어진 도메인에 해당하는 정보를 요청하는 쿼리
        ex) example.com이 어떤 IP주소를 가지고 있니? 요청하는 행동

          Name Server : DNS Query를 Zone File을 기반으로 응답할 수 있는 서버
          Authoritative Server : DNS 정보의 원본을 가지고 있는 가장 최상위 NS 서버
          None-Authoritative Server : Authoritative NS Server를 조회하여 
                                      정보를 보관하고 있거나 응답하는 서버

          DNS Resolver : 사용자와 NS 서버 사이에 위치한 서버로 
                           실제 유저의 요청에 따라 IP주소등의 정보를 확보하는 서버                                      </code></pre><h1 id="dns의-구성">DNS의 구성</h1>
<blockquote>
<p>DNS는 계층 구조?</p>
</blockquote>
<pre><code>    - 최상위 도메인부터 차례대로 계층구조로 구성되어 있음

    - 실제 레코드는 가장 마지막 계층에서 관리(보관 및 처리)</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/f6ad0693-1fb9-42b0-bb4c-a54b68bb9b57/image.png" alt=""></p>
<p><code>도메인은 . 단위로 상위 레벨로 올라간다는 의미</code></p>
<p>즉 계층구조로 상위 계층에 하나씩 올라가면서 마지막에 내가 원하는 도메인의 NS서버에 도달해야지만 원하는 정보를 얻을 수 있는 구조이다.</p>
<h1 id="dns의-계층-구조">DNS의 계층 구조</h1>
<blockquote>
<ol>
<li>DNS Root</li>
</ol>
</blockquote>
<pre><code>    - DNS 계층 구조의 최상위 레벨 (DNS Query 수행 시 최초로 조회하는 거점)

    - 다음 단계인 TLDs(Top Level Domain)의 Zone file을 가진 NS서버의 주소 정보 보유

    - Root Hints File

          - DNS Root의 주소를 담은 파일

          - 각 DNS Resolver에 하드코딩되있다.</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/fd930f03-25ac-4218-a110-2ae23934797e/image.png" alt=""></p>
<h1 id="도메인-조회-과정">도메인 조회 과정</h1>
<blockquote>
<p>도메인 조회는 탑레벨 도메인부터 실제 IP까지 점점 구체적인 정보로 내려가는 계층적 구조를 따른다.</p>
</blockquote>
<p><code>도메인은 어떻게 생겼을까?</code></p>
<p>예시) <a href="http://www.example.com">www.example.com</a></p>
<p>com: 탑레벨 도메인 (TLD)</p>
<p>example: 세컨드 레벨 도메인 (SLD)</p>
<p>www: 서브도메인</p>
<blockquote>
<p>🔍 도메인 조회 </p>
</blockquote>
<p><code>1. 브라우저 → 로컬 DNS 캐시 확인</code></p>
<p> 컴퓨터가 내 컴퓨터, 공유기 안의 캐시에 도메인 정보가 있는지 확인하고,</p>
<p> 있으면 IP 주소 반환, 없으면 다음 단계로 넘어간다.</p>
<p><code>2. 로컬 DNS 서버(보통 ISP)로 요청</code>
인터넷 제공업체(ISP)의 DNS 서버에 example.com이 뭔지 물어보고,
여기도 정보가 없으면, DNS 서버가 직접 루트 네임서버로 요청</p>
<p><code>3. 루트 네임서버 → TLD 네임서버 안내</code>
루트 네임서버는 요청을 받고,.com을 관리하는 서버에게 물어보고,
.com TLD 네임서버의 주소를 알려준다.</p>
<p><code>4. TLD 네임서버 → SLD 네임서버 안내</code>
.com TLD 네임서버는 example.com을 담당하는 네임서버(NS) 정보를 알려준다.</p>
<p><code>ex)</code>
<code>ns1.exampledns.com</code>
<code>ns2.exampledns.com</code></p>
<p><code>5. 권한 네임서버(NS) → 실제 IP 주소 반환</code></p>
<p>브라우저는 이제 ns1.exampledns.com에 접속해서 <a href="http://www.example.com%EC%9D%98">www.example.com의</a> IP 주소를 묻는다.</p>
<p>권한 있는 네임서버는 최종적으로 <code>IP 주소</code>를 반환</p>
<p><a href="http://www.example.com">www.example.com</a> = 192.0.2.10</p>
<hr>
<blockquote>
<p>💡 결론</p>
</blockquote>
<p>[브라우저]
    ↓ 요청 <code>(예: www.example.com)</code>
[운영체제의 DNS 캐시]
    ↓ <code>(없으면)</code>
[로컬 DNS 서버 (ISP나 회사의 DNS)]
    ↓ <code>(없으면 재귀 질의 시작)</code>
[루트 네임서버] → <code>.com 어디 있는지 알려줌</code>
    ↓
[TLD 네임서버 <code>(.com)</code>]
    ↓
[권한 네임서버 <code>(예: ns1.exampledns.com)</code>]
    ↓
[최종 IP 응답: 93.184.216.34]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OSI 7계층 (5~7계층)]]></title>
            <link>https://velog.io/@go_sbchi/OSI-7%EA%B3%84%EC%B8%B5-%EC%84%B8%EC%85%98%ED%91%9C%ED%98%84%EC%9D%91%EC%9A%A9-mv8ohbhe</link>
            <guid>https://velog.io/@go_sbchi/OSI-7%EA%B3%84%EC%B8%B5-%EC%84%B8%EC%85%98%ED%91%9C%ED%98%84%EC%9D%91%EC%9A%A9-mv8ohbhe</guid>
            <pubDate>Wed, 23 Apr 2025 08:17:03 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>이전에 OSI 1~4계층에서는 물리적인 연결부터 데이터가 안전하게 전달되기까지의 과정이었다.

OSI 5~7 계층은 사용자와 가장 가까운 영역으로, 

실제 우리가 애플리케이션을 통해 데이터를 주고받는 데 중요한 역할이다.

각각의 계층이 무슨 역할을 하는지 간단하게 살펴보자.</code></pre><hr>
<h1 id="세션-계층">세션 계층</h1>
<blockquote>
<p><strong>세션계층</strong>의 역할 ?</p>
</blockquote>
<p><code>통신 세션의 설정,유지,종료 관리</code></p>
<ul>
<li><p>사용자 A와 서버 B가 통신을 시작함</p>
</li>
<li><p>중간에 일시적인 장애가 있어도 다시 연결해서 이어가는 방식</p>
</li>
<li><p>파일 전송 중에 중단되면 이어서 전송하는 기능 (checkpointing)</p>
</li>
</ul>
<blockquote>
<p>세션 : 두 장치 간의 논리적인 연결</p>
</blockquote>
<hr>
<blockquote>
<p>HTTP에서 세션레이어의 역할</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/1824eb0e-ae47-4bc1-9664-302a897bd0f2/image.png" alt=""></p>
<ol>
<li><p>클라이언트가 서버에 인증요청을 함</p>
</li>
<li><p>서버에서는 클라이언트의 사용자 정보를 쿠키로 만들어서 등록함</p>
</li>
<li><p>컨텐츠 요청을 하면 서버에서는 사용자 정보를 기반으로 인증을 끝내놨기 때문에 IP가 바껴도 인증을 추가로 받지 않음</p>
</li>
</ol>
<hr>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/54946600-e8ba-4b4d-9c5b-567b9660f631/image.png" alt=""></p>
<blockquote>
<p>FTP에서는 세션을 유지하는 세션계층을 구현해놓지 않기 때문에 사용자의 IP상태가 변경되면 검증을 다시 해야한다.</p>
</blockquote>
<blockquote>
<p>🔍 왜 FTP는 별도로 세션 계층을 구현하지 않았나?</p>
</blockquote>
<p><code>FTP는 TCP 기반이고, 클라이언트가 로그인부터 파일 업로드/다운로드까지 지속적인 제어 연결을 자체적으로 유지</code></p>
<p><code>HTTP는 한 번 요청하고 끝나는 구조이기 때문에 세션을 유지하려면 별도의 장치 (예: 쿠키, 세션, 토큰)가 필요</code></p>
<hr>
<hr>
<h1 id="표현-계층">표현 계층</h1>
<blockquote>
<p>역할 : 
받은 데이터를 어떻게 해석할것인가?</p>
</blockquote>
<ul>
<li>파싱 , 압축 해제, 복호화 등등 애플리케이션 계층에서 사용할 수 있는 형식으로 변환</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d71d923f-19db-452f-a3a0-de116a194787/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/3a11d3ed-238c-44fc-b537-4ef4c39f89cf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ba496acf-e7f1-457f-8dae-690723ae3c89/image.png" alt=""></p>
<hr>
<h1 id="응용-계층">응용 계층</h1>
<blockquote>
<p>역할 : 
실제 받은 데이터를 처리하는 방법을 정의
<code>데이터를 가지고 무엇을 어떻게 처리할 것인지?</code></p>
</blockquote>
<blockquote>
<p>Ex) HTTP의 경우</p>
</blockquote>
<ul>
<li><p>Method(Get/Post/Put 등등...)</p>
</li>
<li><p>Status Code(2xx,3xx,4xx,5xx)</p>
</li>
<li><p>Header</p>
<ul>
<li><p>Host,User-Agent,Authorizations,Accept-Encoding,Content-Type</p>
<p>이런식으로 데이터를 마지막으로 처리하는 계층이다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OSI 7계층 - (4계층)]]></title>
            <link>https://velog.io/@go_sbchi/OSI-7-Layer%EC%A0%84%EC%86%A1-w8nn01tc</link>
            <guid>https://velog.io/@go_sbchi/OSI-7-Layer%EC%A0%84%EC%86%A1-w8nn01tc</guid>
            <pubDate>Wed, 23 Apr 2025 08:16:02 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>    이전에 살펴본 네트워크 계층은 한 번에 하나의 통신만 처리할 수 있었고, 

    패킷의 순서를 보장하거나 유실에 대응하는 기능이 부족했다.

    이제 이러한 한계를 보완하는 전송 계층에 대해 알아보자.</code></pre><hr>
<h1 id="전송-계층">전송 계층</h1>
<pre><code>주요 단위 : 세그먼트

주요 구성요소 : TCP/UDP

🔍 주요 특징 

    1. 여러 애플리케이션 간의 동시 통신 지원

    2. 패킷의 순서 및 신뢰성 보장

     3. 오류 검출 및 재전송 기능 제공</code></pre><hr>
<blockquote>
<p><strong>TCP</strong>란?</p>
</blockquote>
<ul>
<li><p>패킷의 전달 과정에서 순서를 보장하고 유실되지 않도록 하는 통신 규약
<code>패킷 안에 세그먼트를 담아서, 주고 받으며 로직 처리</code></p>
<ul>
<li><p>지속적으로 무결성 확인</p>
</li>
<li><p>사용사례 : 웹 페이지(HTTP/HTTPS) , 이메일, 파일 전송, SSH 등등...</p>
</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><strong>세그먼트란?</strong></p>
</blockquote>
<pre><code>🌟 TCP/UDP의 데이터 전달 단위

주요 구성

- Port : 소스/목적

- Sequence / Acknowledgement Number : 통신 주체끼리 데이터 주고 받았는지 확인하는 용도

- Flags : 세그먼트의 목적 등을 정의(ACK,SYN,FIN) 

- Window Size : 세그먼트를 만든 주체가 얼마만큼의 데이터를 받을지 전달

- Urgent Pointer : 세그먼트의 중요도 설정 (먼저 처리해야 하는 세그먼트는 무엇인가 등등)

- 기타 (checksum 등등)

- 실제 데이터</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/43e5e328-6617-46f9-8cd8-f2b62b58b440/image.png" alt=""></p>
<p><code>💻 port ~ CheckSum 까지를 TCP 헤더라고 부른다.</code></p>
<p><code>🧑‍ 세그먼트는 그 밑 계층에 있는 3계층의 패킷에 담기게 된다.</code></p>
<p><code>🧑‍ 패킷은 프레임에 담기게 된다.</code></p>
<hr>
<h1 id="tcp-세그먼트-동작방식">TCP 세그먼트 동작방식</h1>
<p><code>🎯 클라이언트와 서버 간에 세션을 먼저 설정한 뒤, 데이터를 주고받는다.
 클라이언트는 여러 연결을 처리하기 위해 동적으로 할당되는 임시 포트 번호를 사용하고 , 서버는 고정된 서비스 포트 번호를 사용한다.
연결 설정 과정은 3-Way Handshake로 구성한다.</code></p>
<hr>
<blockquote>
<p><strong>3-Way Handshake</strong></p>
</blockquote>
<p> <img src="https://velog.velcdn.com/images/go_sbchi/post/b070dbd3-b76b-4245-8612-ce48c5aea1fe/image.png" alt=""></p>
<hr>
<ol>
<li><p>SYN</p>
<blockquote>
<p>클라이언트가 서버에 연결 요청을 보낼 때, 자신의 초기 시퀀스 번호(CS)를 포함한 SYN 패킷을 전송한다.</p>
</blockquote>
<p><code>[클라이언트] → [서버]</code></p>
<p>(CS = 13)</p>
</li>
</ol>
<hr>
<ol start="2">
<li><p>SYN-ACK</p>
<blockquote>
<p>서버는 클라이언트의 SYN에 응답하면서, 자신의 초기 시퀀스 번호(SS)를 포함한 SYN과
클라이언트의 시퀀스 번호 + 1 을 ACK로 포함한 SYN-ACK 패킷을 보낸다.</p>
</blockquote>
<p><code>[서버] → [클라이언트]</code></p>
<p>(SS = 4431, ACK = 14)</p>
</li>
</ol>
<hr>
<ol start="3">
<li><p>ACK</p>
<blockquote>
<p>클라이언트는 서버의 시퀀스 번호(SS)에 +1 (4431 + 1 = 4432) 한 값을 ACK로 설정하여     ACK 패킷을 전송한다.</p>
</blockquote>
<p><code>클라이언트 → 서버</code></p>
<p>(CS = 14, ACK = 4432)</p>
</li>
</ol>
<hr>
<h1 id="udp란">UDP란?</h1>
<pre><code>- 빠르고 간단하게 데이터를 주고 받음

- Connectionless

    &gt; 데이터의 무결성,순서,전달여부 체크
    &gt; 패킷이 순서대로 오지 않거나, 중복되거나, 아예 전달되지 않을 수 있음
    &gt; 대신에 빠르고 간단함

- 주요 사용 사례

    &gt; 스트리밍
    &gt; 보이스톡
    &gt; 온라인게임

    패킷 하나 정도 유실해도 상관없고, 빠른 처리를 요구할 때 주로 쓰인다.</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/42e96c9b-0458-49a9-90cb-3992d0bbe2e0/image.png" alt=""></p>
<pre><code>UDP의 세그먼트는 TCP에 비해 훨씬 간단한게 보인다.</code></pre><hr>
<h3 id="tcpudp의-통신-구조">TCP/UDP의 통신 구조</h3>
<table>
<thead>
<tr>
<th>특징</th>
<th>TCP</th>
<th>UDP</th>
</tr>
</thead>
<tbody><tr>
<td>연결 방식</td>
<td>연결지향 (Connection-Oriented)</td>
<td>비연결지향 (Connectionless)</td>
</tr>
<tr>
<td>통신 방식</td>
<td>양방향 (Full-Duplex) 지원</td>
<td>단방향 구조에 가까움 (응답 구현 가능)</td>
</tr>
<tr>
<td>신뢰성</td>
<td>높음 (재전송, 순서 보장 등)</td>
<td>낮음 (신뢰성 보장 X)</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[OSI 7계층 - (3계층)]]></title>
            <link>https://velog.io/@go_sbchi/OSI-7%EA%B3%84%EC%B8%B5-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-gujgaotg</link>
            <guid>https://velog.io/@go_sbchi/OSI-7%EA%B3%84%EC%B8%B5-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-gujgaotg</guid>
            <pubDate>Wed, 23 Apr 2025 08:14:44 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>데이터링크 계층에서는 로컬 네트워크 간의 접속만 가능했는데, 

외부 네트워크에 접속하기 위해서는 어떻게 해야할까?

이럴 때 필요한게 3번째인 네트워크 계층이다. </code></pre><hr>
<blockquote>
<p>네트워크 계층</p>
</blockquote>
<ul>
<li>여러 노드의 경로를 찾고 올바르게 전달 될 수 있는 기능과 수단을 정의</li>
<li>주요 단위 : 패킷</li>
<li>주요 구성 요소<ul>
<li>Router, IP ,ARP    </li>
</ul>
</li>
<li>주요 특징<ul>
<li>서로 떨어진 Local Network간의 통신 지원<ul>
<li>중간중간 Node들을 거쳐 목적지까지 도달하는 형식이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p>전세계에 로컬 네트워크가 분포해있고, 모두 인터넷망으로 연결해있다. 그럼 통신 주체를 식별하기 위한 요소인 IP Address가 필요하다.</p>
<blockquote>
<ul>
<li>IP Address : Internet Protocol상에서 통신 주체를 식별하기 위한 아이디</li>
</ul>
</blockquote>
<ul>
<li><p>IPv4 : 32Bits</p>
</li>
<li><p>IPv6 : 128Bits
IPv4의 경우 아이피를 최대한 활용하기 위해 사설과 공인 IP로 분류하지만, IPv6의 경우 IP의 개수가 너무 많기 때문에 사설 IP의 개념이 불필요하다.</p>
</li>
<li><p>특징 : MAC Address와 다르게 수시로 IP는 변동이 가능하다.</p>
<p>IPv4를 표시하기 위한 방법 중 하나로 CIDR를 사용한다.</p>
</li>
<li><p>IP는 주소의 영역을 여러 네트워크 영역으로 나누기 위해 IP를 묶는 방식</p>
</li>
<li><p>여러 개의 사설망을 구축하기 위해 망을 나누는 방법</p>
</li>
</ul>
<h1 id="cidr-notation">CIDR Notation</h1>
<pre><code>- 다양한 IP주소들을 통틀어서 표현하기 위함
- 네트워크 주소와 호스트 주소로 구성
- 각 호스트 주소 숫자 만큼의 아이피를 가진 네트워크 망 형성 가능</code></pre><hr>
<pre><code>✅ ex) 192.168.2.0/24

CIDR notation: /24 → 앞 24비트는 네트워크, 뒤 8비트는 호스트

IP 개수: 2⁸ = 256개

범위(CIDR Block): 192.168.2.0 ~ 192.168.2.255
</code></pre><hr>
<p>  <img src="https://velog.velcdn.com/images/go_sbchi/post/7d7aa1a0-32c0-4bdc-bed9-94217be85341/image.png" alt=""></p>
<p> <img src="https://velog.velcdn.com/images/go_sbchi/post/1d124073-5297-4f9c-9426-342a4eeb07be/image.png" alt=""></p>
<p>네트워크 비트와 호스트 비트를 분류하는 방법은 CIDR도 있지만 서브넷 마스크라는 것도 활용할 수 있다.</p>
<hr>
<h1 id="subnet-mask">Subnet Mask</h1>
<pre><code>- AND 연산을 활용해 네트워크 주소를 필터링한다.
- 네트워크 비트 수만큼 1을 보유한 마스크를 IP에 적용하면 네트워크 비트만 추출</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/5fb6e44d-b492-490b-ab95-adf60990b607/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f8d11234-90ea-420a-bc20-76914d5f3652/image.png" alt=""></p>
<hr>
<p>📌 이러한 방식으로 서브넷 마스크를 활용해 네트워크 주소를 추출하면, 네트워크 간의 패킷을 주고 받는다. 이 과정은 라우터라는 장치가 3계층에서 작동하게 된다. </p>
<h1 id="라우터">라우터</h1>
<blockquote>
<ul>
<li>내부와 외부 네트워크 간 IP 변환(NAT) 처리 </li>
</ul>
</blockquote>
<ul>
<li><p>네트워크 간에 데이터를 전달하며, 패킷의 목적지 IP를 기준으로 경로를 결정해         최적의 다음 홉으로 패킷을 전달</p>
<p>  ✅ Route Table을 통해 어떤 경로의 노드를 경우해야 가장 효율적으로 대상에 도착하는지 알고 있다</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/ebaa1b4b-acb1-44a1-bd07-b0c52efaa163/image.png" alt=""></p>
<h4 id="패킷-전달">패킷 전달</h4>
<hr>
<h4 id="1-라우터가-패킷을-받는다">1. 라우터가 패킷을 받는다.</h4>
<ul>
<li>목적지 IP <code>192.168.1.10</code></li>
</ul>
<h4 id="2-목적지-ip가-어느-네트워크에-속하는지-라우팅-테이블에서-확인">2. 목적지 IP가 <strong>어느 네트워크에 속하는지</strong> 라우팅 테이블에서 확인</h4>
<h4 id="3-ip가-1921681024-대역에-포함되면-로컬-네트워크로-간주">3. IP가 <code>192.168.1.0/24</code> 대역에 포함되면 <strong>로컬 네트워크</strong>로 간주</h4>
<h4 id="4-같은-네트워크일-시--로컬-네트워크로-직접-전달">4. 같은 네트워크일 시  <strong>로컬 네트워크로 직접 전달</strong></h4>
<hr>
<h4 id="🌐-외부-네트워크인-경우">🌐 외부 네트워크인 경우</h4>
<ul>
<li>라우터는 패킷을 <strong>Frame</strong>에 넣어서, 라우팅 테이블에 설정된 다음 홉 라우터(<code>203.0.113.1</code>)로 전달</li>
<li>이때, 각 라우터는 다음 홉으로 향하는 최적 경로에 맞게 Frame을 전달하며, 목적지까지 계속 경로를 탐색</li>
</ul>
<hr>
<blockquote>
</blockquote>
<p>📌 <strong>Frame에 보내기 위해선 Mac Address를 알아야 되는데 어떻게 알 수 있을까?</strong></p>
<p> <strong>라우터</strong>는 <code>목적지 IP Address</code>를 알고 있지만, 실제로 패킷을 전송하려면 <code>MAC Address</code>가 필요하다. <strong>ARP</strong>를 사용해 IP 주소에 대응하는 <code>MAC Address</code>를 찾아낼 수 있다.</p>
<hr>
<h1 id="arp">ARP?</h1>
<ul>
<li>IP로 Mac Address를 찾는 프로토콜</li>
</ul>
<p>⚡ <strong>동작 순서</strong></p>
<ol>
<li><p>패킷 전달을 위한 IP 확인</p>
</li>
<li><p>라우터가 네트워크 내의 모든 장치에게 <strong>ARP 요청</strong>을 브로드캐스트 방식으로 전송 </p>
<p> <code>내용:이 IP 주소에 해당하는 MAC 주소는 무엇인가요?</code></p>
</li>
<li><p>해당 IP 주소를 가진 장치는 <strong>자신의 MAC Address</strong>를 포함한 <strong>ARP 응답</strong>을 라우터에게 보낸다.</p>
<p> <code>응답: 요청을 보낸 라우터에게만 전달 (유니캐스트 방식)</code></p>
</li>
<li><p>라우터는 ARP 응답을 받아 해당 IP 주소에 대응하는 MAC 주소를 <strong>ARP 캐시</strong>에 저장</p>
<pre><code> 이후 동일한 IP 주소에 대해 반복적으로 ARP 요청을 하지 않고, 캐시된 MAC 주소를 사용하여 패킷을 전달</code></pre></li>
</ol>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[OSI 7계층 - (1~2계층)]]></title>
            <link>https://velog.io/@go_sbchi/Network</link>
            <guid>https://velog.io/@go_sbchi/Network</guid>
            <pubDate>Wed, 23 Apr 2025 07:53:37 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<pre><code>AWS를 깊게 파고들수록 네트워크 지식이 필요하기 때문에 공부내용을 정리했다.

네트워크에서 기본적으로 알고있어야 하는 OSI 7계층에 대해 먼저 정리해보았다.</code></pre><hr>
<h1 id="osi-7-계층이란">OSI 7 계층이란?</h1>
<blockquote>
</blockquote>
<ul>
<li>컴퓨터 네트워크 및 통신을 7개의 계층으로 표현한 모델</li>
<li>각 계층은 하위 계층의 기능을 활용해 역할을 수행하고 상위 계층으로 처리 결과를 전달</li>
<li>낮은 계층 부터 높은 계층 순서로 전달</li>
</ul>
<hr>
<h4 id="1계층인-물리-계층에-대해-알아보자"><strong>1계층인 물리 계층에 대해 알아보자</strong></h4>
<h1 id="물리-계층이란">물리 계층이란?</h1>
<blockquote>
<ul>
<li>장치를 연결하기 위한 매체의 물리적인 사항을 정의</li>
</ul>
</blockquote>
<ul>
<li><p>주요 단위 : Bits</p>
</li>
<li><p>대표 구성 요소 : 케이블/안테나/RF등 전송 매체,<strong>허브,리피터</strong></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/455c2602-e993-47f4-842d-b2d60bccc719/image.png" alt=""></p>
</li>
</ul>
<p>주체가 많을수록 네트워크가 복잡해지기 때문에 중앙으로 모아서 연결해주는 장치가 필요하다.
그래서 그 역할을 하는 것이 물리계층에서는 Hub다.</p>
<hr>
<h1 id="1계층의-네트워크-연결-방식">1계층의 네트워크 연결 방식?</h1>
<blockquote>
<p>  <strong>Hub란?</strong></p>
</blockquote>
<pre><code>물리 계층단위에서 다수의 기기들을 연결해주는 장치

📌 특징

1. 에러/충돌/디바이스 별 제어 기능 없음

2. 받은 신호를 그대로 전달하기 때문에 Broadcast의 형식이다 (확성기의 역할)</code></pre><p>   <img src="https://velog.velcdn.com/images/go_sbchi/post/f01450e7-4268-4e98-b29b-8e50d6bdf1ec/image.png" alt=""></p>
<blockquote>
<p> <strong>Hub의 단점</strong></p>
</blockquote>
<pre><code>1. Client가 동시에 얘기를 할 때 충돌을 막을 수 있는 방법이 없다.

2. Client가 다른 대상을 직접 지정해서 연결을 할 수 없다. (Broadcast의 형식이기 때문에)</code></pre><p>✅ 이러한 문제를 해결하기 위해서는 데이터링크 계층을 이용해야 한다.</p>
<hr>
<h1 id="데이터링크-계층이란">데이터링크 계층이란?</h1>
<ul>
<li>물리적인 통신을 제어하여 디바이스간의 통신 및 전송을 안정화 하기 위한 프로토콜</li>
</ul>
<ul>
<li><p>주요 단위 : Frame</p>
</li>
<li><p>주요 구성 요소 : Mac Address, Switch</p>
</li>
<li><p>주요 특징</p>
<ul>
<li><p>CSMA/CD 방식을 활용해서 각 디바이스간의 통신을 원활하게 연결 </p>
</li>
<li><p>대상을 구별하여 디바이스간의 통신을 지원한다(Unicast가 가능하고 Broadcast도 지원)</p>
<p><code>💡 CSMA/CD : 신호가 없을 때 데이터를 보내는 방식, 만약 충돌이 일어날 거 같으면 Jamming Signal을 보내 데이터 통신을 대기 시키는 시간을 서로 다르게 줘서 충돌을 피한다.</code></p>
</li>
</ul>
</li>
</ul>
<p>❗ <strong>데이터 링크 계층에서는 어떻게 주체를 구별할까?</strong></p>
<pre><code>MAC Address
- 네트워크 인터페이스에 부여된 고유의 주소
- 데이터가 지정한 대상에게 잘 전달되게 대상 식별에 사용
예시) 00:1A:2B:3C:4D:5E
첫 3개의 bytes(00:1A:2B) : 제조사에 부여된 고유 식별자
나머지 bytes(3C:4D:5E) : 네트워크 인터페이스 별 고유 번호</code></pre><blockquote>
<p>네트워크 인터페이스의 MAC Address는 고유의 값이며 변하지 않는다.</p>
</blockquote>
<hr>
<h1 id="2계층의-통신단위-및-통신방식">2계층의 통신단위 및 통신방식</h1>
<blockquote>
<p><strong>Frame이란?</strong></p>
</blockquote>
<pre><code>- 프레임은 2계층에서 사용하는 일종의 통신단위이다.
- 대상 MAC과 소스 MAC의 정보를 가지고 Payload에 데이터의 내용을 집어넣어 통신을 하는 방식</code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/06179009-12cd-4f84-949f-5b7ca892ca01/image.png" alt=""></p>
<hr>
<blockquote>
<p><strong>Switch란?</strong></p>
</blockquote>
<pre><code>- 2계층 스위치는 MAC 주소를 기준으로 프레임을 전달하는 장치 
- 같은 네트워크(같은 VLAN) 안에서 장비들끼리 데이터를 주고받게 해주는 역할    </code></pre><p><img src="https://velog.velcdn.com/images/go_sbchi/post/daac3e12-8c93-4aec-a37a-2a621e9a1c49/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/e1c6f5bf-3529-41da-9436-5b922f98744f/image.png" alt=""></p>
<blockquote>
<p>🧠 <strong>Switch</strong> 안에는 테이블이 있고 각각의 포트별로 MAC Address를 가지고 있고, 프레임을 저장할 수 있는 공간이 있다. 
    <code>프레임 스토리지에 Frame을 저장해놓고 아무도 통신하지 않을때 전송하는 방식으로 사용 (CSMA/CD)</code></p>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[클라우드 인프라 아키텍처 & 운영 포트폴리오]]></title>
            <link>https://velog.io/@go_sbchi/portfolio-cloudinfra</link>
            <guid>https://velog.io/@go_sbchi/portfolio-cloudinfra</guid>
            <pubDate>Tue, 22 Oct 2024 06:51:40 GMT</pubDate>
            <description><![CDATA[<h1 id="🔍-intro">🔍 Intro</h1>
<p>이 포트폴리오는 <strong>인프라/클라우드 엔지니어링</strong> 프로젝트별로 <strong>목표 → 설계 → 구현 → 결과</strong> 중심으로 정리했습니다. 모든 사례는 실제 AWS 환경에서 <strong>설계·구축·자동화·운영</strong>까지 직접 수행한 결과물입니다.</p>
<hr>
<h1 id="📑-목차">📑 목차</h1>
<ol>
<li><a href="#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B0%9C%EC%9A%94">프로젝트 일정 및 개요</a></li>
<li><a href="#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%B3%84-%EB%A7%81%ED%81%AC">프로젝트별 링크</a></li>
<li><a href="#tpb--awsterraform-%EA%B8%B0%EB%B0%98-wordpress-https-%EC%9D%B8%ED%94%84%EB%9D%BC">TPB | AWS·Terraform 기반 WordPress HTTPS 인프라</a></li>
<li><a href="#weasel--ai-%EA%B8%B0%EB%B0%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%84%9C%EB%B9%84%EC%8A%A4">Weasel | AI 기반 문제풀이 서비스</a></li>
<li><a href="#-%EC%97%B0%EB%9D%BD%EC%B2%98">연락처</a></li>
</ol>
<hr>
<h1 id="📅-프로젝트-개요">📅 프로젝트 개요</h1>
<p><strong>TPB</strong> </p>
<ul>
<li>목표: WordPress 운영 인프라를 <strong>IaC</strong>로 표준화하고 <strong>HTTPS/도메인</strong>을 포함해 <strong>일관된 재현</strong>이 가능하도록 구축  </li>
<li>역할: 인프라 설계·구현·문서화  </li>
<li>기술: Terraform, AWS (VPC/ALB/EC2/ASG/RDS/CloudFront/Route 53/ACM)</li>
</ul>
<p><strong>Weasel</strong> </p>
<ul>
<li>목표: 문제 이미지 업로드 → <strong>AI(Claude 3.5 Sonnet)</strong> 해설 제공 서비스의 <strong>클라우드 인프라·CI/CD·모니터링</strong> 구축  </li>
<li>역할: 인프라 설계·구현  </li>
<li>기술: AWS, Terraform, <strong>EKS/ECR</strong>, Jenkins, ArgoCD, Prometheus, Grafana</li>
</ul>
<hr>
<h1 id="🔗-프로젝트별-링크">🔗 프로젝트별 링크</h1>
<h3 id="tpb--aws·terraform-기반-wordpress-https-인프라">TPB | AWS·Terraform 기반 WordPress HTTPS 인프라</h3>
<ul>
<li>GitHub: <a href="https://github.com/ChoiSeungBeom/tpb-project">https://github.com/ChoiSeungBeom/tpb-project</a>  </li>
<li>Velog: <a href="https://velog.io/@go_sbchi/tpb-project">https://velog.io/@go_sbchi/tpb-project</a></li>
</ul>
<h3 id="weasel--문제-이미지-기반-ai-정답·해설-서비스">Weasel | 문제 이미지 기반 AI 정답·해설 서비스</h3>
<ul>
<li>GitHub(Org): <a href="https://github.com/Team-S5T1">https://github.com/Team-S5T1</a></li>
<li>Velog: <a href="https://velog.io/@go_sbchi/weasel-project">https://velog.io/@go_sbchi/weasel-project</a></li>
</ul>
<hr>
<h1 id="qa--qc">QA &amp; QC</h1>
<table>
<thead>
<tr>
<th>프로젝트</th>
<th>QA</th>
<th>QC</th>
</tr>
</thead>
<tbody><tr>
<td><nobr><strong>Weasel</strong></nobr></td>
<td>CI/CD 자동화(Jenkins, ArgoCD)로 일관된 배포 절차</td>
<td>Prometheus/Grafana 모니터링, 로그 분석 기반 이슈 탐지·대응</td>
</tr>
<tr>
<td><nobr><strong>TPB</strong></nobr></td>
<td>Terraform 자동화 배포, HTTPS/보안 구성, 헬스체크 설계</td>
<td>트러블슈팅 체크리스트 기반 오류 대응 및 절차 문서화</td>
</tr>
</tbody></table>
<hr>
<h1 id="tpb--aws·terraform-기반-wordpress-https-인프라-1">TPB | AWS·Terraform 기반 WordPress HTTPS 인프라</h1>
<h2 id="개요">개요</h2>
<p>AWS에서 <strong>CloudFront → ALB(HTTPS) → EC2(ASG) → RDS(MySQL)</strong> 아키텍처를 <strong>Terraform</strong>으로 모듈화해 <code>apply</code> 한 번으로 재현 가능한 WordPress 환경을 구축했습니다. <strong>도메인(Route 53)과 인증서(ACM)</strong> 를 포함하여 <strong>HTTPS 강제</strong> 및 운영 필수 설정을 반영했습니다.</p>
<h2 id="설계-포인트">설계 포인트</h2>
<ul>
<li><strong>모듈화</strong>: VPC, ALB, EC2(Launch Template/ASG/UserData), RDS, CloudFront, Route 53, ACM, Bastion 분리</li>
<li><strong>보안</strong>: RDS <strong>Private Subnet</strong> 격리, <strong>SG 최소 권한</strong>(EC2 SG 참조), Public Access 비활성화</li>
<li><strong>TLS</strong>: CloudFront(us-east-1 ACM) ↔ ALB(ap-northeast-2 ACM) 종단 분리, <strong>HTTPS 강제</strong></li>
<li><strong>DNS</strong>: Route 53 <strong>A(ALIAs)</strong> 로 <code>root/www → CloudFront</code>, <code>origin → ALB</code></li>
</ul>
<h2 id="구현">구현</h2>
<ul>
<li><strong>UserData</strong> 로 Nginx·PHP-FPM·WordPress 자동 설치 및 <code>wp-config.php</code> 프록시 인지(X-Forwarded-Proto) 적용  </li>
<li><strong>헬스체크</strong>: Target Group 200–399, <code>/wp-login.php</code>  </li>
<li><strong>캐시 운용</strong>: 기본 캐시 정책 + <strong>Invalidation</strong> 워크플로우로 변경 반영  </li>
<li><strong>문서화</strong>: 스크린샷/구성도/트러블슈팅 수록</li>
</ul>
<h2 id="결과">결과</h2>
<ul>
<li><strong>IaC 표준화</strong>로 환경 간 일관성 확보, 휴먼 에러 감소  </li>
<li><strong>배포 효율</strong> 향상(반복 구축 자동화)  </li>
<li><strong>HTTPS 전환/보안 강화</strong> 로 운영 안정성 제고</li>
</ul>
<hr>
<h1 id="weasel--문제-이미지-기반-ai-정답·해설-서비스-1">Weasel | 문제 이미지 기반 AI 정답·해설 서비스</h1>
<h2 id="개요-1">개요</h2>
<p>사용자가 업로드한 문제 이미지를 <strong>AWS Bedrock(Claude 3.5 Sonnet)</strong> 으로 분석해 <strong>정답·해설·오답 사유</strong>를 제공하는 서비스입니다. 인프라 자동화, <strong>EKS 배포</strong>, <strong>CI/CD</strong>, <strong>모니터링</strong>까지 구축했습니다.</p>
<h2 id="설계-포인트-1">설계 포인트</h2>
<ul>
<li><strong>IaC 분리</strong>: 변동성 기준으로 Terraform 스택을 <strong>persistent/dynamic</strong> 으로 분리  </li>
<li><strong>컨테이너 오케스트레이션</strong>: ECR → EKS 배포  </li>
<li><strong>CI/CD</strong>: Jenkins(빌드) → ArgoCD(배포) 파이프라인  </li>
<li><strong>관측성</strong>: Prometheus/Grafana 대시보드, ALB/CloudFront 로그 쿼리링</li>
</ul>
<h2 id="결과-1">결과</h2>
<ul>
<li><strong>코드 푸시 → 운영 배포</strong> 자동화로 릴리스 리드타임 단축  </li>
<li><strong>관측성 강화</strong>로 장애 감지 및 대응 시간 단축  </li>
<li>서비스 <strong>안정성/확장성</strong> 확보</li>
</ul>
<hr>
<h1 id="📬-연락처">📬 연락처</h1>
<ul>
<li>Email: <strong><a href="mailto:csb19989@gmail.com">csb19989@gmail.com</a></strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[🦊 Weasel 프로젝트 – AI 기반 문제풀이 서비스]]></title>
            <link>https://velog.io/@go_sbchi/weasel-project</link>
            <guid>https://velog.io/@go_sbchi/weasel-project</guid>
            <pubDate>Wed, 25 Sep 2024 07:55:23 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-intro">📌 Intro</h2>
<p><strong>Weasel 프로젝트</strong>는 AWS Bedrock Claude Sonnet 3.5 모델을 활용한 문제풀이 서비스입니다.<br>사용자가 문제 이미지를 업로드하면 AI가 <strong>정답과 해설</strong>을 제공합니다.
총 6명 (Frontend 2명, Backend 2명, Infra 2명)이 참여했고, 저는 인프라 팀의 일원으로 프로젝트를 성공적으로 마무리했습니다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/80c4dfbd-4c23-40d7-ae56-81be92fdd71a/image.webp" alt="대표이미지"></p>
<hr>
<h2 id="📝-프로젝트-개요">📝 프로젝트 개요</h2>
<ul>
<li><strong>목표</strong>: 문제 이미지 업로드 → AI 정답·해설 제공 + CI/CD + 모니터링 환경 구성  </li>
<li><strong>주요 스택</strong>:<ul>
<li><strong>Backend</strong>: Spring Boot  </li>
<li><strong>Frontend</strong>: React  </li>
<li><strong>IaC(인프라 코드화)</strong>: Terraform  </li>
<li><strong>배포 환경</strong>: Amazon EKS, S3, Route53, CloudFront  </li>
<li><strong>AWS 서비스</strong>: VPC, ECR, Secrets Manager, WAF  </li>
<li><strong>CI/CD</strong>: Jenkins, ArgoCD  </li>
<li><strong>GenAI 모델</strong>: AWS Bedrock (Claude Sonnet 3.5)  </li>
<li><strong>모니터링</strong>: Prometheus, Grafana</li>
</ul>
</li>
</ul>
<h2 id="🔗-github-link">🔗 GitHub Link</h2>
<ul>
<li><a href="https://github.com/Team-S5T1">Weasel - Github</a> </li>
</ul>
<hr>
<h2 id="🏗-아키텍처">🏗 아키텍처</h2>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7eb4fcdf-a4b1-4d22-992a-42aef5723bf7/image.png" alt=""></p>
<ul>
<li><strong>AI 처리 흐름</strong>: 문제 이미지를 업로드하면 API가 AWS Bedrock(Claude Sonnet 3.5)과 연동되어, 빠르고 정확한 정답·해설을 반환하도록 구성</li>
<li><strong>CI/CD 자동화</strong>: 코드 변경 시 Jenkins가 자동 빌드를 수행하고, ArgoCD로 EKS에 배포하여 배포 속도와 안정성을 높임</li>
<li><strong>모니터링</strong>: Prometheus와 Grafana로 CPU·메모리 사용량, API 응답 속도, 에러율을 실시간 확인해 장애를 조기 발견</li>
<li><strong>보안 및 HTTPS 적용</strong>: CloudFront와 WAF를 활용해 전 구간 HTTPS 통신과 웹 공격 방어를 구현</li>
<li><strong>인프라 코드화</strong>: Terraform으로 인프라를 코드로 관리해, 환경 재현성과 재사용성을 확보</li>
</ul>
<hr>
<h2 id="⚙️-cicd-아키텍처">⚙️ CI/CD 아키텍처</h2>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/540a19b6-52b4-4627-b955-7c51e479bae3/image.png" alt=""></p>
<h3 id="백엔드-배포-파이프라인-spring-boot-→-eks">백엔드 배포 파이프라인 (Spring Boot → EKS)</h3>
<ol>
<li>GitHub에 코드를 올리면 <strong>Jenkins</strong>가 자동으로 빌드를 시작합니다.  </li>
<li>애플리케이션을 빌드하고, Docker 이미지를 만들어 <strong>ECR</strong>에 저장합니다.  </li>
<li><strong>ArgoCD</strong>가 매니페스트(Helm/Kustomize) 변경 사항을 감지합니다.  </li>
<li>변경된 내용을 <strong>EKS</strong>에 반영하며, 롤링 업데이트 또는 Blue/Green 방식으로 배포합니다.  </li>
</ol>
<br>

<h3 id="프론트엔드-배포-파이프라인-react-→-s3·cloudfront">프론트엔드 배포 파이프라인 (React → S3·CloudFront)</h3>
<ol>
<li>GitHub에 코드를 올리면 <strong>Jenkins</strong>가 프론트엔드 빌드를 실행합니다.  </li>
<li>빌드된 정적 파일(<code>build/</code>)을 <strong>S3 버킷</strong>에 업로드합니다.  </li>
<li>배포 시 CloudFront 캐시를 자동 무효화로 최신 파일을 받을 수 있게 구성했습니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/18cd20de-2c77-44a7-ab28-52a33e709134/image.png" alt=""><br><em>Jenkins 빌드 파이프라인 실행 화면</em></p>
<hr>
<h2 id="📢-배포-알림-자동화">📢 배포 알림 자동화</h2>
<ul>
<li>Jenkins 빌드 완료 후 <strong>Slack Webhook</strong>을 통해 성공/실패 여부 실시간 알림</li>
<li>백엔드·프론트엔드 각각 별도 파이프라인으로 빌드 상태 확인 가능</li>
<li>알림 메시지에 Jenkins Job URL을 포함해 즉시 로그·상태 확인 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/9fc18e1a-ec4a-45d0-83ea-9eff85c9efa3/image.png" alt="slack-jenkins알림"><br><em>Jenkins 빌드 성공 시 Slack 채널에 실시간 알림</em></p>
<hr>
<h2 id="💻-서비스-화면">💻 서비스 화면</h2>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/d0be1513-570b-4d6a-8bf4-7fb8ea972d74/image.png" alt="문제 업로드 화면"><br><em>문제 이미지를 업로드할 수 있는 입력 UI 및 채팅 내용 저장</em></p>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/7ab3b3ab-97f9-4d55-b8ee-fcd9a295e386/image.png" alt="AI 응답 화면"><br><em>업로드한 문제 이미지에 대해 AI가 정답과 해설을 반환하는 화면</em></p>
<hr>
<h2 id="📊-모니터링">📊 모니터링</h2>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/c7162e2d-e299-4330-b75e-90b921141a3e/image.png" alt=""><br><em>Grafana 대시보드</em></p>
<p>Prometheus와 Grafana를 활용해 CPU·메모리 사용량, API 응답 속도, 에러율 등을 실시간으로 모니터링했습니다.
이를 통해 성능 저하나 장애 징후를 조기에 발견하고 신속히 대응할 수 있었습니다.</p>
<hr>
<h2 id="⚠️-트러블슈팅--nodejs-dockerfile-최적화">⚠️ 트러블슈팅 : Node.js Dockerfile 최적화</h2>
<h3 id="문제">문제</h3>
<ul>
<li>Dockerfile이 개발 환경과 프로덕션 환경 구분 없이 작성되어 최종 이미지에 불필요한 개발 도구와 의존성이 포함됨</li>
<li>빌드 과정 없이 바로 실행해 최적화가 전혀 이루어지지 않음</li>
<li>실행 명령어(<code>npm run dev</code>)가 개발 환경 기준으로 설정되어 프로덕션에 적합하지 않음</li>
</ul>
<hr>
<h3 id="원인">원인</h3>
<ol>
<li><strong>베이스 이미지</strong>  <ul>
<li><code>node:20.14.0</code> 이미지는 개발 도구가 포함되어 최종 이미지 크기가 커짐</li>
</ul>
</li>
<li><strong>빌드 과정 누락</strong>  <ul>
<li>최적화된 빌드 산출물이 아닌 원본 소스 코드로 실행</li>
</ul>
</li>
<li><strong>실행 명령어 부적절</strong>  <ul>
<li><code>npm run dev</code> → 개발 의존성(devDependencies)까지 포함 설치  </li>
<li>프로덕션에서는 <code>npm start</code> 사용이 적합</li>
</ul>
</li>
</ol>
<hr>
<h3 id="해결">해결</h3>
<ul>
<li><strong>이미지 최적화</strong>: 빌드 단계와 배포 단계를 분리 (multi-stage build)  </li>
<li><strong>슬림 이미지 사용</strong>: 프로덕션 단계에서 <code>node:&lt;버전&gt;-slim</code> 사용  </li>
<li><strong>빌드 명령어 추가</strong>: <code>RUN yarn build</code>로 프로덕션 빌드 생성  </li>
<li><strong>실행 명령어 변경</strong>: <code>CMD [&quot;npm&quot;, &quot;start&quot;]</code>로 프로덕션 실행</li>
</ul>
<hr>
<h3 id="변경-전후-비교">변경 전/후 비교</h3>
<p><strong>변경 전</strong></p>
<pre><code class="language-dockerfile">FROM node:20.14.0

WORKDIR /usr/src/app

COPY package.json yarn.lock ./
RUN yarn install

COPY . .

EXPOSE 3000
CMD [&quot;npm&quot;, &quot;run&quot;, &quot;dev&quot;]</code></pre>
<p><strong>변경 후 (Multi-stage build)</strong></p>
<pre><code class="language-dockerfile"># 빌드 단계
FROM node:20.14.0 AS builder
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY . .
RUN yarn build

# 프로덕션 단계
FROM node:20.14.0-slim
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install --production --frozen-lockfile
COPY --from=builder /usr/src/app/dist ./dist

EXPOSE 3000
CMD [&quot;npm&quot;, &quot;start&quot;]</code></pre>
<hr>
<h3 id="효과">효과</h3>
<ul>
<li><strong>이미지 크기 감소</strong>: 불필요한 개발 도구/의존성 제거</li>
<li><strong>실행 효율 향상</strong>: 최적화된 빌드 결과물만 배포</li>
<li><strong>환경 분리</strong>: 개발/배포 환경 명확하게 구분</li>
</ul>
<hr>
<h2 id="⚠️-트러블슈팅--jenkins-파이프라인-브랜치-필터링">⚠️ 트러블슈팅 : Jenkins 파이프라인 브랜치 필터링</h2>
<h3 id="문제-1">문제</h3>
<ul>
<li>메인 브랜치에 병합하기 전에 생성된 브랜치에서 <code>push</code> 시에도 Jenkins 파이프라인이 실행됨</li>
<li><strong>main</strong> 브랜치 변경 시에만 파이프라인이 동작하도록 제어 필요</li>
</ul>
<hr>
<h3 id="원인-1">원인</h3>
<ul>
<li>기존 설정(<code>GitHub hook trigger for GITScm polling</code>)은 <strong>모든 브랜치 변경 시</strong> 파이프라인이 실행됨</li>
<li>브랜치 조건 필터링 로직이 없어 main 외 브랜치에서도 빌드가 수행됨</li>
</ul>
<hr>
<h3 id="해결-1">해결</h3>
<h4 id="1-plugin-변경">1. Plugin 변경</h4>
<ul>
<li><code>GitHub hook trigger for GITScm polling</code> → <strong>Generic Webhook Trigger</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/f29fe7ae-e3e6-4f66-b30c-c916b075f02c/image.png" alt=""></p>
<hr>
<h4 id="2-build-triggers-설정">2. Build Triggers 설정</h4>
<ul>
<li><strong>기존</strong>: GitHub hook trigger for GITScm polling  </li>
<li><strong>변경</strong>: Generic Webhook Trigger  </li>
</ul>
<hr>
<h4 id="3-post-content-parameters">3. Post Content Parameters</h4>
<ol>
<li><strong>genericVariables</strong>  <ul>
<li><code>key: &#39;ref&#39;</code>, <code>value: &#39;$.ref&#39;</code> 설정  </li>
<li>JSONPath(<code>$.ref</code>)로 웹훅 페이로드에서 브랜치 정보 추출 후 변수 <code>ref</code>에 저장</li>
</ul>
</li>
<li><strong>regexpFilterText</strong>  <ul>
<li><code>$ref</code>로 설정 → 추출된 브랜치 정보(<code>ref</code>)를 필터 텍스트로 사용</li>
</ul>
</li>
<li><strong>regexpFilterExpression</strong>  <ul>
<li><code>&#39;refs/heads/main&#39;</code> 지정 → main 브랜치일 때만 빌드 실행</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/fe380a3a-f5d6-482a-a7c9-c0e58fd21855/image.png" alt=""></p>
<hr>
<h4 id="4-optional-filter">4. Optional filter</h4>
<ul>
<li><strong>Text</strong>: <code>ref</code> 변수 값  </li>
<li><strong>Expression</strong>: <code>refs/heads/main</code>  </li>
</ul>
<p><img src="https://velog.velcdn.com/images/go_sbchi/post/e888d231-7004-4d6d-97c4-a1ccd8b1c68c/image.png" alt=""></p>
<hr>
<h3 id="웹훅-설정">웹훅 설정</h3>
<ul>
<li><strong>Payload URL</strong>  <pre><code class="language-plaintext">http://&lt;도메인 또는 IP&gt;/generic-webhook-trigger/invoke?token=&lt;토큰&gt;

</code></pre>
</li>
</ul>
<ul>
<li>Content type: application/json</li>
</ul>
<hr>
<h3 id="변경-전후-비교-1">변경 전/후 비교</h3>
<table>
<thead>
<tr>
<th>항목</th>
<th>변경 전</th>
<th>변경 후</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Build Trigger</strong></td>
<td>GitHub hook trigger for GITScm polling</td>
<td>Generic Webhook Trigger</td>
</tr>
<tr>
<td><strong>브랜치 필터링</strong></td>
<td>모든 브랜치에서 빌드 실행</td>
<td>main 브랜치에서만 빌드 실행</td>
</tr>
<tr>
<td><strong>필터 조건</strong></td>
<td>없음</td>
<td>JSONPath(<code>$.ref</code>)로 브랜치 추출 → 정규식(<code>refs/heads/main</code>) 매칭</td>
</tr>
</tbody></table>
<hr>
<h2 id="💡-마무리">💡 마무리</h2>
<p>Weasel 프로젝트를 통해 팀원 간 소통과 협력의 중요성을 깊이 느꼈습니다.
첫 팀 프로젝트였던 만큼 부족한 점도 많았지만, 개인 프로젝트에서는 드러나지 않았던 보안 관리, 운영 안정성, 배포 효율성의 한계를 체감했습니다.
이를 해결하기 위해 CI/CD 파이프라인을 최적화해 배포 속도를 개선하고, Grafana·Prometheus 기반 모니터링 환경을 구축해 장애 발생 시 신속하게 대응할 수 있는 체계를 마련하는 등 많은 것을 배웠습니다.</p>
<blockquote>
<p>부족하다 느낀점 </p>
</blockquote>
<p>향후에는 비용 효율성을 위해 Jenkins Fleet을 도입해, 빌드 시에만 에이전트를 동적으로 생성하고 사용 후 자동 종료하는 방식으로 EC2 비용을 절감하는 방안도 고려하고 있습니다. 
앞으로도 IaC 기반 클라우드 아키텍처 설계 역량을 확장해, 대규모 트래픽 환경에서도 안정적이고 효율적인 서비스를 운영할 수 있는 체계를 구축하는 것을 목표로 하겠습니다.</p>
<hr>
]]></description>
        </item>
    </channel>
</rss>