<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>al_chive.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 03 Apr 2025 07:42:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>al_chive.log</title>
            <url>https://velog.velcdn.com/images/al_chive/profile/7448611b-3f35-4b1f-9388-8297e93e8b63/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. al_chive.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/al_chive" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[AWS EKS에 ALB를 통해 여러 서비스 연결하기]]></title>
            <link>https://velog.io/@al_chive/AWS-EKS%EC%97%90-ALB%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%97%AC%EB%9F%AC-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/AWS-EKS%EC%97%90-ALB%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%97%AC%EB%9F%AC-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 03 Apr 2025 07:42:38 GMT</pubDate>
            <description><![CDATA[<h2 id="목적">목적</h2>
<p>AWS EKS에서 ALB를 이용해 여러 서비스를 연결하기 위해서는 TargetGroupBinding을 사용합니다.
TargetGroupBinding을 사용하는 목적은 다음과 같습니다. </p>
<p>제가 이 페이지에서 사용하고자 하는 목적은 1번 단일 ALB에서 여러 서비스를 라우팅하기 위해 사용합니다.
<br></p>
<ol>
<li>*<em>단일 ALB에서 여러 서비스 라우팅 *</em>
: 하나의 ALB를 통해 여러 서비스로 트래픽을 분배하여 비용을 절감하고 관리 복잡성을 줄입니다.</li>
</ol>
<p>2.** 유연한 트래픽 제어 **
: 서비스별로 개별 Target Group을 설정하여, 특정 서비스의 트래픽을 원하는 방식으로 분배할 수 있습니다.</p>
<p>3.** EKS 네이티브 통합**
: ALB의 Target Group과 EKS의 서비스(Pod)간 직접적인 연결을 설정하여,
Ingress 리소스를 사용하지 않고도 ALB를 통해 EKS의 서비스와 원활하게 연동할 수 있습니다.</p>
<br>

<hr>
<h1 id="target-group-binding-방법">Target Group Binding 방법</h1>
<h2 id="aws-loadbalancer-controller-애드온-설치">AWS LoadBalancer Controller 애드온 설치</h2>
<p>로드 밸런서 컨트롤러 에드온이 있어야 Kubernetes 리소스(Ingress, Service 등)를 자동으로 AWS의 로드 밸런서(Target Group)와 매핑할 수 있습니다.</p>
<h3 id="aws-load-balancer-controller-iam-policy-다운로드">AWS Load Balancer Controller IAM Policy 다운로드</h3>
<p>AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다.</p>
<pre><code>curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.12.0/docs/install/iam_policy.json</code></pre><p>다운 받은 위 Policy를 &quot;AWSLoadBalancerControllerIAMPolicy&quot;라는 명칭으로 IAM Policy 생성합니다.</p>
<h3 id="eks-서비스-어카운트-생성-및-정책-연결">EKS 서비스 어카운트 생성 및 정책 연결</h3>
<pre><code>eksctl create iamserviceaccount --cluster=&lt;Cluster Name&gt; --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=&lt;AWSLoadBalancerControllerIAMPolicy_ARN&gt; --approve</code></pre><h3 id="addon-옵션-지정-및-helm-설치">Addon 옵션 지정 및 helm 설치</h3>
<pre><code># helm add
helm repo add eks https://aws.github.io/eks-charts

# helm update
helm repo update eks

# helm install
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
--version &lt;Chart_Version&gt; -n kube-system \
--set clusterName=&lt;Cluster_Name&gt; \
--set vpcId=&lt;VPC_ID&gt; \
--set region=ap-northeast-2 --set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set enableShield=false \
--set enableWaf=false \
--set enableWafv2=false \
--set createIngressClassResource=true --set ingressClass=alb</code></pre><h2 id="target-group-binding-yaml-파일-작성">Target Group Binding yaml 파일 작성</h2>
<p>tgb yaml 파일을 작성하여 배포하면 완료!!!!</p>
<pre><code>apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: kafka-ui-tgb
  namespace: kafka
spec:
  serviceRef:
    name: kafka-ui
    port: 80
  targetGroupARN: &lt;Target_Group_ARN&gt;
  targetType: ip
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[OIDC (OpenID Connect Provider)란?  쉽게 이해하기]]></title>
            <link>https://velog.io/@al_chive/OIDC-OpenID-Connect-Provider%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/OIDC-OpenID-Connect-Provider%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 03 Apr 2025 06:12:32 GMT</pubDate>
            <description><![CDATA[<h2 id="oidc에-대한-궁금증">OIDC에 대한 궁금증</h2>
<p>AWS EKS를 생성하고, 노드 및 파드에 접속하여 공부해보면서 OIDC가 생성 되면 , IAM Identity Center 에 등록하곤 했었는데요.
문득 OIDC 가 뭐고 이걸 왜 등록 해야하는지에 대해 궁금해졌습니다. 그래서 이것이 어떤 역할을 하게 되는지에 대해서 작성해보려 합니다.</p>
<h2 id="oidc의-역할">OIDC의 역할</h2>
<p><img src="https://velog.velcdn.com/images/al_chive/post/db5fb7aa-0dc0-4929-8a68-d88a76c08b8d/image.png" alt=""></p>
<p>EKS를 생성하면 <strong>OIDC 제공자(OpenID Connect Provider)</strong> 가 자동으로 생성됩니다.
이 OIDC 제공자는 Kubernetes API 서버가 AWS IAM과 연동할 수 있도록 해주는데요.</p>
<p>Kubernetes 내부에서는 kubectl 명령어를 실행할 때 IAM 사용자의 역할(Role)을 기반으로 인증을 수행해야 합니다. 
기본적으로 EKS 클러스터는 IAM 인증을 사용하지만, IAM 자체는 Kubernetes 네이티브 RBAC(Role-Based Access Control)를 모릅니다.</p>
<p>그래서 OIDC를 이용해 IAM과 Kubernetes의 인증 체계를 연결하는 방식으로 동작하게 됩니다.</p>
<br>

<h2 id="iam-identity-center를-추가하는-이유">IAM Identity Center를 추가하는 이유</h2>
<p>IAM Identity Center(기존 SSO)를 EKS OIDC와 연동하면 AWS IAM Identity Center 사용자가 EKS에 접근할 수 있습니다. 이러한 이유로 EKS 생성 후 OIDC를 Identity Center에 추가해줘야 하는데요.</p>
<p>OIDC를 통해 EKS가 AWS IAM과 연동됨.
→ &quot;EKS가 AWS IAM 역할(Role)을 사용할 수 있음&quot;을 의미.</p>
<p>IAM Identity Center를 사용하면, AWS IAM 역할을 통해 EKS에 접근 가능
→ 즉, AWS IAM Identity Center에서 특정 사용자나 그룹을 IAM Role에 매핑하면, 해당 사용자는 kubectl을 사용하여 EKS에 접근 가능.</p>
<p>IAM Role과 Kubernetes RBAC 연결
→ IAM Role이 EKS의 Kubernetes RBAC와 연결되면, 해당 Role을 가진 사용자는 kubectl로 클러스터를 관리할 수 있음.</p>
<br>

<h2 id="oidc-등록-전">OIDC 등록 전</h2>
<p>EKS에 자동 할당 되어 있는 OIDC를 Identity Center에 등록하지 않고 Kubectl 명령어를 입력해보겠습니다. 
아래 명령어로 pod, node에 대한 어떤 정보도 가져오지 못합니다.
<img src="https://velog.velcdn.com/images/al_chive/post/6ab1bd03-3409-452a-b00c-abb0b629fa6f/image.png" alt=""></p>
<h2 id="oidc-등록-후">OIDC 등록 후</h2>
<p>Identity Center에 등록 후 이전에는 되지 않던 kubectl 명령어가 동작하는 것 확인 가능합니다.
<img src="https://velog.velcdn.com/images/al_chive/post/53ec67a4-f8c4-4cbc-b2f1-ab857291c7b3/image.png" alt=""></p>
<h2 id="결론">결론</h2>
<p>100번의 이론 설명보다 1번의 실습이 더 이해하기가 편하죠 :)
<em><strong>OIDC는 Kubernetes에서 AWS IAM을 통한 접근을 가능하게 해주는 인증 방식이다!!</strong></em>
_<strong>OIDC 덕분에 AWS IAM으로 kubernetes에 로그인할 수 있다</strong>_👍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Terraform 종속성 명시하기]]></title>
            <link>https://velog.io/@al_chive/Terraform-%EC%A2%85%EC%86%8D%EC%84%B1-%EB%AA%85%EC%8B%9C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/Terraform-%EC%A2%85%EC%86%8D%EC%84%B1-%EB%AA%85%EC%8B%9C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 31 Mar 2025 01:20:33 GMT</pubDate>
            <description><![CDATA[<h2 id="에러">에러</h2>
<p>Terraform을 통해 EKS Cluster 생성 및 Add-on 설치 시에 아래와 같이 내가 방금 Terraform을 통해 생성한 EKS Cluster가 없다는 ERROR가 발생하여, Add-on 설치를 실패했다는 로그가 나온다.</p>
<blockquote>
</blockquote>
<p>Error: creating EKS Add-On (alin-test-cluster:vpc-cni): ResourceNotFoundException: No cluster found for name: alin-test-cluster.
│ {
│   RespMetadata: {
│     StatusCode: 404,
│     RequestID: &quot;27b9e182-4dc9-4cd7-a2e9-efaa0a858699&quot;
│   },
│   ClusterName: &quot;alin-test-cluster&quot;,
│   Message_: &quot;No cluster found for name: alin-test-cluster.&quot;
│ }
│
│   with aws_eks_addon.vpc_cni,
│   on main.tf line 39, in resource &quot;aws_eks_addon&quot; &quot;vpc_cni&quot;:
│   39: resource &quot;aws_eks_addon&quot; &quot;vpc_cni&quot; {
│</p>
<h2 id="에러-원인">에러 원인</h2>
<p>내 코드에서 Add-on 설치 부분을 보면 단순히 Cluster와 어떤 Add-on인지에 대해서만 명시되어 있다.
Terraform을 통한 EKS Cluster가 생성 되기 전 Add-on 설치가 먼저 이루어지는 바람에 Add-on 설치가 실패된 것이다.</p>
<pre><code>###############################################################################
# EKS Add-on
################################################################################
resource &quot;aws_eks_addon&quot; &quot;vpc_cni&quot; {
  cluster_name  = var.eks_cluster_name
  addon_name    = &quot;vpc-cni&quot;
  addon_version = var.vpc_cni_version

}</code></pre><h2 id="해결-방법">해결 방법</h2>
<p>depens_on 을 사용하여 EKS Cluster가 생성 된 후 Add-on이 설치될 수 있도록 한다.</p>
<pre><code>###############################################################################
# EKS Add-on
################################################################################
resource &quot;aws_eks_addon&quot; &quot;vpc_cni&quot; {
  cluster_name  = var.eks_cluster_name
  addon_name    = &quot;vpc-cni&quot;
  addon_version = var.vpc_cni_version
  depends_on  = [aws_eks_cluster.eks_cluster]

}</code></pre><p>Terraform 생성 로그를 보면 depens_on을 사용하여 종속성을 명시해준 이후에 Cluster 생성 후 Add-on이 설치되는 것을 확인할 수 있었다.
<img src="https://velog.velcdn.com/images/al_chive/post/69a9ca71-4e77-4912-b0bc-c90267b28f71/image.png" alt=""></p>
<br>

<hr>
<h2 id="depends_on-에서-의-의미">depends_on 에서 []의 의미</h2>
<p>depens_on 이라는 블록을 사용하게 되면 Value에 중괄호 []를 사용하여 작성하게 되는데요.
이 중괄호는 여러 개의 리소스에 의존할 수 있기 때문에 리스트(Slice) 형태로 입력 받습니다.</p>
<pre><code>depends_on = [
  aws_eks_cluster.eks_cluster,
  aws_iam_role.eks_role
]</code></pre><p>위 코드와 같이 여러 개의 의존성을 가질 수 있다라고 알고 있으면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Terraform을 시작하기 전...]]></title>
            <link>https://velog.io/@al_chive/Terraform-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/Terraform-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 Mar 2025 07:55:13 GMT</pubDate>
            <description><![CDATA[<h2 id="목적">목적</h2>
<p>테라폼을 시작해보고는 싶은데 어디서부터 어떻게 시작해야할지 모르는 &#39;나&#39;와 이 글을 읽는 분들께
테라폼을 AWS와 연동하고, AWS 내에 동작하는 리소스를 생성하기 위한 방법을 정리합니다.</p>
<h2 id="뭐부터-시작해야할까">뭐부터 시작해야할까?</h2>
<p>테라폼 코드를 무작정 작성할 수는 없으니 아래와 같이 단계별로 진행해보려 합니다.</p>
<ol>
<li>테라폼 설치하기</li>
<li>코드 디렉토리 트리 구성하기</li>
<li>구조 모듈화를 통한 관리 방식 수립하기 </li>
<li>트리 구조에 맞게 코드 작성하기</li>
</ol>
<h2 id="목표">목표</h2>
<p>테라폼 코드 작성 전 저는 아래와 같은 목표를 갖고 작업 진행 예정입니다.
이를 바탕으로 이 페이지에서는 기본적인 트리구조와 모듈화를 통한 관리 방식 수립 부분 까지만 진행해보도록 하겠습니다.</p>
<ul>
<li><strong>초기 인프라 구축 자동화</strong>: 네트워크부터 애플리케이션 인프라까지 Terraform으로 완전 자동화된 배포 가능 여부 검증</li>
<li><strong>기존 인프라 활용 자동화</strong>: 이미 존재하는 네트워크를 활용하여 신규 리소스 배포 및 삭제의 효율성 검증</li>
<li><strong>운영 리소스 변경 및 업그레이드</strong>: 운영 중인 리소스의 버전 업데이트 및 세부 설정 변경 시 안정성 및 운영 효율성 평가</li>
<li><strong>CI/CD 파이프라인 연계 가능성 검토</strong>: Terraform을 GitOps와 연계하여 자동화 배포 및 변경 관리가 가능하도록 테스트</li>
</ul>
<br>

<hr>
<h2 id="1-테라폼-설치하기">1. 테라폼 설치하기</h2>
<p>테라폼을 사용하기 위해서는 테라폼과 AWS CLI를 설치해야합니다.
각자의 환경에 맞는 Terraform과 CLI를 설치하도록 합니다.</p>
<p>👉🏻[테라폼 설치] (<a href="https://developer.hashicorp.com/terraform/install">https://developer.hashicorp.com/terraform/install</a>)
👉🏻[AWS CLI 설치] (<a href="https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html">https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html</a>)
<br></p>
<hr>
<h2 id="2--코드-디렉토리-트리-구성하기">2.  코드 디렉토리 트리 구성하기</h2>
<p>트리 구조는 아래와 같습니다. 
트리 구조를 이렇게 짠 이유는 운영까지 고려하여 영향도를 최소화 하고 운영 편의성을 높이기 위해 리소스 별로 상세하게 나누었습니다.</p>
<blockquote>
</blockquote>
<p>terraform
├─ 100_network
├─── 101_network_default
├───── main.tf
├───── variables.tf
├───── versions.tf
├───── output.tf
├───── locals.tf
├─── 102_network_gw
├─── 103_network_vep
├─── 104_network_routing
├─── 105_network_sg_rule
├─ 200_compute
├─ 300_eks
├─ 400_s3
├─ 500_rds
├─ 600_iam
├─── 601_iam_policy
├─── 602_iam_rule
...</p>
<br>

<hr>
<h2 id="3-구조-모듈화를-통한-관리-방식-수립하기">3. 구조 모듈화를 통한 관리 방식 수립하기</h2>
<p>각 리소스 내에 있는 tf 파일들은 각자의 역할에 따라 구분되어 있습니다.
이 파일들을 어떻게 사용하느냐에 따라 운영의 편리함을 구분지을 수 있다고 생각합니다.</p>
<p>그래서 저는 테라폼을 통한 리소스 구성 시 variables.tf 파일만 수정하도록 관리 방식을 수립했습니다.</p>
<p><strong>[main.tf] (주요 리소스 정의)</strong> </p>
<ul>
<li>인프라의 주요 리소스를 선언하는 파일로, AWS 서비스(EKS, RDS, EC2 등)를 구성하는 코드가 포함됩니다.</li>
<li>변경을 최소화 하기 위하여 이 파일은 운영 및 구축 시 변경하지 않아도 되도록 설계합니다.</li>
</ul>
<p><strong>[variables.tf] (입력 변수 정의)</strong> </p>
<ul>
<li>Terraform 코드에서 사용할 변수들을 정의하는 파일입니다.</li>
<li>프로젝트의 유연성을 높이며, 특정 값(VPC ID, 인스턴스 유형 등)을 변경할 때 이 파일만 수정하면 됩니다.</li>
</ul>
<p><strong>[versions.tf] (버전 관리)</strong></p>
<ul>
<li>Terraform 및 필요한 provider(AWS 등)의 버전을 지정하는 파일입니다.</li>
<li>특정 버전을 명시하여 환경 간 일관성을 유지하고, 호환성을 일관되게 유지하는 역할을 합니다.</li>
</ul>
<p><strong>[output.tf](출력 변수 정의)</strong></p>
<ul>
<li>Terraform 실행 후 생성된 리소스의 중요한 정보를 출력하는 파일입니다.</li>
<li>예를 들어, 생성된 EC2의 Public IP, RDS 엔드포인트, ALB 주소 등을 출력하도록 설정할 수 있습니다.</li>
</ul>
<p><strong>[locals.tf](로컬 변수 정의)</strong></p>
<ul>
<li>locals 블록을 사용하여 반복적으로 사용되는 값이나 계산된 값을 정의하는 파일입니다.</li>
<li>자주 사용되는 값을 정의해놓고 사용하면 편리한 사용이 가능합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redis Insight 설치하기]]></title>
            <link>https://velog.io/@al_chive/Redis-Insight-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/Redis-Insight-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 Mar 2025 05:57:39 GMT</pubDate>
            <description><![CDATA[<h2 id="목적">목적</h2>
<ol>
<li>Redis의 상태를 직관적으로 모니터링하고 관리하기 위해 사용합니다.</li>
<li>Key-Value 데이터를 쉽게 조회하고, 데이터 변경 및 삭제 작업을 편리하게 수행하기 위해 활용됩니다.</li>
<li>성능 분석 및 최적화를 통해 Redis의 효율적인 운영을 지원합니다.</li>
</ol>
<h2 id="redis-insight를-사용하는-이유">Redis Insight를 사용하는 이유</h2>
<ol>
<li>GUI 기반 도구로 CLI 없이도 Redis 데이터를 쉽게 탐색하고 관리할 수 있습니다.</li>
<li>실시간으로 Redis 성능 지표를 확인하고 문제를 빠르게 진단할 수 있습니다.</li>
<li>복잡한 명령어 없이도 데이터 시각화 및 성능 튜닝이 가능하여 운영 효율성을 높입니다.</li>
</ol>
<br>

<hr>
<h2 id="1redis-insight-설치하기">1.Redis Insight 설치하기</h2>
<p>Redis 모니터링을 위한 UI 툴인 Redis Insight를 설치합니다.</p>
<h3 id="11-redis-insight-yaml-파일-작성하기">1.1 Redis Insight yaml 파일 작성하기</h3>
<p>저는 테스트이기 때문에 퍼블릭 이미지를 가져와서 작업했습니다.
그리고 IP는 0.0.0.0으로 설정하여 외부 어디에서건 접근 가능하도록 설정했습니다.
추후 고도화 시에 IP를 제한하는 작업을 하려 합니다.</p>
<pre><code>  # redis-insight-deployment.yaml

  namespace: redis
  name: redis-insight
  labels:
    app: redis-insight
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-insight
  template:
    metadata:
      labels:
        app: redis-insight
    spec:
      containers:
        - name: redis-insight
          image: redislabs/redisinsight:latest
          ports:
            - containerPort: 5540
          env:
            - name: RI_APP_HOST
              value: &quot;0.0.0.0&quot;
            - name: RI_APP_PORT
              value: &quot;5540&quot;
      imagePullSecrets:
        - name: regcred
---
apiVersion: v1
kind: Service
metadata:
  name: redis-insight-service
  namespace: redis
spec:
  selector:
    app: redis-insight
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5540
  type: ClusterIP
</code></pre><h3 id="12-redis-insight-yaml-배포하기">1.2 Redis Insight yaml 배포하기</h3>
<p>yaml 파일을 만들었으니 배포해야죠!</p>
<pre><code>kubectl apply -f redis-insight-deployment.yaml</code></pre><h3 id="13-redis-insight-pod-정상-확인">1.3 Redis Insight Pod 정상 확인</h3>
<p>아래 이미지와 같이 redis Namespace 대상을 설치가 됐다면 redis-insight 설치는 완료되었습니다.
<img src="https://velog.velcdn.com/images/al_chive/post/44c08c35-1478-4fb3-a49b-2473e937c04d/image.png" alt=""></p>
<br>

<hr>
<h2 id="2-ingress-alb와-연결하기">2. Ingress ALB와 연결하기</h2>
<p>Redis Insight를 외부에서 접근하기 위해서는 Public한 자원에 올리던지, Ingress ALB를 통해 접근하던지 2가지의 방법이 있습니다. 저는 Private한 자원에 설치 했기 때문에 Ingress ALB를 통한 접근이 필요합니다.</p>
<h3 id="21-ingress-리소스-생성">2.1 Ingress 리소스 생성</h3>
<p>저는 간단한 테스트를 위해 80포트로만 통신할 예정이라 80 포트를 사용하는 yaml 파일을 작성했습니다. ALB_DNS_Name에 EKS Ingress ALB의 DNS Name을 넣어줍니다.</p>
<pre><code># redis-insight-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: redis
  name: redis-insight-ingress
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: &#39;[{&quot;HTTP&quot;: 80}]&#39;
spec:
  rules:
    - host: &lt;ALB_DNS_Name&gt;
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: redis-insight-service
                port:
                  number: 5540
</code></pre><h3 id="22-ingress-yaml-파일-배포">2.2 Ingress yaml 파일 배포</h3>
<pre><code>kubectl apply -f redis-insight-ingress.yaml</code></pre><h3 id="23-alb-주소-확인">2.3 ALB 주소 확인</h3>
<p>정상적으로 배포되었는지 확인하고 마무리합니다.</p>
<pre><code>kubectl get ingress -n redis</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/93e90c6f-52e4-4e7d-8399-91270d6c7a18/image.png" alt=""></p>
<h2 id="3-도메인을-통한-ui-접속">3. 도메인을 통한 UI 접속</h2>
<p>ALB 도메인을 통해 Redis Insight 접속을 시도해봅니다.</p>
<h3 id="31-target-group-생성">3.1 Target Group 생성</h3>
<p>아래 옵션을 선택하여 TG을 생성합니다.</p>
<ul>
<li>IP Addresses 선택</li>
<li>HTTP</li>
<li>5440</li>
<li>EKS와 동일한 VPC</li>
</ul>
<h3 id="32-target-연결">3.2 Target 연결</h3>
<p>Target IP를 연결할 때는 EKS의 노드가 아닌 POD의 IP를 연결해줘야합니다.
-o wide 명령어를 통해 POD IP를 알아냅니다. Register하면 끝!</p>
<pre><code>kubectl get po -n redis -o wide</code></pre><blockquote>
<p><img src="https://velog.velcdn.com/images/al_chive/post/1cd90316-7887-4704-94a1-e65438a72967/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/al_chive/post/53f6ba16-a8cc-4190-a6d9-40bb9d912f43/image.png" alt=""></p>
<h3 id="33-alb에-tg-붙이기">3.3 ALB에 TG 붙이기</h3>
<p>아래 이미지와 같이 특정 도메인을 붙여 복잡한 DNS Name으로 접근 하는 것이 아닌 지정한 도메인을 통한 접근이 되게 합니다.
<img src="https://velog.velcdn.com/images/al_chive/post/fa43c35b-83d7-47f6-af66-0ee8fa7fed8c/image.png" alt=""></p>
<br>

<hr>
<h2 id="redis-insight-ui-접속">Redis Insight UI 접속</h2>
<p>완료!!! Redis-insight 도메인으로 접속 시에 정상 통신 되는 것을 확인 합니다.
제가 설치에 대한 부분만 넣고 ALB, EKS 방화벽에 대한 부분은 생략하였는데요.
<img src="https://velog.velcdn.com/images/al_chive/post/84ee6284-738f-481e-bae6-9843c4dca5b1/image.png" alt=""></p>
<p>포트별 흐름을 간단히 정리해봤습니다. 상세 내용은 아래 설명을 읽어주세요.
<strong>사용자 → ALB(80) → EKS (5540) → Kafka (5540)</strong></p>
<blockquote>
<p><strong>사용자 (80)</strong>
사용자가 웹 브라우저나 HTTP 클라이언트를 통해 포트 80을 사용하여 접속합니다.
이때 사용자가 접속하는 도메인(예: redis-ui.example.com)을 통해 ALB로 요청이 전달됩니다.
** ALB (80)**
ALB(AWS Application Load Balancer)는 외부에서 들어오는 트래픽을 받아서, 내부 EKS 클러스터로 전달합니다.
ALB는 80번 포트로 요청을 받아서, EKS에 설정된 Ingress 리소스를 통해 redis-insight-service로 요청을 포워딩합니다.
<strong>EKS (5540)</strong>
EKS에서 Ingress Controller가 ALB로부터 받은 요청을 처리하고, 해당 요청을 redis-insight-service로 전달합니다. redis-insight-service는 내부에서 5540번 포트를 사용하고, ALB는 80번 포트로 외부와 통신하므로, ALB는 요청을 80번 포트로 받고, EKS의 서비스는 5540번 포트로 처리합니다.
<strong>RedisInsight Pod (5540)</strong>
redis-insight-service는 5540번 포트에서 Redis Insight UI를 제공하고 있습니다.
EKS에서 서비스가 해당 포트를 사용하여 Redis와 연결된 UI 서비스를 제공하고, 데이터를 처리합니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kafka UI 설치하기]]></title>
            <link>https://velog.io/@al_chive/Kafka-UI-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/Kafka-UI-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 27 Mar 2025 09:17:38 GMT</pubDate>
            <description><![CDATA[<h2 id="목적">목적</h2>
<p>이 페이지에서는 Amazon EKS(Amazon Elastic Kubernetes Service) 환경에 Kafka UI를 설치하는 방법에 대해 자세히 다룹니다. EKS 클러스터에 Kafka UI를 설치하고, 이를 통해 Kafka 클러스터의 상태를 쉽게 조회하고 관리할 수 있도록 합니다. </p>
<h2 id="kafka-ui를-사용하는-이유">Kafka UI를 사용하는 이유</h2>
<p> Kafka UI는 Kafka 클러스터를 관리하고 모니터링할 수 있는 강력한 웹 기반 도구로, Kafka 브로커, 토픽, 파티션 등 다양한 리소스를 직관적으로 관리할 수 있게 해줍니다. Kafka를 운영하는 데 있어, 명령줄 인터페이스(CLI)만으로는 부족한 경우가 많습니다. 이 때 Kafka UI를 활용하면 관리가 훨씬 수월해지고, 실시간 모니터링도 가능해집니다.</p>
<br>

<hr>
<h2 id="1-loadbalancer-controller-설치">1. LoadBalancer Controller 설치</h2>
<p>외부에서 접속 시에 Ingress ALB를 통한 접속이 필요하기 때문에 LoadBalancer Controller Add-on 설치가 필요합니다.</p>
<h3 id="11-aws-loadbalancer-controller-iam-policy-다운로드">1.1 AWS LoadBalancer Controller IAM Policy 다운로드</h3>
<pre><code>curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json</code></pre><h3 id="12-iam-policy-생성">1.2 IAM Policy 생성</h3>
<p>저는 SSO를 통해 인증/접근하기 때문에 --profile 부분을 추가했습니다.</p>
<pre><code>aws iam create-policy \
    -- profile &lt;SSO Profile name&gt;
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json</code></pre><h3 id="13-service-account-생성">1.3 Service Account 생성</h3>
<p>profile, cluster_name,policy_arn 부분을 수정해줍니다.</p>
<pre><code>eksctl create iamserviceaccount \
  --cluster=&lt;cluster_name&gt; \
  --region=&lt;AWS_Region&gt; \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --attach-policy-arn=&lt;policy_arn&gt; \
  --approve</code></pre><h3 id="14-eks-chart-helm-리포지토리-추가">1.4 EKS Chart Helm 리포지토리 추가</h3>
<pre><code>helm repo add eks https://aws.github.io/eks-charts</code></pre><h3 id="15-로컬-리포지토리-업데이트">1.5 로컬 리포지토리 업데이트</h3>
<pre><code>helm repo update eks</code></pre><h3 id="16-loadbalancer-controller-버전-확인">1.6 LoadBalancer Controller 버전 확인</h3>
<p>helm을 통해 LB 컨트롤러 설치 시에는 CHART 버전 확인이 필수 입니다.
APP Version이 아닌** CHART Version**을 기억해야합니다.</p>
<pre><code>helm search repo eks/aws-load-balancer-controller --versions</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/973469f7-2ad9-4a9e-ac84-0460c7e684c7/image.png" alt=""></p>
<h3 id="17-loadbalancer-controller-설치">1.7 LoadBalancer Controller 설치</h3>
<pre><code>helm install aws-load-balancer-controller eks/aws-load-balancer-controller 
--version &lt;CHART_Version&gt; -n kube-system \
--set clusterName=&lt;Cluster_Name&gt; \
--set vpcId=&lt;VPC_DI&gt; \
--set region=&lt;AWS_Region&gt; \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set enableShield=false \
--set enableWaf=false \
--set enableWafv2=false \
--set createIngressClassResource=true \
--set ingressClass=alb</code></pre><h3 id="18-설치-확인하기">1.8 설치 확인하기</h3>
<p>LoadBalancer가 제대로 설치되었는지 확인하고 마무리합니다.
많이 한 것 같은데 아직 멀었습니다.. Kakfa-UI는 설치도 하지 못했네요 :&lt;</p>
<pre><code>kubectl get po -n kube-system</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/ff645248-50a6-44ac-8e66-a0392db3bb7f/image.png" alt=""></p>
<br>

<hr>
<h2 id="2-kafka-ui-설치하기">2. Kafka UI 설치하기</h2>
<p>이 페이지에서는 Yaml 파일을 통한 Kafka UI 설치를 해보겠습니다.
Helm을 통한 설치도 있지만 저는 오류가 너무 많이 나서... Yaml 파일을 통한 설치로 노선을 변경했습니다!</p>
<h3 id="21-kafka-ui-yaml-파일-작성하기">2.1 Kafka UI Yaml 파일 작성하기</h3>
<p>저는 Public 이미지를 가져오도록 설정했습니다. Private 이미지를 써야하는 분들은 &quot;image&quot; 부분을 Private 이미지로 수정해주시면 됩니다.</p>
<pre><code># kafka-ui-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-ui
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka-ui
  template:
    metadata:
      labels:
        app: kafka-ui
    spec:
      containers:
        - name: kafka-ui
          image: provectuslabs/kafka-ui:latest
          ports:
            - containerPort: 8080
          env:
            - name: KAFKA_CLUSTERS_0_NAME
              value: &quot;local&quot;
            - name: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS
              value: &quot;&lt;BootStrap Endpoint:9092&gt;&quot;
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-ui
  namespace: kafka
spec:
  selector:
    app: kafka-ui
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
</code></pre><h3 id="22-kafka-ui-배포">2.2 Kafka UI 배포</h3>
<pre><code>kubectl apply -f kafka-ui-deployment.yaml</code></pre><h3 id="23-kafka-ui-pod-정상-확인">2.3 Kafka UI Pod 정상 확인</h3>
<p>아래 이미지와 같이 Kafka namespace 대상으로 설치가 됐다면 Kafka 설치는 완료되었습니다.
<img src="https://velog.velcdn.com/images/al_chive/post/b62f7f8a-c7ba-4bca-9bbf-7f4b94517685/image.png" alt=""></p>
<br>

<hr>
<h2 id="3-ingress-alb와-연결하기">3. Ingress ALB와 연결하기</h2>
<p>Kafka-UI를 외부에서 접근하기 위해서는 Public한 자원에 올리던지, Ingress ALB를 통해 접근하던지 2가지의 방법이 있습니다. 저는 Private한 자원에 설치를 했기 때문에 Ingress ALB를 통한 접근이 필요합니다.</p>
<h3 id="31-서브넷-태깅하기">3.1 서브넷 태깅하기</h3>
<p>EKS(Amazon Elastic Kubernetes Service)에서 ALB(Application Load Balancer)를 자동으로 생성하고 관리할 수 있도록 서브넷을 태깅해야 합니다.
EKS에 할당 된 서브넷 대상으로 kubernetes.io/role/elb TAG가 붙어있는지 확인해야합니다.</p>
<pre><code>aws ec2 describe-subnets --filters &quot;Name=vpc-id,Values=&lt;VPC_ID&gt;&quot;</code></pre><p>해당 태그가 없다면 붙여줍니다. Subnet ID는 EKS에 할당되어있는 서브넷 모두 적용시켜줍니다.</p>
<pre><code>aws ec2 create-tags --resources &lt;Subnet_ID&gt; --tags Key=kubernetes.io/role/elb,Value=1
</code></pre><h3 id="32-ingress-리소스-생성">3.2 Ingress 리소스 생성</h3>
<p>저는 간단한 테스트를 위해 80포트로만 통신할 예정이라 80 포트를 사용하는 yaml 파일을 작성했습니다. ALB_DNS_Name에 EKS Ingress ALB의 DNS Name을 넣어줍니다.</p>
<pre><code># kafka-ui-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kafka-ui-ingress
  namespace: kafka
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: &#39;[{&quot;HTTP&quot;: 80}]&#39;
    alb.ingress.kubernetes.io/group.name: kafka-ui-ingress-group
spec:
  ingressClassName: alb
  rules:
    - host: &lt;ALB_DNS_Name&gt;
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kafka-ui
                port:
                  number: 80
</code></pre><h3 id="33-ingress-yaml-파일-배포">3.3 Ingress Yaml 파일 배포</h3>
<pre><code>kubectl apply -f kafka-ui-ingress.yaml</code></pre><h3 id="34-alb-주소-확인">3.4 ALB 주소 확인</h3>
<p>정상적으로 배포되었는지 확인하고 마무리합니다.</p>
<pre><code>kubectl get ingress -n kafka
</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/032fc432-961f-4a30-ac82-12a6eee024a0/image.png" alt=""></p>
<br>

<hr>
<h2 id="4-도메인을-통한-ui-접속">4. 도메인을 통한 UI 접속</h2>
<p>ALB 도메인을 통해 Kafka UI 접속을 시도해봅니다.</p>
<h3 id="41-target-group-생성">4.1 Target Group 생성</h3>
<p>아래 옵션을 선택하여 TG을 생성합니다. </p>
<ul>
<li>IP Addresses 선택</li>
<li>HTTP</li>
<li>8080</li>
<li>EKS와 동일한 VPC</li>
</ul>
<h3 id="42-target-연결">4.2 Target 연결</h3>
<p>Target IP를 연결할 때는 EKS의 노드가 아닌 POD의 IP를 연결해줘야합니다.
-o wide 명령어를 통해 POD IP를 알아냅니다. Register하면 끝!</p>
<pre><code>kubectl get po -n kafka -o wide</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/73de33ca-9912-4690-bd44-6eef79ee281a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/al_chive/post/93a648cf-a72f-4e94-8c72-f293bf672c6c/image.png" alt=""></p>
<h3 id="43-alb에-tg-붙이기">4.3 ALB에 TG 붙이기</h3>
<p>아래 이미지와 같이 특정 도메인을 붙여 복잡한 DNS Name으로 접근 하는 것이 아닌 지정한 도메인을 통한 접근이 되게 합니다.
<img src="https://velog.velcdn.com/images/al_chive/post/7b14f952-85f9-4e79-8b01-f3227ee128e1/image.png" alt="">
<br></p>
<hr>
<h2 id="kafka-ui-접속">Kafka UI 접속</h2>
<p>진짜 완료!!! kafka-ui 도메인으로 접속 시에 정상 통신 되는 것 확인 합니다.
제가 설치에 대한 부분만 넣고 ALB, EKS 방화벽에 대한 부분은 생략하였는데요.</p>
<p><img src="https://velog.velcdn.com/images/al_chive/post/9a483fd5-e426-4206-a43b-3cdb497fa3b4/image.png" alt=""></p>
<p>포트별 흐름을 정리해봤습니다. 상세 내용은 아래 설명을 읽어주세요.</p>
<p><strong>사용자 → ALB(80) → EKS (8080) → Kafka (8080)</strong></p>
<blockquote>
</blockquote>
<p><strong>사용자 (80):</strong> 사용자가 웹 브라우저나 다른 HTTP 클라이언트를 통해 포트 80을 사용하여 접속합니다. 이 때 사용자가 접속하는 도메인(예: kafka-ui.example.com)을 통해 ALB로 요청이 전달됩니다.</p>
<blockquote>
<p><strong>ALB (80):</strong> ALB(AWS Application Load Balancer)는 외부에서 들어오는 트래픽을 받아서, 요청을 내부 EKS 클러스터로 전달합니다. ALB는 80번 포트로 요청을 받아서, EKS에 설정된 Ingress 리소스를 통해 해당 서비스로 요청을 포워딩합니다.
<strong>EKS (8080):</strong> EKS에서 Ingress Controller가 ALB로부터 받은 요청을 처리하고, 해당 요청을 kafka-ui-service로 전달합니다. 이 서비스는 내부에서 8080번 포트를 사용하고, ALB는 80번 포트로 외부와 통신하므로, ALB는 요청을 80번 포트로 받고, EKS의 서비스는 8080번 포트로 처리합니다.
<strong>Kafka (8080):</strong> kafka-ui-service는 8080번 포트에서 Kafka UI를 제공하고 있습니다. EKS에서 서비스가 해당 포트를 사용하여 Kafka와 연결된 서비스를 통해 UI를 제공하고 데이터를 처리합니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[API Gateway 쉽게 이해하기 (기초)]]></title>
            <link>https://velog.io/@al_chive/API-Gateway-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@al_chive/API-Gateway-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Wed, 12 Mar 2025 09:18:56 GMT</pubDate>
            <description><![CDATA[<p>알다가도 모르겠는 API Gateway에 대해서 쉽고 간단하게 알아보자!!!</p>
<h2 id="api-gateway란">API Gateway란?</h2>
<p>클라이언트와 백엔드 서비스 사이에서 API 요청을 관리하고 라우팅하는 역할을 하는 서비스이다.</p>
<p>간단히 비유를 들어서 설명하자면 API G/W는 음식점의 홀서빙 담당자라고 생각하면 이해가 쉽다.
고객의 요청을 받고, 그에 적합한 주문을 주방으로 전달해주고 음식이 완성되면 고객한테 완성된 음식을 전달해주는 역할을 한다.</p>
<p align="center">
  <img src="https://velog.velcdn.com/images/al_chive/post/ac80dbcf-991b-4bc7-98f5-92adfdfae2f0/image.png" width=500 height=500>
</p>


<h3 id="aws-api-gateway의-종류">AWS API Gateway의 종류</h3>
<p>AWS API G/W 에는 3가지의 종류가 있다. 이 3개의 API Gateway에 대해서 알아보도록 하자 쉽게!!</p>
<ol>
<li><p>RESTful API</p>
</li>
<li><p>WebSocket API</p>
</li>
<li><p>HTTP API</p>
</li>
</ol>
</br>

<h2 id="1-restful-api">1. RESTful API</h2>
<p>REST는 &quot;<strong>Re</strong>presentational <strong>S</strong>tate <strong>T</strong>ransfer&quot; 의 약어로 이를 이해하기 위해서는 <strong>HTTP Method</strong>에 대해서 이해를 하고 있어야 한다.  RESTful API는 HTTP Method를 사용하여 리소스에 접근하고 상태 변경 및 조회한다.</p>
<h3 id="http-method">HTTP Method</h3>
<p>HTTP 메소드는 클라이언트와 서버 간의 요청-응답에서 어떤 작업을 수행할 것인지 명시하는 HTTP 프로토콜의 동작을 정의한다.</p>
<ul>
<li><strong>GET</strong> : 데이터 조회</li>
<li><strong>POST</strong> : 데이터 생성</li>
<li><strong>PUT</strong> : 데이터 수정</li>
<li><strong>DELETE</strong> : 데이터 삭제</li>
</ul>
<p>위 Method를 사용하여 요청을 보내게 되고 이에 맞는 작업을 수행하게 된다.</p>
<h4 id="예시">예시)</h4>
<blockquote>
<p>GET /Users : 사용자 목록을 조회
POST /Users : 새로운 사용자 생성
PUT /users/123 : ID가 123인 사용자의 정보를 수정
DELETE /Users/123 : ID가 123인 사용자를 삭제</p>
</blockquote>
<h3 id="특징">특징</h3>
<ul>
<li>확장성을 요구하는 MSA(Micro Service Architecture) 환경에서 많이 사용된다.</li>
<li>데이터 조회/수정/삭제 등의 기본적인 CRUD 작업을 할 때 유용하다.</li>
<li>웹 및 모바일 애플리케이션에서 데이터 교환에 많이 사용한다.</li>
<li>요청-응답 방식: 클라이언트가 서버로 요청을 보내면 서버는 응답을 반환합니다. 이 과정이 단방향(one-way)이다.</li>
</ul>
</br>

<h2 id="2-websocket-api">2. WebSocket API</h2>
<p>WebSocket은 양방향 통신을 지원하는 프로토콜로, 실시간 애플리케이션에서 주로 사용된다.</p>
<h3 id="특징-1">특징</h3>
<ul>
<li><strong>양방향 통신</strong>
: 클라이언트와 서버 간에 실시간으로 양방향 통신이 가능하다.</li>
<li><strong>지속적인 연결</strong> 
: 연결을 한 번만 설정하면 지속적으로 데이터를 주고 받을 수 있어, 상태 유지가 가능하다.</li>
<li><strong>낮은 지연 시간</strong>
: 데이터를 실시간으로 주고 받기 때문에 빠르고 효율적이다.</li>
<li><strong>메시지 기반</strong>
: 메시지 단위로 데이터를 전송하며, 요청-응답 방식이 아니다.</li>
</ul>
<h3 id="예시-1">예시</h3>
<p>실시간 채팅 애플리케이션에서 사용자가 메시지를 보내면 서버가 즉시 응답을 반환하고, 서버가 다른 사용자의 메시지를 실시간으로 푸시한다. 또한 온라인 게임에서 실시간으로 플레이어 간 상호작용을 처리한다.</p>
<p align="center">
  <img src="https://velog.velcdn.com/images/al_chive/post/ec9ddefe-61d3-4c8d-9d1e-6f79ca62d3a2/image.png" width=500 height=500>

</br>

<h2 id="3-http-api">3. HTTP API</h2>
<p>HTTP API는 HTTP 프로토콜을 사용하여 데이터를 주고받는 API를 의미한다.
RESTful 방식의 복잡한 작업 방식이 아닌, 단순한 요청/응답 처리 시에 사용 되는 API 이다.</p>
<h3 id="사용하는-이유">사용하는 이유</h3>
<ul>
<li><strong>단순한 API 설계</strong>
: HTTPS API는 HTTPS 프로토콜을 기반으로 하며, 매우 직관적이고 구현하기 쉽다. </li>
<li><strong>RESTful 설계가 필요 없을 때</strong>
: RESTful 설계가 필요 없는 단순한 요청/응답 처리가 필요할 때 유리하다.</li>
<li><strong>웹서버와의 연동</strong>
: 웹 서버나 프록시 서버와의 연동에서 사용한다. HTTP 프로토콜만으로도 충분한 통신이 가능하다.</li>
</ul>
</br>

<h2 id="최종-정리">최종 정리</h2>
<table>
<thead>
<tr>
<th align="center">구분</th>
<th align="center">RESTful API</th>
<th align="center">WebSocket API</th>
<th align="center">HTTP API</th>
</tr>
</thead>
<tbody><tr>
<td align="center">통신 방식</td>
<td align="center">단방향 요청-응답 방식</td>
<td align="center">양방향 실시간 통신</td>
<td align="center">단방향 요청-응답 방식 (RESTful 포함)</td>
</tr>
<tr>
<td align="center">연결 유지</td>
<td align="center">연결이 각 요청마다 새로 생성</td>
<td align="center">지속적인 연결 (오픈된 채널을 통해 데이터 전송)</td>
<td align="center">연결이 매 요청마다 새로 생성</td>
</tr>
<tr>
<td align="center">응답 방식</td>
<td align="center">서버가 요청에 대한 응답을 반환</td>
<td align="center">실시간으로 데이터를 주고받을 수 있음</td>
<td align="center">서버가 요청에 대한 응답을 반환</td>
</tr>
<tr>
<td align="center">용도</td>
<td align="center">CRUD 작업에 적합, 웹/모바일 앱의 데이터 교환</td>
<td align="center">실시간 데이터 전송이 필요한 시스템 (예: 채팅, 게임)</td>
<td align="center">단순한 요청-응답을 통한 데이터 교환</td>
</tr>
<tr>
<td align="center">장점</td>
<td align="center">표준화된 설계, 클라이언트-서버 간 명확한 역할 분담</td>
<td align="center">실시간 데이터 처리, 빠르고 효율적인 양방향 통신</td>
<td align="center">간단한 설계와 구현, 다양한 서비스에 활용 가능</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[로컬에서 Github로 코드 Push하기]]></title>
            <link>https://velog.io/@al_chive/%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-Github%EB%A1%9C-%EC%BD%94%EB%93%9C-Push%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C-Github%EB%A1%9C-%EC%BD%94%EB%93%9C-Push%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 11 Mar 2025 07:49:43 GMT</pubDate>
            <description><![CDATA[<p>여기서는 Local PC &gt; Github로 코드를 Push 하기 위한 권한 및 절차를 정리한다.
HTTPS 방식을 통한 코드 푸시 방법을 알아보도록 한다.</p>
<h2 id="권한-설정-방식">권한 설정 방식</h2>
<ol>
<li>HTTPS 방식 (Github 계정과 Personal Access Token 사용)</li>
<li>SSH 방식 (SSH 키를 생성하여 등록)</li>
</ol>
<h2 id="personal-access-tokenpat-생성">Personal Access Token(PAT) 생성</h2>
<h3 id="1-github-로그인-후--developer-settings">1. Github 로그인 후 &gt; Developer Settings</h3>
<p><img src="https://velog.velcdn.com/images/al_chive/post/dea648f4-8848-4826-8191-284d360b0cd2/image.png" alt=""></p>
<h3 id="2-personal-access-tokens--tokensclassic">2. Personal access tokens &gt; Tokens(classic)</h3>
<h4 id="권한">[권한]</h4>
<ul>
<li>repo(모든 리포지토리 권한)</li>
<li>workflow (GitHub Actions 사용 시)</li>
<li>write:packages(패키지 푸시 시)
<img src="https://velog.velcdn.com/images/al_chive/post/4b5dc02c-acd4-4915-a8b6-2b7f54ab3a19/image.png" alt=""></li>
</ul>
<p><span style="color: red">** 생성된 Token은 복사해서 저장한다. 다시 볼 수 없으니 잘 저장해놓기**</span></p>
<h2 id="기존-자격증명-삭제하기window">기존 자격증명 삭제하기(Window)</h2>
<p>기존에 등록되어 있는 자격증명이 있는 경우 git push가 되지 않았다.
아래 그림과 같이 접속해서, 필요없는 git 자격증명을 삭제해주면 된다.
<img src="https://velog.velcdn.com/images/al_chive/post/fa4ab019-f751-44bd-83de-a6c7873a43a3/image.png" alt=""></p>
<h3 id="1-현재-git-상태-확인">1. 현재 Git 상태 확인</h3>
<p>먼저, 로컬과 원격 저장소의 상태를 확인</p>
<pre><code>git remote -v</code></pre><h3 id="2-원격-저장소origin가-잘못된-경우">2. 원격 저장소(origin)가 잘못된 경우</h3>
<pre><code>git remote remove origin
git remote add origin https://github.com/YOUR_USERNAME/YOUR_REPOSITORY.git</code></pre><h3 id="3-깃으로-코드-올리기">3. 깃으로 코드 올리기</h3>
<pre><code>git push origin main</code></pre><h3 id="4-강제로-푸시해야-하는-경우">4. 강제로 푸시해야 하는 경우</h3>
<p>강제 푸시는 위 최후의 보루!</p>
<pre><code>git push --force origin main</code></pre><p><span style="color: red"><strong>그럼에도 발생한 에러..</strong>.</span></p>
<blockquote>
<p>git push origin main
warning: ----------------- SECURITY WARNING ----------------
warning: | TLS certificate verification has been disabled! |
warning: ---------------------------------------------------
warning: HTTPS connections may not be secure. See <a href="https://aka.ms/gcm/tlsverify">https://aka.ms/gcm/tlsverify</a> for more information.
To <a href="https://github.com/clouderling/amplify-repo.git">https://github.com/clouderling/amplify-repo.git</a>
 ! [rejected]        main -&gt; main (fetch first)
error: failed to push some refs to &#39;<a href="https://github.com/clouderling/amplify-repo.git&#39;">https://github.com/clouderling/amplify-repo.git&#39;</a>
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., &#39;git pull ...&#39;) before pushing again.
hint: See the &#39;Note about fast-forwards&#39; in &#39;git push --help&#39; for details.</p>
</blockquote>
<h2 id="해결-방법">해결 방법</h2>
<h3 id="1-tls-인증서-검증-활성화-보안-강화">1. TLS 인증서 검증 활성화 (보안 강화)</h3>
<pre><code>git config --global http.sslVerify true</code></pre><h3 id="2-원격-저장소와-로컬-저장소-동기화">2. 원격 저장소와 로컬 저장소 동기화</h3>
<pre><code>git pull --rebase origin main</code></pre><h2 id="결과">결과</h2>
<p><img src="https://velog.velcdn.com/images/al_chive/post/7eab40a1-71e1-4d93-b12f-8daa6b82c552/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS Direct Connect 연동하기]]></title>
            <link>https://velog.io/@al_chive/AWS-Direct-Connect-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@al_chive/AWS-Direct-Connect-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 17 Jan 2024 04:54:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>AWS Direct Connect를 사용하고 있는 환경이며, 
동일 랜딩존에 신규 Account가 생성 되었을 때 기존 AWS Direct Connect에 연결하기 위한 실습입니다.  </p>
<br>

<h3 id="direct-connect-정보-확인">Direct Connect 정보 확인</h3>
<p>KINX/LG - 메인/백업 회선의 역할이며 1G로 이중화 되어 연결 되어 있다.
<img src="https://velog.velcdn.com/images/al_chive/post/bfd4fe41-3f72-4af8-ab7b-234a2adcf0cb/image.png" alt=""></p>
<br>

<h3 id="aws-resource-access-managerram를-통해-account-공유">AWS Resource Access Manager(RAM)를 통해 Account 공유</h3>
<p>DX의 TGW를 Shared resources로 선택하고 이에 필요한 Managed Permission을 할당해주었다.
Shared principals 에서 공유하고자 하는 신규 Account Number를 추가해주면 된다.</p>
<details>
<summary>Managed Permission 상세</summary>
<div markdown="1">

<p><img src="https://velog.velcdn.com/images/al_chive/post/2f3596d0-6d97-4ba5-b7a0-92d1ff98bbfc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/al_chive/post/0e42b82c-afca-4b67-b889-00a7fb70c568/image.png" alt=""></p>
</div>
</details>

<p><img src="https://velog.velcdn.com/images/al_chive/post/43cdc759-99d9-4788-87af-80e3ef1e714d/image.png" alt=""></p>
<h4 id="공유-된-자원-신규-account에서-확인">공유 된 자원 신규 Account에서 확인</h4>
<p>공유 된 자원은 RAM에서 확인 가능하다.
<img src="https://velog.velcdn.com/images/al_chive/post/f7039dbb-34c9-4007-9831-40dbfdaf420e/image.png" alt=""></p>
<br>

<h3 id="transit-gw-attachment-생성">Transit G/W Attachment 생성</h3>
<p>공유된 TGW를 대상으로 Attachment를 만듭니다. 
TGW Attachment를 붙일 서브넷을 지정해주는데요. 해당 서브넷은 TGW가 위치할 서브넷입니다.
<img src="https://velog.velcdn.com/images/al_chive/post/e810d41d-048f-4fe6-b205-3bf3399439fe/image.png" alt=""></p>
<br>

<h3 id="신규-account의-route-table-추가">신규 Account의 Route table 추가</h3>
<p>새로 붙인 TGW를 타고 통신할 대상을 추가해주면 됩니다.
제가 추가한 1,2번 대역은 회사 데이터센터에서 광고 받고 있는 대역입니다. AWS &gt; 데이터센터로 TGW를 타고 트래픽이 흐를 수 있게 하기 위한 작업입니다.</p>
<p>(Private Subnet에는 모두 적용해주었습니다.)
<img src="https://velog.velcdn.com/images/al_chive/post/61b9c7a5-5e4b-4b27-ab1f-e2e117b5fd78/image.png" alt=""></p>
<br>

<h3 id="tgw-route-table-생성">TGW Route table 생성</h3>
<p>TGW의 Route table은 총 2개를 만들게 됩니다.</p>
<ul>
<li>Direct Connect 용 RT</li>
<li>신규 Account 용 RT</li>
</ul>
<p>제 계정은 이미 DX를 사용하고 있었기 때문에 DX RT은 만들어져 있습니다.</p>
<br>

<h4 id="direct-connect-용-rt-상세">Direct Connect 용 RT 상세</h4>
<p>Associations에는 DX GW를 붙여줍니다.
<img src="https://velog.velcdn.com/images/al_chive/post/1426a843-c074-4019-a21e-c384ca106696/image.png" alt="">
propagations에서는 전파된 VPC 목록과 DX G/W 목록을 확인할 수 있습니다.
(해당 대역들은 데이터센터에서 DX로 광고한 목록들 입니다.)
<img src="https://velog.velcdn.com/images/al_chive/post/98be7fd4-7cbc-4bdf-9833-5bc59f0d843d/image.png" alt=""></p>
<br>

<h4 id="신규-account-용-rt-생성">신규 Account 용 RT 생성</h4>
<p>DX-TGW를 대상으로 한 TGW RT을 생성합니다.</p>
<p><img src="https://velog.velcdn.com/images/al_chive/post/a1a296a9-799c-4d63-91ee-1e8518143249/image.png" alt=""></p>
<p>신규 RT에는 신규 Account의 VPC가 연결시켜 주고,
<img src="https://velog.velcdn.com/images/al_chive/post/5aca63c4-3aa8-44ce-8dd7-c97408bb3aac/image.png" alt=""></p>
<p>Propagation을 확인해보면 DX G/W가 전파되어 있을 것 입니다.
<img src="https://velog.velcdn.com/images/al_chive/post/fcbf7a05-56ea-4b40-8e92-4bd450ad5ae8/image.png" alt=""></p>
<br>


<h3 id="multi-account-간-통신-설정-option">Multi Account 간 통신 설정 (Option)</h3>
<p>해당 설정은 optional한 설정입니다.
저는 Account A와 Account B가 서로 통신이 되어야 했기 때문에 RT에 전파를 추가하였습니다.</p>
<pre><code> dev-rt에 prod attachment를 전파해주었습니다.
 dev 계정 &gt; prod 계정으로 통신이 되기 위함입니다. 다만, prod &gt; dev로는 통신이 되지 않는 단방향 설정입니다.</code></pre><p><img src="https://velog.velcdn.com/images/al_chive/post/ee9fdd9b-d24e-41da-bebe-460ff31e7f49/image.png" alt=""></p>
<br>


<h3 id="transit-gateway-associations-설정">Transit gateway associations 설정</h3>
<p>허용되는 접두사 목록에 통신할 VPC 대역을 추가합니다.
입력된 허용된 접두사는 같거나 더 작은 CIDR을 허용하는 필터 역할을 합니다.
<img src="https://velog.velcdn.com/images/al_chive/post/a9f955ff-1a57-4cf5-b6dd-57aa6947bdcc/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>