<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sanbon_8.log</title>
        <link>https://velog.io/</link>
        <description>Just Practice</description>
        <lastBuildDate>Wed, 24 Jul 2024 08:04:28 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. sanbon_8.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sanbon_8" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Jenkins 설치하기]]></title>
            <link>https://velog.io/@sanbon_8/InstallJenkins</link>
            <guid>https://velog.io/@sanbon_8/InstallJenkins</guid>
            <pubDate>Wed, 24 Jul 2024 08:04:28 GMT</pubDate>
            <description><![CDATA[<h1 id="architecture">Architecture<img src="https://velog.velcdn.com/images/sanbon_8/post/854b9db4-f8e8-499c-af92-65f602ae5470/image.png" alt=""></h1>
<h1 id="jenkins">Jenkins</h1>
<h2 id="jenkins-설치하기">Jenkins 설치하기</h2>
<h3 id="실습-환경">실습 환경</h3>
<blockquote>
<p><strong>Ncloud Server High-CPU c2-g2-h50</strong>
<strong>CPU</strong>: 2EA, <strong>Memory</strong>: 4GB, <strong>Disk</strong>: 50GB</p>
</blockquote>
<h3 id="java-17-설치">Java 17 설치</h3>
<blockquote>
<p>Jenkins는 Java 11이상에서 지원하지만 필자는 <strong>Spring Boot 3</strong>를 사용하여 Java 17로 설치한다</p>
</blockquote>
<pre><code class="language-shell">yum install -y java-17-openjdk-devel.x86_64

# java-17-openjdk.x86_64에 맞는 번호 선택
/usr/sbin/alternatives --config java

# java-17 환경 변수 추가
readlink -f $(which java)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-devel-17.0.9.0.9-2.el8_8.x86_64
source /etc/profile</code></pre>
<h3 id="jenkins-설치">Jenkins 설치</h3>
<pre><code class="language-shell">wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

yum install -y jenkins

# default port가 8080이므로 tomcat과 같은 VM을 사용한다면 겹치지 않도록 다른 포트번호를 주자
# 만약 실습과정에서 was 서버와 jenkins 서버를 분리해서 행할경우 생략해도 좋다
sed -i &#39;s/Environment=&quot;JENKINS_PORT=8080&quot;/Environment=&quot;JENKINS_PORT=18080&quot;/&#39; /usr/lib/systemd/system/jenkins.service

systemctl enable --now jenkins</code></pre>
<blockquote>
<p><span style="color:#e11d21;">주의사항</span>
<span style="color:#e11d21;"><del>rpm --import <a href="https://pkg.jenkins.io/redhat-stable/jenkins.io.key">https://pkg.jenkins.io/redhat-stable/jenkins.io.key</a></del></span>
해당 경로는 만료된 Key로 Jenkins 설치가 안되니 블로그 검색 시 유의하자</p>
</blockquote>
<h3 id="로그인-및-세팅">로그인 및 세팅</h3>
<h4 id="비밀번호-확인">비밀번호 확인</h4>
<pre><code class="language-shell">cat /var/lib/jenkins/secrets/initialAdminPassword</code></pre>
<h4 id="로그인">로그인<img src="https://velog.velcdn.com/images/sanbon_8/post/121f77bb-ac39-42d6-b718-c2de09d07b81/image.png" alt=""></h4>
<h4 id="install-suggested-plugins">Install Suggested plugins<img src="https://velog.velcdn.com/images/sanbon_8/post/6d6eef1d-455e-4334-8170-0607e7ea93c3/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/e1a5ab57-ca48-47d1-95ac-18ff3334195e/image.png" alt=""></h4>
<h4 id="create-user-skip">Create user Skip</h4>
<p>admin 계정을 사용할 것이므로 Skip한다<img src="https://velog.velcdn.com/images/sanbon_8/post/c717770e-691c-4181-8a9f-8351aa537fcc/image.png" alt=""></p>
<h4 id="접속한-url-입력">접속한 url 입력<img src="https://velog.velcdn.com/images/sanbon_8/post/61b3cda0-327b-4606-a81b-1b76cb8ad984/image.png" alt=""></h4>
<h4 id="설치-및-로그인-완료">설치 및 로그인 완료<img src="https://velog.velcdn.com/images/sanbon_8/post/b17bd21c-81ae-43ad-8979-856c7b6668df/image.png" alt=""></h4>
<h4 id="password-theme-timezone-변경선택">Password, Theme, Timezone 변경(선택)<img src="https://velog.velcdn.com/images/sanbon_8/post/cc942393-03f2-4f8b-b6cf-bc65727203c6/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/522f3ae1-621f-4b23-9618-c1b843bfedff/image.png" alt=""></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[GitLab 설치하기]]></title>
            <link>https://velog.io/@sanbon_8/InstallGitLab</link>
            <guid>https://velog.io/@sanbon_8/InstallGitLab</guid>
            <pubDate>Wed, 24 Jul 2024 07:43:22 GMT</pubDate>
            <description><![CDATA[<h1 id="architecture">Architecture<img src="https://velog.velcdn.com/images/sanbon_8/post/716711e9-158c-493e-9662-5e685e43f6c7/image.png" alt=""></h1>
<h1 id="gitlab">GitLab</h1>
<h2 id="gitlab-설치하기">GitLab 설치하기</h2>
<h3 id="실습-권장-사양">실습 권장 사양</h3>
<ul>
<li><strong>CPU</strong>: 2EA</li>
<li><strong>Memory</strong>: 8GB<h3 id="필수-종속성-설치">필수 종속성 설치</h3>
<pre><code class="language-shell">yum install -y openssh-server policycoreutils-python-utils python3-policycoreutils curl perl</code></pre>
<h3 id="gitlab-설치가-가능한-상태인지-확인-스크립트-실행">GitLab 설치가 가능한 상태인지 확인 스크립트 실행</h3>
<pre><code class="language-shell">curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash</code></pre>
<h3 id="gitlab-ce-설치">GitLab-CE 설치</h3>
<pre><code class="language-shell">EXTERNAL_URL=&quot;http://{server-IP}:8088&quot; yum install -y gitlab-ce</code></pre>
<h3 id="gitlab-root-비밀번호-확인">GitLab root 비밀번호 확인</h3>
<pre><code class="language-shell">cat /etc/gitlab/initial_root_password | grep Password:</code></pre>
<img src="https://velog.velcdn.com/images/sanbon_8/post/54b210d5-12ea-4938-adcf-d7145337a84d/image.png" alt=""><h3 id="gitlab-로그인">GitLab 로그인<img src="https://velog.velcdn.com/images/sanbon_8/post/6c3188f7-d49c-4955-b440-c8636efff21a/image.png" alt=""></h3>
<h4 id="gitlab-비밀번호-변경">GitLab 비밀번호 변경</h4>
<img src="https://velog.velcdn.com/images/sanbon_8/post/636285de-787a-4084-b77d-004c7d60fb23/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/70cd8871-26f9-41c3-9783-4dfb8cba0739/image.png" alt=""><h3 id="gitlab-project-생성">GitLab Project 생성<img src="https://velog.velcdn.com/images/sanbon_8/post/931da6a4-af16-4c54-9d96-25ba4b32f06a/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/99b00a3e-f214-45f7-99de-9e497153c853/image.png" alt=""></h3>
<blockquote>
<p>Git Lab 세팅 완료 후 Git Hub Repository와 똑같은 방식으로 사용하면 된다</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Kubernetes]]></title>
            <link>https://velog.io/@sanbon_8/Kubernetes</link>
            <guid>https://velog.io/@sanbon_8/Kubernetes</guid>
            <pubDate>Thu, 11 Apr 2024 07:00:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sanbon_8/post/e2c17ba1-27e6-462b-b9ce-badba9c91b78/image.png" alt=""></p>
<h1 id="아키텍처">아키텍처</h1>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/ca5936a0-126d-4dc6-9240-97cb978f0895/image.png" alt=""></p>
<hr>
<h1 id="kubernetes-cluster-및-아키텍처-구축">Kubernetes cluster 및 아키텍처 구축</h1>
<h2 id="공통">공통</h2>
<h3 id="1-준비">1. 준비</h3>
<ol>
<li>머신 성능
  [최소 성능]
  RAM: 2GB
  CPU: 2 Core<br></li>
<li>인스턴스 준비
  [최소 개수]
  Master Node: 1
  Worker Node: 2<br></li>
<li>Registry, Redis, MariaDB 준비<ol>
<li>Docker Registry
   <img src="https://velog.velcdn.com/images/sanbon_8/post/71e5a79c-326d-4d24-9ab9-74b12d957e64/image.png" alt="">            <img src="https://velog.velcdn.com/images/sanbon_8/post/35af0446-0f74-4de4-aedd-e594be4f005a/image.png" alt="">        </li>
<li>Redis
   <img src="https://velog.velcdn.com/images/sanbon_8/post/7a56e454-17fd-4016-bb2f-1383238db895/image.png" alt="">            <span style="color:#e11d21;"><strong><code>!!! 만약 redis 서버가 netstat -nlpt 에서 127.0.0.1:6379로 바인딩 돼있으면 외부통신이 불가하므로</code></strong></span>
   <span style="color:#e11d21;"><strong><code>/etc/redis.conf 파일에서  bind 0.0.0.0으로 수정하고 restart 해주자</code></strong></span></li>
<li>MariaDB
   <img src="https://velog.velcdn.com/images/sanbon_8/post/2ed083db-4684-4c5b-85ea-0c28f3e47370/image.png" alt=""></li>
</ol>
</li>
</ol>
<h3 id="2-리눅스-내부-세팅">2. 리눅스 내부 세팅</h3>
<ol>
<li><p>hosts 설정</p>
<pre><code class="language-shell">  cat &lt;&lt;EOF | tee /etc/hosts
  10.10.100.6 ldk-k8s-master
  10.10.100.7 ldk-k8s-worker1
  10.10.100.11 ldk-k8s-worker2</code></pre>
</li>
<li><p>SELinux disable</p>
<pre><code class="language-shell">  setenforce 0
  sed -i &#39;s/^SELINUX=enforcing$/SELINUX=permissive/&#39; /etc/selinux/config</code></pre>
</li>
<li><p>모듈 로드</p>
<pre><code class="language-shell">  cat &lt;&lt;EOF | tee /etc/modules-load.d/k8s.conf
  overlay
  br_netfilter
  EOF

  modprobe overlay
  modprobe br_netfilter</code></pre>
</li>
<li><p>cluster network set</p>
<pre><code class="language-shell">  cat &lt;&lt;EOF | tee /etc/sysctl.d/k8s.conf
  net.bridge.bridge-nf-call-iptables = 1
  net.bridge.bridge-nf-call-ip6tables = 1
  net.ipv4.ip_forward = 1
  EOF</code></pre>
</li>
<li><p>swap off</p>
<pre><code class="language-shell">  swapoff -a
  sed -i &#39;/ swap / s/^/#/&#39; /etc/fstab

  sysctl --system</code></pre>
<h3 id="3-모든-node에-대해-고유한-hostname-mac-address-uuid-확인">3. 모든 Node에 대해 고유한 Hostname, Mac address, UUID 확인</h3>
<h3 id="4-cgroup-driver-택-1">4. Cgroup Driver (택 1)</h3>
<p>Kubernetes Cluster에서 리눅스 컨트롤 그룹(cgroups)을 관리하는 방식에 대해 결정하는 역할
시스템 리소스(예: CPU, 메모리, 디스크 I/O 등)를 제한 및 각 프로세스나 서비스에 할당 방법을 감독하는 기능을 제공</p>
</li>
<li><p><strong>일관된 환경</strong>: Kubernetes 클러스터의 각 노드에서 <code>systemd</code>를 사용함으로써 부팅 스크립트, 서비스 관리 및 로깅 시스템 등에서 일관된 환경을 제공 -&gt; 용이한 관리 및 트러블슈팅</p>
</li>
<li><p><strong>보다 나은 통합</strong>: <code>systemd</code>는 cgroups를 사용하여 리소스 제한과 프로세스 관리를 수행. Kubernetes는 이러한 기능을 활용하여 컨테이너의 리소스 사용을 제어 및 <code>systemd</code>와의 통합을 통해 강력하고 일관된 방식으로 관리 가능</p>
</li>
<li><p><strong>에러 최소화</strong>: 서로 다른 초기화 시스템이나 프로세스 관리자를 사용 시, 설정 차이나 호환성 문제로 인해 예기치 않은 에러가 발생할 수 있는데 <code>systemd</code>를 통일함으로써 호환성 문제를 최소화 가능</p>
<br></li>
</ol>
<ul>
<li><p><strong>systemd</strong> (k8s 공식 문서 권장, 필자가 사용한 Cgroup Driver )</p>
<ul>
<li><p><strong>시스템 서비스와의 일관성</strong>: Kubernetes가 시스템의 다른 서비스와 동일한 cgroup 계층을 사용하게 되어 리소스 관리에서 충돌을 방지 및 전체 시스템의 리소스 할당을 일관되게 관리 가능</p>
</li>
<li><p><strong>보다 나은 자원 제어</strong>: cgroup을 더 체계적으로 관리하고, 시스템 리소스를 더 효율적으로 할당 및 모니터링할 수 있는 기능을 제공</p>
</li>
<li><p><strong>보안과 안정성</strong>: 보안 업데이트와 시스템 통합이 더 자주 이루어지므로, 보안과 안정성 측면에서 이점을 제공</p>
</li>
</ul>
</li>
<li><p><strong>cgroupfs</strong></p>
<ul>
<li><p><strong>간단한 구성과 직접적인 제어</strong></p>
<pre><code>각 cgroup을 파일 시스템으로 직접 제어할 수 있는 인터페이스를 제공하여 관리자가 리소스 관리를 직접적으로 수행할 수 있게 해주며, 복잡한 계층적 구조 없이도 세밀한 리소스 제어가 가능</code></pre><ul>
<li><p><strong>운영 체제와의 독립성</strong>
  <code>systemd</code>를 사용하지 않는 리눅스 배포판에서도 일관된 환경을 제공하여 다양한 리눅스 환경에서의 포터빌리티(portability)를 향상시킴</p>
</li>
<li><p><strong>환경의 단순화</strong>
  특정 시스템에 <code>systemd</code>의 복잡한 설정과 관리 로직이 필요 없을 경우, <code>cgroupfs</code>를 사용하면 시스템 단순화 및 시스템 오버헤드 감소로 더 가벼운 환경을 만드는 데 유리함</p>
<h3 id="5-cri-택-1">5. CRI (택 1)</h3>
</li>
<li><p>CRI-O ( 필자가 사용한 CRI )</p>
<pre><code class="language-shell">PROJECT_PATH=prerelease:/maincat &lt;&lt;EOF | tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/rpm/repodata/repomd.xml.key
EOF
</code></pre>
</li>
</ul>
<p>yum install -y container-selinux cri-o iproute-tc
systemctl enable --now crio</p>
<pre><code>* containerd
### 6. k8s yum 저장소 추가 및 설치
</code></pre></li>
</ul>
<pre><code class="language-shell">cat &lt;&lt;EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kube*
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet</code></pre>
<h1 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/f55849a3-6c11-4ac1-b392-dda144df18b3/image.png" alt=""></h1>
</li>
</ul>
<hr>
<h2 id="master">Master</h2>
<h3 id="1-kubeadm-init">1. kubeadm init</h3>
<pre><code class="language-shell">    kubeadm init --apiserver-advertise-address=10.10.100.6 --pod-network-cidr=10.244.0.0/16</code></pre>
<h1 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/5d11dcb4-26cc-4e9d-9a4c-be1cda8051d5/image.png" alt=""></h1>
<h3 id="2-kubectl-권한주기">2. kubectl 권한주기</h3>
<pre><code class="language-shell">    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config</code></pre>
<h3 id="3-kubectl-alias">3. kubectl alias</h3>
<pre><code class="language-shell">    kubectl completion bash | tee /etc/bash_completion.d/kubectl &gt; /dev/null
    echo &#39;alias k=kubectl&#39; &gt;&gt;~/.bashrc
    echo &#39;complete -o default -F __start_kubectl k&#39; &gt;&gt;~/.bashrc
    exec bash</code></pre>
<hr>
<h2 id="worker">Worker</h2>
<h3 id="1-kubeadm-join">1. kubeadm join</h3>
<p>kubeadm init 하면서 얻은 토큰값으로 워커노드 전체에 kubeadm join</p>
<pre><code class="language-shell">    kubeadm join 10.10.100.6:6443 --token jl7n01.taovls0ekgbmrlb8 \
            --discovery-token-ca-cert-hash sha256:171e155dd22b904e0827a8e262a54d777e9f4becf0aa24f066e2dcd3575e217c</code></pre>
<h1 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/63dc60d9-49fc-44a1-8632-14ebb11b50ab/image.png" alt=""></h1>
<h3 id="2-crioconf-insecure-registry">2. crio.conf (insecure-registry)</h3>
<p>도커 서버에서 insecure-registry 설정을 해줘도 k8s cluster와 이미지 관련 통신 때
cluster에서는 pod 생성 중 image pulling 과정에서 https 통신을 요청하기에 CRI에 insecure-registry 설정을 주어
k8s와 docker 사이의 통신을 맞춰준다. (https 통신을 원할경우 서로간의 ssl 인증설정이 추가적으로 필요)</p>
<pre><code class="language-shell">    cat &lt;&lt; EOF|tee /etc/containers/registries.conf.d/crio.conf
    unqualified-search-registries = [&quot;docker.io&quot;, &quot;quay.io&quot;]

    [[registry]]
    prefix = &quot;&quot;
    location = &quot;10.10.100.8:5000&quot;
    insecure = true
    EOF

    systemctl restart crio</code></pre>
<hr>
<h2 id="in-cluster">In Cluster</h2>
<h3 id="1-cni-배포--택-1-">1. CNI 배포 ( 택 1 )</h3>
<ul>
<li><p>calico</p>
<pre><code class="language-shell">   kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml</code></pre>
</li>
<li><p>flannel ( 필자가 사용한 CNI )</p>
<pre><code class="language-shell">   kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code></pre>
</li>
<li><p>etc ...</p>
<h3 id="2-check-cluster">2. Check Cluster</h3>
</li>
<li><p>k get nodes
   <img src="https://velog.velcdn.com/images/sanbon_8/post/9d21e6a8-d92d-46fe-bc96-f4960b0a5fc5/image.png" alt=""></p>
</li>
<li><p>k get all --all-namespaces -o wide
   <img src="https://velog.velcdn.com/images/sanbon_8/post/47d91679-4974-40de-818e-6d804e30ae4b/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="3-3-tier-architecting--dev-">3. 3-Tier Architecting ( Dev )</h3>
<p>   # 이미지는 내가 보여주고자 하는 내용을 담은 내가 만든 tomcat 9.0 이미지다.</p>
<ul>
<li><p>Dev.yaml</p>
<pre><code class="language-yaml">    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dev-nginx-deployment
      namespace: dev
      labels:
        app: dev-nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: dev-nginx
      template:
        metadata:
          labels:
            app: dev-nginx
        spec:
          containers:
          - name: dev-nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
            - name: dev-nginx-conf-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          volumes:
          - name: dev-nginx-conf-volume
            configMap:
              name: dev-nginx-config
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: dev-nginx-config
      namespace: dev
    data:
      nginx.conf: |
        user  nginx;
        worker_processes  1;
        error_log  /var/log/nginx/error.log warn;
        pid        /var/run/nginx.pid;
        events {
            worker_connections  1024;
        }
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                              &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                              &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;
            access_log  /var/log/nginx/access.log  main;
            sendfile        on;
            keepalive_timeout  65;
            server {
                listen       80;
                location / {
                    proxy_pass http://dev-tomcat-clusterip-service:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                }
            }
        }

    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: dev-nginx-clusterip-service
      namespace: dev
    spec:
      selector:
        app: dev-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dev-nginx-nodeport-service
      namespace: dev
    spec:
      type: NodePort
      selector:
        app: dev-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30007
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dev-tomcat-deployment
      namespace: dev
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: dev-tomcat
      template:
        metadata:
          labels:
            app: dev-tomcat
        spec:
          containers:
          - name: dev-tomcat
            image: 10.10.100.8:5000/tomcat-custom:dev
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dev-tomcat-clusterip-service
      namespace: dev
    spec:
      type: ClusterIP
      selector:
        app: dev-tomcat
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080</code></pre>
<br>
</li>
<li><p>k get all -n dev -o wide
<img src="https://velog.velcdn.com/images/sanbon_8/post/162f5437-9889-4fd8-9e4f-333810f7e0c3/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/83c142fd-adf3-4225-8a8f-5e935c9409f5/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/1e8a397b-b67f-48e2-bb2a-44a5440cc23e/image.png" alt=""></p>
<br>

<ul>
<li>sessionCheck.jsp<pre><code>![](https://velog.velcdn.com/images/sanbon_8/post/f6d4e331-e22b-42f7-a6c7-7355e06a2843/image.png) ![](https://velog.velcdn.com/images/sanbon_8/post/351255e2-e13c-4399-86e3-f028f081c13b/image.png)</code></pre></li>
</ul>
<br>

<ul>
<li>checkDBConnection.jsp
   <img src="https://velog.velcdn.com/images/sanbon_8/post/e5481af1-cef2-4267-bfe3-834472564f71/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/2e903432-411b-47fd-9704-c7a4d845ec6f/image.png" alt=""></li>
</ul>
<h3 id="4--dev--stg--prd--separation">4. [ Dev / Stg / Prd ] Separation</h3>
<p>   dev와 비슷한 구조로 namespace와 이미지를 다르게 해서 스테이징 환경 ( stg ), 프로덕션 환경 ( prd )을 배포해준다</p>
<ul>
<li><p>stg.yaml</p>
<pre><code class="language-yaml">    apiVersion: v1
    kind: Namespace
    metadata:
      name: stg
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stg-nginx-deployment
      namespace: stg
      labels:
        app: stg-nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: stg-nginx
      template:
        metadata:
          labels:
            app: stg-nginx
        spec:
          containers:
          - name: stg-nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
            - name: stg-nginx-conf-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          volumes:
          - name: stg-nginx-conf-volume
            configMap:
              name: stg-nginx-config
    ---        
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: stg-nginx-config
      namespace: stg
    data:
      nginx.conf: |
        user  nginx;
        worker_processes  1;
        error_log  /var/log/nginx/error.log warn;
        pid        /var/run/nginx.pid;
        events {
            worker_connections  1024;
        }
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                              &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                              &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;
            access_log  /var/log/nginx/access.log  main;
            sendfile        on;
            keepalive_timeout  65;
            server {
                listen       80;
                location / {
                    proxy_pass http://stg-tomcat-clusterip-service:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                }
            }
        }

    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: stg-nginx-clusterip-service
      namespace: stg
    spec:
      selector:
        app: stg-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: stg-nginx-nodeport-service
      namespace: stg
    spec:
      type: NodePort
      selector:
        app: stg-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30008
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stg-tomcat-deployment
      namespace: stg
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: stg-tomcat
      template:
        metadata:
          labels:
            app: stg-tomcat
        spec:
          containers:
          - name: stg-tomcat
            image: 10.10.100.8:5000/tomcat-custom:stg
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: stg-tomcat-clusterip-service
      namespace: stg
    spec:
      type: ClusterIP
      selector:
        app: stg-tomcat
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/71501ed9-8833-469f-9782-6f4a54d64803/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/97df2e17-e490-4350-b408-6c16b9d183e2/image.png" alt=""></p>
</li>
<li><p>prd.yaml</p>
<pre><code class="language-yaml">    apiVersion: v1
    kind: Namespace
    metadata:
      name: prd
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: prd-nginx-deployment
      namespace: prd
      labels:
        app: prd-nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: prd-nginx
      template:
        metadata:
          labels:
            app: prd-nginx
        spec:
          containers:
          - name: prd-nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
            - name: prd-nginx-conf-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          volumes:
          - name: prd-nginx-conf-volume
            configMap:
              name: prd-nginx-config
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: prd-nginx-config
      namespace: prd
    data:
      nginx.conf: |
        user  nginx;
        worker_processes  1;
        error_log  /var/log/nginx/error.log warn;
        pid        /var/run/nginx.pid;
        events {
            worker_connections  1024;
        }
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                              &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                              &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;
            access_log  /var/log/nginx/access.log  main;
            sendfile        on;
            keepalive_timeout  65;
            server {
                listen       80;
                location / {
                    proxy_pass http://prd-tomcat-clusterip-service:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                }
            }
        }

    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: prd-nginx-clusterip-service
      namespace: prd
    spec:
      selector:
        app: prd-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: stg-nginx-nodeport-service
      namespace: stg
    spec:
      type: NodePort
      selector:
        app: stg-nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30009
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: prd-tomcat-deployment
      namespace: prd
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: prd-tomcat
      template:
        metadata:
          labels:
            app: prd-tomcat
        spec:
          containers:
          - name: prd-tomcat
            image: 10.10.100.8:5000/tomcat-custom:prd
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: prd-tomcat-clusterip-service
      namespace: prd
    spec:
      type: ClusterIP
      selector:
        app: prd-tomcat
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/0751442a-6c3f-4ee9-965c-3f2c09e9e57f/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/6c6c152b-097a-4450-b6a7-844dee8041a0/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="5-ingress--nginx-ingress-controller">5. Ingress &amp; Nginx Ingress Controller</h3>
<ul>
<li><p>Nginx Ingress Controller 설치</p>
<pre><code class="language-yaml">     k apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml</code></pre>
<p>이후 Master Node의 IP를 할당해준다.
!!! 공인 IP를 할당받은 VM이기에 가능하므로 로컬에서 연습할 시 metallb를 추가해 진행할 것</p>
<pre><code class="language-shell">     k patch svc -n ingress-nginx ingress-nginx-controller -p &#39;{&quot;spec&quot;: {&quot;type&quot;: &quot;LoadBalancer&quot;, &quot;externalIPs&quot;:[&quot;110.165.18.225&quot;]}}&#39;</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/9f4fc242-f669-4c64-9b0c-d38495797833/image.png" alt=""></p>
<ul>
<li><p>각 namespace에 ingress 배포</p>
<pre><code class="language-yaml">   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-nginx
     namespace: dev
     annotations:
       nginx.ingress.kubernetes.io/rewrite-target: /
       kubernetes.io/ingress.class: nginx
   spec:
     ingressClassName: &quot;nginx&quot;
     rules:
     - http:
         paths:
         - path: /dev
           pathType: Prefix
           backend:
             service:
               name: dev-nginx-clusterip-service
               port:
                 number: 80
   ---
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-nginx
     namespace: stg
     annotations:
       nginx.ingress.kubernetes.io/rewrite-target: /
       kubernetes.io/ingress.class: nginx
   spec:
     ingressClassName: &quot;nginx&quot;
     rules:
     - http:
         paths:
         - path: /stg
           pathType: Prefix
           backend:
             service:
               name: stg-nginx-clusterip-service
               port:
                 number: 80
   ---
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-nginx
     namespace: prd
     annotations:
       nginx.ingress.kubernetes.io/rewrite-target: /
       kubernetes.io/ingress.class: nginx
   spec:
     ingressClassName: &quot;nginx&quot;
     rules:
     - http:
         paths:
         - path: /prd
           pathType: Prefix
           backend:
             service:
               name: prd-nginx-clusterip-service
               port:
                 number: 80</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/ff811211-6585-4839-9712-6b5f6d302c33/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/87ec3ab4-6586-49b3-842f-7655d6c9ff69/image.png" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/71214a8a-2b96-4552-adb0-1f781202ffbe/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="etc">ETC</h1>
<h2 id="cgroup-driver">Cgroup Driver</h2>
<p>리눅스 컨트롤 그룹(cgroups) 관리 방식 결정
컨테이너 리소스 제한 및 모니터링 기능 제공</p>
<p><strong>systemd의 특징</strong>:</p>
<ul>
<li>시스템 및 서비스 매니저로 초기화, 관리, 종료 담당</li>
<li>단위(unit) 파일로 서비스 관리</li>
<li>병렬 처리로 부팅 시간 최적화</li>
<li><code>journal</code>을 사용한 통합 로깅 시스템</li>
<li>cgroups를 통한 프로세스 및 리소스 관리</li>
</ul>
<p><strong>cgroupfs의 특징</strong>:</p>
<ul>
<li>리소스 제한 및 모니터링을 직접적으로 파일 시스템 인터페이스로 관리</li>
<li>계층적 그룹 관리로 각 그룹에 리소스 제한 적용 가능</li>
<li>프로세스 그룹화로 시스템 관리 효율성 증가</li>
<li>다양한 리소스 관리 컨트롤러 제공</li>
</ul>
<p><strong>systemd vs cgroupfs</strong>:</p>
<ul>
<li><strong>목적과 범위</strong>: systemd는 시스템 전체의 서비스 생명주기 및 리소스 관리에 초점. cgroupfs는 리소스 제한과 관리에 특화</li>
<li><strong>통합과 독립성</strong>: systemd는 cgroup 관리를 시스템의 다른 부분과 통합하여 관리. cgroupfs는 독립적으로 리소스 제어 가능</li>
<li><strong>인터페이스</strong>: systemd는 고수준의 서비스 관리 인터페이스 제공. cgroupfs는 저수준의 파일 시스템 인터페이스 사용</li>
</ul>
<hr>
<h2 id="cri-container-runtime-interface">CRI (Container Runtime Interface)</h2>
<p>컨테이너 런타임과 오케스트레이션 시스템 연결 표준 인터페이스
컨테이너 생성, 시작, 정지, 삭제 API 제공</p>
<p><strong>CRI-O 특징</strong>:</p>
<ul>
<li>쿠버네티스 전용 경량 런타임</li>
<li>OCI 표준 준수</li>
<li>네트워크, 스토리지 플러그인 지원</li>
<li>컨테이너 격리 실행으로 보안 강화</li>
<li>구조 간소화</li>
</ul>
<p><strong>containerd 특징</strong>:</p>
<ul>
<li>범용 컨테이너 런타임.</li>
<li>OCI 이미지, 런타임 규격 지원</li>
<li>모듈형 설계</li>
<li>확장성 있는 플러그인 구조</li>
<li>강력한 커뮤니티 지원</li>
</ul>
<p><strong>CRI-O vs containerd 차이</strong>:</p>
<ul>
<li><strong>목표</strong>: CRI-O는 쿠버네티스 전용, containerd는 다양한 플랫폼 지원</li>
<li><strong>플러그인</strong>: CRI-O는 쿠버네티스 최적화 플러그인, containerd는 범용 플러그인 구조</li>
<li><strong>사용 환경</strong>: CRI-O는 주로 쿠버네티스, containerd는 쿠버네티스 및 기타 도구 사용</li>
</ul>
<hr>
<h2 id="cni-container-network-interface">CNI (Container Network Interface)</h2>
<p>Kubernetes의 컨테이너 간 네트워킹 설정을 위한 Plugin Interface
네트워크 연결과 IP 주소 할당 등을 관리</p>
<p><strong>Calico의 특징</strong>:</p>
<ul>
<li>고성능 데이터 플레인 제공</li>
<li>확장 가능한 네트워크 정책</li>
<li>IPv4/IPv6 동시 지원</li>
</ul>
<p><strong>Cilium의 특징</strong>:</p>
<ul>
<li>eBPF 기반으로 고성능 보장</li>
<li>레이어 7 정책 실행 가능</li>
<li>네트워크 보안에 초점</li>
</ul>
<p><strong>Flannel의 특징</strong>:</p>
<ul>
<li>간단한 설치 및 설정</li>
<li>오버레이 네트워킹을 통한 트래픽 라우팅</li>
<li>VXLAN, UDP를 지원하는 네트워크 백엔드 제공</li>
</ul>
<p><strong>CNI들의 차이점</strong>:</p>
<ul>
<li><strong>Calico</strong>는 보안과 성능에 초점을 맞춘 네트워크 정책 기능이 강점.</li>
<li><strong>Cilium</strong>은 최신 eBPF 기술을 활용해 보안과 성능을 강화한 CNI.</li>
<li><strong>Flannel</strong>은 설치와 관리의 용이성에 초점을 맞춘, 기본적인 오버레이 네트워크 솔루션을 제공</li>
</ul>
<hr>
<h2 id="ingress-controller">Ingress Controller</h2>
<p>쿠버네티스에서 외부 요청을 내부 서비스로 연결
규칙 기반 라우팅 제공</p>
<p><strong>NGINX Ingress Controller 특징</strong>:</p>
<ul>
<li>리버스 프록시, 로드 밸런서로 사용되는 NGINX 사용</li>
<li>설정 유연성과 성능에서 강점</li>
<li>안정성 높고, 커스텀화 용이</li>
</ul>
<p><strong>ALB Ingress Controller 특징</strong>:</p>
<ul>
<li>AWS의 Application Load Balancer 사용</li>
<li>자동 스케일링 및 AWS 서비스와의 통합 용이</li>
<li>비용 효율적으로 다수의 HTTP, HTTPS 트래픽 처리</li>
</ul>
<p><strong>차이점</strong>:</p>
<ul>
<li>구현 기반: NGINX는 오픈 소스 리버스 프록시, ALB는 AWS의 상업적 로드 밸런서</li>
<li>플랫폼 통합: NGINX는 다양한 환경에 배포 가능, ALB는 AWS 환경에 최적화</li>
<li>기능과 성능: NGINX는 커스텀 설정에 강점, ALB는 클라우드 특화 기능 및 자동화에 초점</li>
</ul>
<hr>
<p>flannel 설치 에러</p>
<pre><code class="language-text">error validating data: failed to download openapi: Get &quot;https://10.10.100.6:6443/openapi/v2?timeout=32s&quot;: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of &quot;crypto/rsa: verification error&quot; while trying to verify candidate authority certificate &quot;kubernetes&quot;); if you choose to ignore these errors, turn validation off with --validate=false</code></pre>
<p>보통 기존 kubeadm reset 이후 $HOME/.kube를 삭제하지 않아서 생기는 오류
막연하게 덮어쓰기 식으로 복붙 명령문 실행이 아닌</p>
<pre><code>rm -rf $HOME/.kube</code></pre><p>라는 명령어를 통해 삭제 후 진행해보자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 3-Tier]]></title>
            <link>https://velog.io/@sanbon_8/Docker-3-Tier</link>
            <guid>https://velog.io/@sanbon_8/Docker-3-Tier</guid>
            <pubDate>Wed, 27 Mar 2024 07:38:07 GMT</pubDate>
            <description><![CDATA[<h1 id="docker-기반-3-tier-구성-과정">Docker 기반 3-Tier 구성 과정</h1>
<hr>
<h2 id="1-docker--proxy-maria-db-redis-server-구축">1. Docker &amp; Proxy, Maria DB, Redis Server 구축</h2>
<p>전체 아키텍처 구상
<img src="https://velog.velcdn.com/images/sanbon_8/post/09c033fb-d146-464e-b81b-59ff02aa159f/image.png" alt=""></p>
<hr>
<p>[Docker Server] (10.10.100.6)</p>
<pre><code class="language-shell">yum remove -y docker \
                    docker-client \
                    docker-client-latest \
                    docker-common \
                    docker-latest \
                    docker-latest-logrotate \
                    docker-logrotate \
                    docker-engine

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum install -y docker-ce \
          docker-ce-cli \
          containerd.io \
          docker-buildx-plugin \
          docker-compose-plugin
systemctl enable --now docker

yum install -y nginx &amp;&amp; systemctl enable --now nginx</code></pre>
<p># docker -&gt; 컨테이너 서비스를 위해서
# nginx -&gt; ncp alb 서비스와 연결할 프록시 설정을 위해서
<img src="https://velog.velcdn.com/images/sanbon_8/post/6dfa63c5-fd9e-4885-82a0-eeabdbac6660/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/cf187098-47e5-487a-91d5-c4236147e7dd/image.png" alt=""></p>
<hr>
<p>[MariaDB Server] (10.10.100.7)</p>
<pre><code class="language-shell">yum install mariadb mariadb-server &amp;&amp; systemctl enable --now mariadb</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/bfd1f9a5-cfbd-4179-a7af-83767c4eb9f1/image.png" alt=""></p>
<p># 이후 WAS 컨테이너와의 연동을 위한 user, database를 만들어주자
# mysql -u root -p
MariaDB [(none)]&gt;</p>
<pre><code class="language-SQL">grant all privileges on *.* to &#39;test&#39;@&#39;%&#39; identified by &#39;0000&#39;;
flush privileges;
create database test;</code></pre>
<hr>
<p>[Redis Server] (10.10.100.8)</p>
<pre><code class="language-shell">yum install -y redis &amp;&amp; systemctl enable --now redis</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/6208cd9a-3cd1-4f35-9004-d610942611d3/image.png" alt=""></p>
<hr>
<h2 id="2-docker-network-create--image-pull">2. Docker Network Create &amp; Image Pull</h2>
<p>[Docker Server]
<span style="color:#009800;">*dpr</span> -&gt; docker private registry의 줄임말로 사용</p>
<pre><code class="language-shell">docker network create \
        --driver bridge \
        --subnet 172.18.0.0/16 \
        --gateway 172.18.0.1 \
        web-bridge
docker network create \
        --driver bridge \
        --subnet 172.19.0.0/16 \
        --gateway 172.19.0.1 \
        was-bridge
docker network create \
        --driver bridge \
        --subnet 172.20.0.0/16 \
        --gateway 172.20.0.1 \
        dpr-bridge

docker network ls</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/88c0bcbc-03be-4913-8f05-77ed7ba2075a/image.png" alt=""></p>
<pre><code class="language-shell">docker pull nginx
docker pull tomcat:9.0
docker pull registry

docker images</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/a6303dcd-303d-4a6c-b804-c366ce53ac7d/image.png" alt=""></p>
<hr>
<h2 id="3-container-run">3. Container Run</h2>
<pre><code class="language-shell">docker run --name web -d -p 81:80 --restart always --network web-bridge --network was-bridge nginx
docker run --name was -d -p 8081:8080 --restart always --network was-bridge tomcat:9.0
docker run --name in-lb -d -p 8080:80 --restart always --network was-bridge nginx 
docker run --name registry -d -p 5000:5000 --restart always --network dpr-bridge registry

docker ps</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/cbb390fc-980d-4438-bcd3-4b30237db0ac/image.png" alt=""></p>
<p>* 참고용
web -&gt; 172.18.0.2
was -&gt; 172.19.0.3
lb  -&gt; 172.19.0.3
registry -&gt; 172.20.0.2</p>
<hr>
<h2 id="4-container-custom-setting">4. Container Custom Setting</h2>
<h3 id="1-tomcat-clustering--db-connect">1) tomcat clustering &amp; DB connect</h3>
<p>[Docker Server]
# docker exec -it was /bin/bash</p>
<p>root@&lt;Container_ID&gt;:/usr/local/tomcat#</p>
<pre><code class="language-shell">cp -r ./webapps.dist/* ./webapps
exit</code></pre>
<br>
[root@ldk-docker \~]#

<pre><code class="language-shell">wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip
unzip tomcat-cluster-redis-session-manager.zip
docker cp ./tomcat-cluster-redis-session-manager/lib/. /usr/local/tomcat/lib/</code></pre>
<br>
<span style=""># vim ./tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties</span>

<pre><code>redis.hosts=10.10.100.8:6379 ## redis endpoint 추가</code></pre><br>
[root@ldk-docker \~]#

<pre><code>docker cp ./tomcat-cluster-redis-session-manager/conf/. /usr/local/tomcat/conf/</code></pre><br>
# vim context.xml

<pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;Context&gt;
    &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;
    &lt;WatchedResource&gt;WEB-INF/tomcat-web.xml&lt;/WatchedResource&gt;
    &lt;WatchedResource&gt;${catalina.base}/conf/web.xml&lt;/WatchedResource&gt;
    &lt;!-- 아래 내용 추가 --&gt;
    &lt;Valve className=&quot;tomcat.request.session.redis.SessionHandlerValve&quot; /&gt;
    &lt;Manager className=&quot;tomcat.request.session.redis.SessionManager&quot; /&gt;
&lt;/Context&gt;</code></pre>
<br>
[root@ldk-docker \~]#

<pre><code class="language-shell">docker cp context.xml was:/usr/local/tomcat/conf/context.xml</code></pre>
<br>
# vim sessionCheck.jsp

<pre><code class="language-text">&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
        pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ page import=&quot;java.text.*&quot;%&gt;
&lt;%@ page import=&quot;java.util.*&quot;%&gt;
&lt;%
        String RsessionId = request.getRequestedSessionId();
        String sessionId = session.getId();
        boolean isNew = session.isNew();
        long creationTime = session.getCreationTime();
        long lastAccessedTime = session.getLastAccessedTime();
        int maxInactiveInterval = session.getMaxInactiveInterval();
        Enumeration e = session.getAttributeNames();
%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=EUC-KR&quot;&gt;
&lt;title&gt;Session Test&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;WAS&lt;/h1&gt;
&lt;table border=1 bordercolor=&quot;gray&quot; cellspacing=1 cellpadding=0
        width=&quot;100%&quot;&gt;
        &lt;tr bgcolor=&quot;gray&quot;&gt;
                &lt;td colspan=2 align=&quot;center&quot;&gt;&lt;font color=&quot;white&quot;&gt;&lt;b&gt;Session
                Info&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Server HostName&lt;/td&gt;
                &lt;td&gt;&lt;%=java.net.InetAddress.getLocalHost().getHostName()%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Server IP&lt;/td&gt;
                &lt;td&gt;&lt;%=java.net.InetAddress.getLocalHost()
                                                                        .getHostAddress()%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Request SessionID&lt;/td&gt;
                &lt;td&gt;&lt;%=RsessionId%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;SessionID&lt;/td&gt;
                &lt;td&gt;&lt;%=sessionId%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;isNew&lt;/td&gt;
                &lt;td&gt;&lt;%=isNew%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Creation Time&lt;/td&gt;
                &lt;td&gt;&lt;%=new Date(creationTime)%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Last Accessed Time&lt;/td&gt;
                &lt;td&gt;&lt;%=new Date(lastAccessedTime)%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td&gt;Max Inactive Interval (second)&lt;/td&gt;
                &lt;td&gt;&lt;%=maxInactiveInterval%&gt;&lt;/td&gt;
        &lt;/tr&gt;
     &lt;tr bgcolor=&quot;cyan&quot;&gt;
                &lt;td colspan=2 align=&quot;center&quot;&gt;&lt;b&gt;Session Value List&lt;/b&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
                &lt;td align=&quot;center&quot;&gt;NAME&lt;/td&gt;
                &lt;td align=&quot;center&quot;&gt;VAULE&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
                String name = null;
                while (e.hasMoreElements()) {
                        name = (String) e.nextElement();
        %&gt;
        &lt;tr&gt;
                &lt;td align=&quot;left&quot;&gt;&lt;%=name%&gt;&lt;/td&gt;
                &lt;td align=&quot;left&quot;&gt;&lt;%=session.getAttribute(name)%&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;%
                }
        %&gt;

&lt;/table&gt;

        &lt;%
                int count = 0;

                if(session.getAttribute(&quot;count&quot;) != null)
                        count = (Integer) session.getAttribute(&quot;count&quot;);

                count += 1;

                session.setAttribute(&quot;count&quot;, count);

                out.println(session.getId() + &quot;     :     &quot; + count);
        %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>[root@ldk-docker ~]#</p>
<pre><code class="language-shell">docker cp sessionCheck.jsp was:/usr/local/tomcat/webapps/ROOT/sessionCheck.jsp
docker restart was</code></pre>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/8143b333-94be-4527-b99b-861c27992ea2/image.png" alt=""></p>
<pre><code class="language-shell">wget https://dlm.mariadb.com/3752064/Connectors/java/connector-java-2.7.12/mariadb-java-client-2.7.12.jar
docker cp mariadb-java-client-2.7.12.jar was:/usr/local/tomcat/lib/</code></pre>
<br>
# vim checkDBConnection.jsp

<pre><code class="language-text">&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@ page import=&quot;java.text.*&quot;%&gt;
&lt;%@ page import=&quot;java.util.*&quot;%&gt;

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;MariaDB 연결 드라이버 테스트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;h1&gt;WAS&lt;/h1&gt;
        &lt;h2&gt;Server IP: &lt;%=java.net.InetAddress.getLocalHost().getHostAddress()%&gt;&lt;/h2&gt;
        &lt;h1&gt;MariaDB 연결 드라이버 테스트&lt;/h1&gt;
        &lt;%
                String jdbcUrl = &quot;jdbc:mariadb://10.10.100.7:3306/test&quot;;
                String dbId = &quot;test&quot;;
                String dbPwd = &quot;0000&quot;;

                try
                {
                        Class.forName(&quot;org.mariadb.jdbc.Driver&quot;);
                        Connection connection = DriverManager.getConnection(jdbcUrl, dbId, dbPwd);
                        out.println(&quot;MariaDB 연결 성공&quot;);
                }
                catch (Exception ex)
                {
                        out.println(&quot;연결 오류입니다. 오류 메시지 : &quot; + ex.getMessage());
                }
        %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br>
[root@ldk-docker \~]#

<pre><code>docker cp checkDBConnection.jsp was:/usr/local/tomcat/webapps/ROOT/
docker restart was</code></pre><p><img src="https://velog.velcdn.com/images/sanbon_8/post/9ab7fe8b-d304-4c3a-b9ba-8b4b10233bc6/image.png" alt=""></p>
<h3 id="2-internal-lb-connect">2) Internal-LB Connect</h3>
<hr>
<p># vim nginx.conf</p>
<pre><code class="language-conf">user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                      &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                      &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    upstream tomcat {
        server 172.19.0.3:8080;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass http://tomcat;
        }
    }
}</code></pre>
<p>[root@ldk-docker ~]#</p>
<pre><code>docker cp nginx.conf in-lb:/etc/nginx/nginx.conf
docker restart in-lb</code></pre><p># internal-lb 포트로 접속 시 tomcat 페이지가 나오는 것을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/sanbon_8/post/93a06a84-ce3f-4bd4-908a-a1da47a83b47/image.png" alt=""></p>
<h3 id="3-web-connect">3) Web Connect</h3>
<hr>
<p># vim nginx.conf</p>
<pre><code class="language-conf">user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                      &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                      &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    upstream inLB {
        server 172.19.0.4:80;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass http://inLB;
        }
    }
}</code></pre>
<p>[root@ldk-docker ~]#</p>
<pre><code>docker cp nginx.conf web:/etc/nginx/nginx.conf
docker restart web</code></pre><p>#WEB 포트로 접속시 tomcat page가 나오는 것을 확인할 수 있다
<img src="https://velog.velcdn.com/images/sanbon_8/post/ee2c34ab-aea2-47e9-93d7-89fd6fd97291/image.png" alt=""></p>
<h3 id="4-server-proxy-connect">4) Server Proxy Connect</h3>
<hr>
<p># vim /etc/nginx/nginx.conf</p>
<pre><code class="language-conf">user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  &#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#39;
                      &#39;$status $body_bytes_sent &quot;$http_referer&quot; &#39;
                      &#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#39;;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    upstream web {
        server 172.18.0.2:80;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass http://web;
        }
    }
}</code></pre>
<p>[root@ldk-docker ~]#</p>
<pre><code class="language-shell">systemctl restart nginx</code></pre>
<p># default port로 접속시 tomcat page가 나오는 것을 확인 할 수 있다
<img src="https://velog.velcdn.com/images/sanbon_8/post/636a5df8-d719-46cd-b443-bdb1708a82c1/image.png" alt=""></p>
<h2 id="5-docker-image-push-docker-private-registry">5. Docker Image Push (Docker Private Registry)</h2>
<p>[root@ldk-docker ~]#</p>
<pre><code class="language-shell">docker commit web localhost:5000/custom-web:1.0
docker commit was localhost:5000/custom-was:1.0
docker commit in-lb localhost:5000/custom-lb:1.0

docker push localhost:5000/custom-web:1.0
docker push localhost:5000/custom-was:1.0
docker push localhost:5000/custom-lb:1.0

docker rmi localhost:5000/custom-web:1.0
docker rmi localhost:5000/custom-was:1.0
docker rmi localhost:5000/custom-lb:1.0

docker run --name web2 -d -p 82:80 --restart always --network web-bridge --network was-bridge localhost:5000/custom-web:1.0
docker run --name was2 -d -p 8082:8080 --restart always --network was-bridge localhost:5000/custom-was:1.0</code></pre>
<br>
# 이후 nginx.conf 마다 nginx server -> web2\_IP:80, internal LB -> was2\_IP:8080 포트를 upstream 블럭 내에 추가 ( 형식은 web과 was IP 적는 방식과 동일, [4. Container Custom Setting 참고])
# conf 파일이 수정된 서버와 컨테이너 restart

<p><img src="https://velog.velcdn.com/images/sanbon_8/post/98207932-1553-46be-aef7-b464eb0d8f6a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/d8f44d80-4653-40cb-9cac-3f4973c851c3/image.png" alt=""></p>
<h2 id="6-docker-compose">6. Docker-Compose</h2>
<p># Docker compose를 통해 컨테이너를 통합 생성 및 제거가 가능하다
# 이미지 생성 이후 web과 internal LB의 nginx.conf의 수정사항이 있었으므로 이미지 업데이트를 해준다</p>
<p>[root@ldk-docker ~]#</p>
<pre><code class="language-shell">docker commit web2 localhost:5000/custom-web:1.1
docker commit in-lb localhost:5000/custom-lb:1.1

docker push localhost:5000/custom-web:1.1
docker push localhost:5000/custom-lb:1.1

docker rmi localhost:5000/custom-web:1.1
docker rmi localhost:5000/custom-lb:1.1</code></pre>
<br>
# vim docker-compose.yml

<pre><code class="language-yml">services:
  web01:
    image: localhost:5000/custom-web:1.1
    restart: always
    networks:
      - web-bridge
      - was-bridge
    container_name: web01
    expose:
      - 80
    depends_on:
      - internal-LB
  web02:
    image: localhost:5000/custom-web:1.1
    restart: always
    networks:
      - web-bridge
      - was-bridge
    container_name: web02
    expose:
      - 80
    depends_on:
      - web01
  internal-LB:
    image: localhost:5000/custom-lb:1.1
    restart: always
    networks:
      - was-bridge
    container_name: in-lb
    expose:
      - 80
    depends_on:
      - was02
  was01:
    image: localhost:5000/custom-was:1.0
    restart: always
    networks:
      - was-bridge
    container_name: was01
    expose:
      - 8080
  was02:
    image: localhost:5000/custom-was:1.0
    restart: always
    networks:
      - was-bridge
    container_name: was02
    expose:
      - 8080
    depends_on:
      - was01
networks:
  web-bridge:
    external: true
  was-bridge:
    external: true
  dpr-bridge:
    external: true</code></pre>
<br>
[root@ldk-docker \~]#

<pre><code class="language-shell">docker compose up -d
docker ps</code></pre>
<p># ( IMAGE 태그는 실습과정에서 생긴 차이이므로 무시하자 )
<img src="https://velog.velcdn.com/images/sanbon_8/post/496dd785-b733-4bed-a847-dc140b9785c5/image.png" alt=""></p>
<p># Load Balancer 테스트
<img src="https://velog.velcdn.com/images/sanbon_8/post/27ed1a46-4b13-42c0-8192-5aea575313b0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/297855f3-81f0-4b1f-af1a-24ea48bbc4b8/image.png" alt=""></p>
<p>[root@ldk-docker ~]#</p>
<pre><code class="language-shell">docker compose down
docker ps -a</code></pre>
<p># 컨테이너가 사라진 것을 확인 할 수 있다
<img src="blob:https://velog.io/adb215b3-81f8-49f6-a79a-bf592499df35" alt="업로드중.."></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3-Tier (WAS - DB)]]></title>
            <link>https://velog.io/@sanbon_8/3-Tier-WAS-DB</link>
            <guid>https://velog.io/@sanbon_8/3-Tier-WAS-DB</guid>
            <pubDate>Wed, 27 Mar 2024 06:34:50 GMT</pubDate>
            <description><![CDATA[<h1 id="was---db-연결">WAS - DB 연결</h1>
<p>[WAS 1, 2]
# DB를 연결하기 위해서 mariadb-connector가 필요하므로 해당 파일을 받아주자
# 필자의 톰캣 설치 디렉토리 위치는 /usr/local/ 이므로 상황에 맞게 경로 설정을 바꿔주자</p>
<p><span style="color:black;">cd /usr/local/tomcat/lib</span>
<span style="color:black;">wget </span><a href="https://dlm.mariadb.com/3752064/Connectors/java/connector-java-2.7.12/mariadb-java-client-2.7.12.jar">https://dlm.mariadb.com/3752064/Connectors/java/connector-java-2.7.12/mariadb-java-client-2.7.12.jar</a></p>
<p>cd /usr/local/tomcat/webapps/ROOT
vim checkDBConnect.jsp</p>
<pre><code>&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;MariaDB 연결 드라이버 테스트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;h1&gt;WAS1 또는 WAS2&lt;/h1&gt;
        &lt;h1&gt;MariaDB 연결 드라이버 테스트&lt;/h1&gt;
        &lt;%
                String jdbcUrl = &quot;jdbc:mariadb://&lt;MAXSCALE_IP&gt;:3306/pj&quot;;
                String dbId = &quot;slave&quot;;
                String dbPwd = &quot;0000&quot;;

                try
                {
                        Class.forName(&quot;org.mariadb.jdbc.Driver&quot;);
                        Connection connection = DriverManager.getConnection(jdbcUrl, dbId, dbPwd);
                        out.println(&quot;MariaDB 연결 성공&quot;);
                }
                catch (Exception ex)
                {
                        out.println(&quot;연결 오류입니다. 오류 메시지 : &quot; + ex.getMessage());
                }
        %&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><br>
# 저장 후 ALB로 접속 시

<p><img src="https://velog.velcdn.com/images/sanbon_8/post/813d0e95-bf78-45ef-bb44-bf9e9b47e218/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/d218d240-eccc-4793-a2d9-533d4fe8d64f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3-Tier (DB Write / Read Seperate)]]></title>
            <link>https://velog.io/@sanbon_8/3-Tier-DB-Write-Read-Seperate</link>
            <guid>https://velog.io/@sanbon_8/3-Tier-DB-Write-Read-Seperate</guid>
            <pubDate>Wed, 27 Mar 2024 06:33:12 GMT</pubDate>
            <description><![CDATA[<h1 id="mariadb-maxscale">MariaDB Maxscale</h1>
<p>일종의 DB Proxy 역할로 Read / Write 분리, VIP 접근 / Auto Failover 기능을 설정할 수 있다.
# Maxscale은 WAS 서버와 DB 서버 사이에 위치해야하며 새로 추가적인 인스턴스를 생성해주자
<img src="https://velog.velcdn.com/images/sanbon_8/post/6663686c-66d5-4434-bfdd-426626cb2438/image.png" alt=""></p>
<hr>
<p>[maxscale]
# maxscale 자체는 yum 기능에서 찾지 못하므로 repo 설정 후 찾아야한다.
curl -LsS <a href="https://r.mariadb.com/downloads/mariadb_repo_setup">https://r.mariadb.com/downloads/mariadb_repo_setup</a> | bash
yum install -y maxscale</p>
<p>systemctl enable --now maxscale</p>
<p>vim /etc/maxscale.cnf</p>
<pre><code>[server1]
type=server
address=&lt;MASTER_DB_IP&gt;
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=&lt;SLAVE_DB_IP&gt;
port=3306
protocol=MariaDBBackend


[Maria-Monitor]
type=monitor
module=mariadbmon
servers=server1, server2
user=&#39;slave&#39;
password=&#39;0000&#39;
monitor_interval=2000ms
auto_failover=true
auto_rejoin=true


[Splitter-Service]
type=service
router=readwritesplit
servers=server1,server2
user=&#39;slave&#39;
password=&#39;0000&#39;

[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=MariaDBClient
port=3306</code></pre><p>systemctl restart maxscale</p>
<p><span style="">mysql -u slave -p&#39;0000&#39; -h &lt;MAXSCALE_IP&gt; -e &quot;use pj; insert into user(name,password) values (@@hostname, @@hostname);&quot;</span></p>
<hr>
<p>[masterDB]
mysql -u root -p</p>
<p>MariaDB[(none)]&gt;</p>
<pre><code>use pj; select * from user;</code></pre><p># WRITE(insert)가 masterDB에서 작동한 것을 확인 할 수 있다
<img src="https://velog.velcdn.com/images/sanbon_8/post/e123e2cf-6ba9-4b12-8607-bdc8ac9b0e60/image.png" alt=""></p>
<hr>
<p>[maxscale]
<span style="">mysql -u slave -p&#39;0000&#39; -h &lt;MAXSCALE_IP&gt; -e &quot;select @@hostname;&quot;</span>
# READ(select)가 slaveDB에서 작동한 것을 확인 할 수 있다
<img src="https://velog.velcdn.com/images/sanbon_8/post/722fce9e-8b00-40c1-b632-08ca20fe690e/image.png" alt=""></p>
<p><span style="">maxctrl list servers;</span>
<img src="https://velog.velcdn.com/images/sanbon_8/post/ca46471d-ca6d-4817-beca-9dcb5eb1ce54/image.png" alt=""></p>
<p># masterDB -&gt; systemctl stop mariadb 후 slaveDB가 Master로 승격한 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/sanbon_8/post/393e1ade-8d75-4188-9dee-86416917ceb2/image.png" alt=""></p>
<hr>
<p>[slaveDB]
mysql -u root -p</p>
<p>mariaDB[(none)]&gt;</p>
<pre><code>use pj; insert into user(name,password) values(&#39;XXX&#39;,&#39;XXX&#39;);</code></pre><br>
[masterDB]
systemctl start mariadb
mysql -u root -p

<p>mariaDB[(none)]&gt;</p>
<pre><code>use pj; select * from user;</code></pre><p># auto_failover로 인해 masterDB에도 저장되는 것을 확인할 수 있다
<img src="https://velog.velcdn.com/images/sanbon_8/post/19a2e8b7-5497-494d-9614-4b999509f6cd/image.png" alt=""></p>
<p># 단 master / slave 구조가 역으로 구성된다.
<img src="https://velog.velcdn.com/images/sanbon_8/post/9e980d61-1705-4ccf-90cc-9eb91a5803a6/image.png" alt=""></p>
<hr>
<p>[maxscale]
<span style="">maxctrl call command mariadbmon switchover MariaDB-Monitor server1 server2</span>
maxctrl list servers
# switchover 명령문으로 다시 M / S 구조가 원상태로 돌아간 것을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/sanbon_8/post/985197cb-602c-45fb-8167-046b673c15c2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3-Tier (DB Replication)]]></title>
            <link>https://velog.io/@sanbon_8/3-Tier-DB-Replication</link>
            <guid>https://velog.io/@sanbon_8/3-Tier-DB-Replication</guid>
            <pubDate>Wed, 27 Mar 2024 06:24:31 GMT</pubDate>
            <description><![CDATA[<h1 id="db-세팅">DB 세팅</h1>
<hr>
<p>[Master &amp; Slave DB]
<span style="color:black;">yum install -y mariadb mariadb-server</span>
<span style="color:black;">systemctl enable --now mariadb</span></p>
<hr>
<p>[Master DB]</p>
<p>vim /etc/my.cnf</p>
<pre><code>[mysqld]
log-bin = mysql-bin
server-id = 1</code></pre><p>systemctl restart mariadb
mysql -u root -p</p>
<p>MariaDB [(none)]&gt;</p>
<pre><code>grant all privileges on *.* to &#39;slave&#39;@&#39;%&#39; identified by &#39;0000&#39;;
flush privileges;
show master status;
select binlog_gtid_pos(MASTER_LOG_FILE, MASTER_LOG_POS);</code></pre><p># File명과 Position 번호 필요
<img src="https://velog.velcdn.com/images/sanbon_8/post/df3b174d-e81a-45d6-afdb-6c71f61e8d18/image.png" alt=""></p>
<hr>
<p>[Slave DB]</p>
<p>vim /etc/my.cnf</p>
<pre><code>[mysqld]
log-bin = mysql-bin
server-id = 2</code></pre><p>systemctl restart mariadb
mysql -u root -p</p>
<p>MariaDB [(none)]&gt;</p>
<pre><code>stop slave;

change master to
  master_host=&#39;masterDB_IP&#39;, # master서버 ip 주소
  master_user=&#39;slave&#39;, #master mysql 계정
  master_password=&#39;0000&#39;, # master mysql 계정 비밀번호
  master_use_gtid=slave_pos;

start slave;
show slave status\G;</code></pre><p># Slave_IO_Running, Slave_SQL_Running 둘다 Yes 들어오면 연결 성공
<img src="https://velog.velcdn.com/images/sanbon_8/post/ee927769-7b5a-4d25-b5b5-39f7e6c54821/image.png" alt=""></p>
<hr>
<br>
[Master DB]
mysql -u root -p

<p>MariaDB [(none)]&gt;</p>
<pre><code>create database pj;
use pj;
create table user(
    id int(10) auto_increment primary key,
    name varchar(20) not null,
    password varchar(20) not null);
insert into user(name,password) values(&#39;AAA&#39;,&#39;AAA&#39;);</code></pre><p><img src="https://velog.velcdn.com/images/sanbon_8/post/ba854dc6-7eca-4268-9b30-cf30168bd3e5/image.png" alt=""></p>
<hr>
<p>[Slave DB]
mysql -u root -p</p>
<p>MariaDB[(none)]&gt;</p>
<pre><code>use pj; select * from user;</code></pre><p># slave에 비동기 저장된 것을 확인 할 수 있다.</p>
<h1 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/2f736d77-70f5-43d1-99c6-2f0865ffc211/image.png" alt=""></h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[3-Tier (Session Clustering)]]></title>
            <link>https://velog.io/@sanbon_8/3-Tier-Session-Clustering</link>
            <guid>https://velog.io/@sanbon_8/3-Tier-Session-Clustering</guid>
            <pubDate>Wed, 27 Mar 2024 06:22:51 GMT</pubDate>
            <description><![CDATA[<p>WAS 1,2 서버의 세션을 공유함으로써 로그인같은 기능을 구현시 새로고침으로 로그아웃 되는 현상을 막을 수 있다.</p>
<hr>
<p>[WAS 1]
vim /usr/local/tomcat/conf/server.xml</p>
<pre><code># Engine name 블럭을 찾아 집어 넣는다

&lt;!-- clustering --&gt;
        &lt;Cluster className=&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot; channelSendOptions=&quot;8&quot;  channelStartOptions=&quot;3&quot;&gt;
                &lt;Manager className=&quot;org.apache.catalina.ha.session.DeltaManager&quot; expireSessionsOnShutdown=&quot;false&quot; notifyListenersOnReplication=&quot;true&quot;/&gt;
                &lt;Channel className=&quot;org.apache.catalina.tribes.group.GroupChannel&quot;&gt;
                        &lt;Sender className=&quot;org.apache.catalina.tribes.transport.ReplicationTransmitter&quot;&gt;
                                &lt;Transport className=&quot;org.apache.catalina.tribes.transport.nio.PooledParallelSender&quot; /&gt;
                        &lt;/Sender&gt;
                        &lt;Receiver className=&quot;org.apache.catalina.tribes.transport.nio.NioReceiver&quot;
                        address=&quot;WAS1_IP&quot;
                        port=&quot;4055&quot;
                        autoBind=&quot;0&quot;
                        selectorTimeout=&quot;5000&quot;
                        maxThreads=&quot;6&quot;/&gt;

                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor&quot; staticOnly=&quot;true&quot;/&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpFailureDetector&quot; /&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor&quot;&gt;
                        &lt;Member
                                className=&quot;org.apache.catalina.tribes.membership.StaticMember&quot;
                                port=&quot;4056&quot;
                                host=&quot;WAS2_IP&quot;
                                uniqueId=&quot;{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}&quot;
                        /&gt;
                        &lt;/Interceptor&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor&quot;/&gt;
                &lt;/Channel&gt;

                &lt;Valve className=&quot;org.apache.catalina.ha.tcp.ReplicationValve&quot; filter=&quot;.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;&quot; /&gt;
                &lt;Valve className=&quot;org.apache.catalina.ha.session.JvmRouteBinderValve&quot;/&gt;
                &lt;ClusterListener className=&quot;org.apache.catalina.ha.session.ClusterSessionListener&quot; /&gt;
        &lt;/Cluster&gt;
        &lt;!-- clustering  --&gt;</code></pre><br>
***

<p>[WAS 2]
vim /usr/local/tomcat/conf/server.xml</p>
<pre><code># Engine name 블럭을 찾아 집어 넣는다

&lt;!-- clustering --&gt;
        &lt;Cluster className=&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot; channelSendOptions=&quot;8&quot;  channelStartOptions=&quot;3&quot;&gt;
                &lt;Manager className=&quot;org.apache.catalina.ha.session.DeltaManager&quot; expireSessionsOnShutdown=&quot;false&quot; notifyListenersOnReplication=&quot;true&quot;/&gt;
                &lt;Channel className=&quot;org.apache.catalina.tribes.group.GroupChannel&quot;&gt;
                        &lt;Sender className=&quot;org.apache.catalina.tribes.transport.ReplicationTransmitter&quot;&gt;
                                &lt;Transport className=&quot;org.apache.catalina.tribes.transport.nio.PooledParallelSender&quot; /&gt;
                        &lt;/Sender&gt;
                        &lt;Receiver className=&quot;org.apache.catalina.tribes.transport.nio.NioReceiver&quot;
                        address=&quot;WAS2_IP&quot;
                        port=&quot;4055&quot;
                        autoBind=&quot;0&quot;
                        selectorTimeout=&quot;5000&quot;
                        maxThreads=&quot;6&quot;/&gt;

                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor&quot; staticOnly=&quot;true&quot;/&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpFailureDetector&quot; /&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor&quot;&gt;
                        &lt;Member
                                className=&quot;org.apache.catalina.tribes.membership.StaticMember&quot;
                                port=&quot;4056&quot;
                                host=&quot;WAS1_IP&quot;
                                uniqueId=&quot;{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}&quot;
                        /&gt;
                        &lt;/Interceptor&gt;
                        &lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor&quot;/&gt;
                &lt;/Channel&gt;

                &lt;Valve className=&quot;org.apache.catalina.ha.tcp.ReplicationValve&quot; filter=&quot;.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;&quot; /&gt;
                &lt;Valve className=&quot;org.apache.catalina.ha.session.JvmRouteBinderValve&quot;/&gt;
                &lt;ClusterListener className=&quot;org.apache.catalina.ha.session.ClusterSessionListener&quot; /&gt;
        &lt;/Cluster&gt;
        &lt;!-- clustering  --&gt;</code></pre><br>
***

<p>[WAS 1,2]
cd /usr/local/tomcat/webapps/ROOT/WEB-INF
vim web.xml</p>
<pre><code>#추가
&lt;distributable/&gt;</code></pre><br>
]]></description>
        </item>
        <item>
            <title><![CDATA[3-Tier (Web-WAS)]]></title>
            <link>https://velog.io/@sanbon_8/3-Tier-Web-WAS</link>
            <guid>https://velog.io/@sanbon_8/3-Tier-Web-WAS</guid>
            <pubDate>Wed, 27 Mar 2024 06:21:06 GMT</pubDate>
            <description><![CDATA[<h1 id="web---was-기본-세팅">Web - WAS 기본 세팅</h1>
<p>[Web 1,2]
yum install -y httpd
systemctl enable --now httpd
vi /etc/httpd/conf/httpd.conf</p>
<pre><code>ServerName &lt;WEB-Public-IP&gt;</code></pre><p>[Was 1,2]
# NaverCloudServer는 기본적으로 java 8(1.8)버전 -&gt; 호환하는 Tomcat 버전은 10.0.X까지
# 안정적인 Tomcat 9로 사용해보겠다</p>
<p>cd /usr/local
wget <a href="https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.86/bin/apache-tomcat-9.0.86.tar.gz">https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.86/bin/apache-tomcat-9.0.86.tar.gz</a>
tar -xzvf apache-tomcat-9.0.86.tar.gz
mv apache-tomcat-9.0.86 tomcat
vim /usr/lib/systemd/system/tomcat.service</p>
<pre><code>[Unit]
Description=tomcat
After=network.target syslog.target

[Service]
Type=forking

User=root
Group=root

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh

UMask=0007
RestartSec=10
Restart=always

SuccessExitStatus=143

[Install]
WantedBy=multi-user.target</code></pre><p><span style="color:#000000;"># source ~/.bash_profile</span>
systemctl enable --now tomcat</p>
<hr>
<h1 id="1-mod_jk를-사용할-시">1. Mod_JK를 사용할 시</h1>
<p>[Web 1,2]
yum install -y autoconf libtool gcc gcc-c++ httpd-devel
wget <a href="https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.49-src.tar.gz">https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.49-src.tar.gz</a>
tar -xvzf tomcat-connectors-1.2.49-src.tar.gz
mv tomcat-connectors-1.2.49-src tomcat-connectors
cd tomcat-connectors/native
./buildconf.sh
./configure --with-apxs=/bin/apxs
make &amp;&amp; make install</p>
<hr>
<br>
vim /etc/httpd/conf/httpd.conf

<pre><code>LoadModule jk_module modules/mod_jk.so

&lt;VirtualHost *:80&gt;
ServerName &lt;web-ip&gt;
DocumentRoot &quot;/var/www/html&quot;
ErrorLog &quot;logs/localhost-error_log&quot;
CustomLog &quot;logs/localhost-access_log&quot; common
JKUnMount /*.html tomcat
JkMount    / tomcat
&lt;/VirtualHost&gt;

Include /etc/httpd/conf.modules.d/mod_jk.conf</code></pre><hr>
<br>
#mod\_jk 활성화
vim /etc/httpd/conf.modules.d/mod\_jk.conf

<pre><code>&lt;IfModule jk_module&gt;
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkshmFile logs/mod_jk.shm
JkLogLevel info
JkLogStampFormat &quot;[%a %b %d %H:%M:%S %Y]&quot;
&lt;/IfModule&gt;</code></pre><hr>
<br>
#worker 파일 작성
vim /etc/httpd/conf/workers.properties

<pre><code>worker.list=tomcat

worker.tomcat.port=8009
worker.tomcat.host=&lt;in-nlb-ip&gt;
worker.tomcat.type=ajp13
worker.tomcat.lbfactor=1</code></pre><hr>
<br>
[Was]
\# 설정 파일
vim /usr/local/tomcat/conf/server.xml

<pre><code># 아래 내용의 주석 내용을 삭제
# 해당 블록을 찾아 &#39;URIEncoding=&quot;UTF-8&quot;&#39;를 넣어주자
&lt;Connector protocol=&quot;AJP/1.3&quot;
           address=&quot;0.0.0.0&quot;
           port=&quot;8009&quot;
           redirectPort=&quot;8443&quot; 
           maxParameterCount=&quot;1000&quot;
           secretRequired=&quot;false&quot;
           /&gt;</code></pre><p>systemctl restart tomcat</p>
<h1 id="2-mod_proxy를-사용할-시">2. Mod_Proxy를 사용할 시</h1>
<p>Mod_proxy로 하려면! (NLB 말고 ALB 가능하다!!)
vim /etc/httpd/conf/httpd.conf</p>
<pre><code>&lt;VirtualHost *:80&gt;
    ProxyRequests Off
    ProxyPreserveHost On
    &lt;Proxy *&gt;
        Order deny,allow
        Allow from all
    &lt;/Proxy&gt;
    ProxyPass / http://10.10.2.6:8080/ disablereuse=on
    ProxyPassReverse / http://10.10.2.6:8080/
&lt;/VirtualHost&gt;

# ServerName도 주석제거하고 자기 IP 번호로 변경</code></pre><hr>
<br>
[Was 1,2]
\# 설정 파일
vim /usr/local/tomcat/conf/server.xml

<pre><code># 아래 내용의 주석 내용을 삭제
# 해당 블록을 찾아 &#39;URIEncoding=&quot;UTF-8&quot;&#39;를 넣어주자
&lt;Connector port=&quot;8080&quot; protocol=&quot;HTTP/1.1&quot;
               URIEncoding=&quot;UTF-8&quot; 
               connectionTimeout=&quot;20000&quot;
               redirectPort=&quot;8443&quot;
               maxParameterCount=&quot;1000&quot;
               /&gt;</code></pre><p>systemctl restart tomcat</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[메가존 클라우드 채용확정형 과정 2기 세미 프로젝트 2차 - 구현 과정 및 결과]]></title>
            <link>https://velog.io/@sanbon_8/semi-project2-scripts</link>
            <guid>https://velog.io/@sanbon_8/semi-project2-scripts</guid>
            <pubDate>Thu, 11 May 2023 15:28:59 GMT</pubDate>
            <description><![CDATA[<h1 id="1-gcp">1. GCP</h1>
<h2 id="11-인프라-구축">1.1 인프라 구축</h2>
<h3 id="111-vpc">1.1.1 VPC</h3>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/62c57ed6-f990-4c1b-9be3-b24a55e160f8/image.PNG" alt=""></h6>
<p>네트워크 만들기</p>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/da7a0ebe-56f9-439f-bea4-845cb563f694/image.PNG" alt=""></h6>
<p>이름: tokyo-vpc
서브넷: 커스텀</p>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/2cf350f9-8b4b-4f54-a84a-e6ef4aa7837b/image.PNG" alt=""></h6>
<h4 id="subnet01">subnet01</h4>
<p>이름: tokyo-subnet01
리전: asia-northeast1
IPv4 범위: 10.127.0.0/22
완료</p>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/1e00a23e-fb83-496e-921b-287b5547a560/image.PNG" alt=""></h6>
<p>이름: tokyo-subnet02
리전: asia-northeast1
IPv4 범위: 10.127.4.0/22
완료</p>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/d376683f-424b-444b-95cd-b8058c552102/image.PNG" alt=""></h6>
<p>방화벽 규칙 전부 체크
만들기</p>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/8145b57c-5069-436c-a816-84fe7fa830cc/image.PNG" alt=""></h6>
<p>결과</p>
<h3 id="112-인스턴스">1.1.2 인스턴스</h3>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/a603b793-cee3-40c5-ac1a-f236af58d843/image.PNG" alt=""></h6>
<p>인스턴스 만들기</p>
<h4 id="1121-gcp-tokyo-web01">1.1.2.1 gcp-tokyo-web01</h4>
<h6 id="-7"><img src="https://velog.velcdn.com/images/sanbon_8/post/6bf1ba76-7b17-428f-a259-c7612d0886f2/image.PNG" alt=""></h6>
<p>이름: gcp-tokyo-web01
리전: asia-northeast1 (도쿄)
영역: asia-northeast1-a
머신 유형: e2-micro</p>
<h6 id="-8"><img src="https://velog.velcdn.com/images/sanbon_8/post/9c841ab0-17ac-4d78-9e06-2fbbed9ee09f/image.PNG" alt=""></h6>
<p>부팅 디스크 -&gt; 변경
공개 이미지
운영체제: CentOS
버전: CentOS 7
크기: 20GB
선택</p>
<h6 id="-9"><img src="https://velog.velcdn.com/images/sanbon_8/post/8b8f30ae-49a2-45f4-9575-d5dc4abf2e5b/image.PNG" alt=""></h6>
<p>네트워크 인터페이스
네트워크 인터페이스 수정
네트워크: tokyo-vpc
서브 네트워크: tokyo-subnet01
외부 IPv4 주소: 없음
완료</p>
<h6 id="-10"><img src="https://velog.velcdn.com/images/sanbon_8/post/9f6bc328-9192-471a-837c-84bcee47a078/image.PNG" alt=""></h6>
<p>시작 스크립트</p>
<pre><code>#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo &quot;&lt;h1&gt;tokyo-web01&lt;/h1&gt;&quot; &gt; /var/www/html/index.html</code></pre><h4 id="1122-gcp-tokyo-web01">1.1.2.2 gcp-tokyo-web01</h4>
<h6 id="-11"><img src="https://velog.velcdn.com/images/sanbon_8/post/25896ce1-eaae-4573-861d-8d3906e8abee/image.PNG" alt=""></h6>
<p>이름: gcp-tokyo-web02
리전: asia-northeast1 (도쿄)
영역: asia-northeast1-c
머신 유형: e2-micro</p>
<h6 id="-12"><img src="https://velog.velcdn.com/images/sanbon_8/post/0a5fb729-d9bc-45b8-9832-c456e5299588/image.PNG" alt=""></h6>
<p>부팅 디스크 -&gt; 변경
공개 이미지
운영체제: CentOS
버전: CentOS 7
크기: 20GB
선택</p>
<h6 id="-13"><img src="https://velog.velcdn.com/images/sanbon_8/post/8acf20db-b77e-4f2a-9a05-8275c1e18266/image.PNG" alt=""></h6>
<p>네트워크 인터페이스
네트워크 인터페이스 수정
네트워크: tokyo-vpc
서브 네트워크: tokyo-subnet02
외부 IPv4 주소: 없음
완료</p>
<h6 id="-14"><img src="https://velog.velcdn.com/images/sanbon_8/post/95e61a61-2bd4-4e1b-87cd-330b49909c58/image.PNG" alt=""></h6>
<p>시작 스크립트</p>
<pre><code>#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo &quot;&lt;h1&gt;tokyo-web02&lt;/h1&gt;&quot; &gt; /var/www/html/index.html</code></pre><h2 id="12-aws-gcp-vpn-연결">1.2 AWS GCP VPN 연결</h2>
<h3 id="121-gcp-고정-ip-주소-할당">1.2.1 GCP 고정 IP 주소 할당</h3>
<h6 id="-15"><img src="https://velog.velcdn.com/images/sanbon_8/post/21ad1469-b6cf-4c9a-af6f-dad4e459331f/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/4cc9792e-320b-411d-8f66-db3e079a1333/image.PNG" alt=""></h6>
<p>이름: gcp-vp
리전: asia-northeast1
예약</p>
<h6 id="-16"><img src="https://velog.velcdn.com/images/sanbon_8/post/9a6f3b60-0cee-4573-8997-3446997aa681/image.PNG" alt=""></h6>
<p>할당 받은 IP: 35.187.203.206</p>
<h3 id="122-aws-고객-게이트웨이-생성">1.2.2 AWS 고객 게이트웨이 생성</h3>
<h6 id="-17"><img src="https://velog.velcdn.com/images/sanbon_8/post/97965614-e4b1-45af-b7fb-b10801ae08d4/image.PNG" alt=""></h6>
<p>이름: aws-gcp-cgw
IP 주소: <code>gcp-vp ip</code> (35.187.203.206) </p>
<h6 id="-18"><img src="https://velog.velcdn.com/images/sanbon_8/post/db1c8d63-f702-4c90-a49d-398f9955d127/image.PNG" alt=""></h6>
<h3 id="123-aws-가상-프라이빗-게이트웨이-확인">1.2.3 AWS 가상 프라이빗 게이트웨이 확인<img src="https://velog.velcdn.com/images/sanbon_8/post/cebf51af-4915-4af7-a291-ded23505291d/image.PNG" alt=""></h3>
<p>기존에 OpenStack VPN 연결에 사용했던 프라이빗 게이트웨이 사용(center04-vgw)</p>
<h3 id="124-aws-vpn-연결-생성">1.2.4 AWS VPN 연결 생성</h3>
<h6 id="-19"><img src="https://velog.velcdn.com/images/sanbon_8/post/7f650fba-af84-4634-9eeb-ef60cda0a107/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/769b339c-2faf-427e-945a-4c659d7dfe1f/image.PNG" alt=""></h6>
<p>공급업체: Generic
다운로드</p>
<blockquote>
</blockquote>
<h3 id="vpn-04e4b1510414f79e3txt">vpn-04e4b1510414f79e3.txt</h3>
<blockquote>
</blockquote>
<p>IKE version: <code>IKEv2</code></p>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<h5 id="ipsec-tunnel-1">IPSec Tunnel #1</h5>
<p>Pre-Shared Key: <code>AwrRicXOs8YiHKtKYr7oBtUT2BkfRxcS</code>
Outside IP Addresses-Virtual Private Gateway: <code>43.200.210.83</code></p>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<h5 id="ipsec-tunnel-2">IPSec Tunnel #2</h5>
<p>Pre-Shared Key: <code>pJLBhDTHrj959Oge7UAuE4tnQzK5bJ88</code>
Outside IP Addresses-Virtual Private Gateway: <code>52.78.67.73</code></p>
<h3 id="125-gcp-vpn-gateway-생성">1.2.5 GCP VPN Gateway 생성</h3>
<h6 id="-20"><img src="https://velog.velcdn.com/images/sanbon_8/post/7ee7d2f7-ed03-4557-a0c5-8815269779a7/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/2786382d-7aa4-47d8-8604-42640f89151a/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/c5fbe277-a3a4-4748-8b50-68fd1c4557b8/image.PNG" alt=""></h6>
<p>이름: gcp-aws-vgw
네트워크: tokyo-vpc
리전: asia-northeast1(도쿄)
IP 주소: <code>gcp-vp ip</code> (35.187.203.206)</p>
<h6 id="-21"><img src="https://velog.velcdn.com/images/sanbon_8/post/c88e19e0-0ac9-4d3e-b4e4-2b1e2a92f1c8/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/95d76c20-71ea-4a01-b5d9-1f6fe8f7f68d/image.PNG" alt=""></h6>
<p>이름: vpn-1-tunnel-1
원격 피어 IP 주소: 43.200.210.83
IKE 버전: IKEv2
IKE 사전 공유 키: AwrRicXOs8YiHKtKYr7oBtUT2BkfRxcS
라우팅 옵션: 라우팅 기반
원격 네트워크 IP 범위: <code>AWS VPC 범위</code> (10.35.0.0/16)
완료</p>
<h6 id="-22"><img src="https://velog.velcdn.com/images/sanbon_8/post/c88e19e0-0ac9-4d3e-b4e4-2b1e2a92f1c8/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/95d76c20-71ea-4a01-b5d9-1f6fe8f7f68d/image.PNG" alt=""></h6>
<p>이름: vpn-1-tunnel-2
원격 피어 IP 주소: 52.78.67.73
IKE 버전: IKEv2
IKE 사전 공유 키: pJLBhDTHrj959Oge7UAuE4tnQzK5bJ88
라우팅 옵션: 라우팅 기반
원격 네트워크 IP 범위: <code>AWS VPC 범위</code> (10.35.0.0/16)
완료</p>
<h6 id="-23"><img src="https://velog.velcdn.com/images/sanbon_8/post/8076afb3-257c-4322-9dc7-49e2c0aa3961/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/a8c90c8e-1de7-4567-84c4-c6fe01070afe/image.PNG" alt=""></h6>
<p>생성 결과</p>
<h3 id="126-aws-라우팅-테이블-라우팅-편집">1.2.6 AWS 라우팅 테이블 라우팅 편집</h3>
<h6 id="-24"><img src="https://velog.velcdn.com/images/sanbon_8/post/c09ee524-064b-4d3f-93cf-ff564215d1b7/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/c950c768-bd85-433e-9d3c-0f714fccccdd/image.PNG" alt=""></h6>
<blockquote>
<p>destination: 10.127.0.0/22
target: vpn gatway</p>
</blockquote>
<blockquote>
<p>destination: 10.127.0.0/22
target: vpn gatway</p>
</blockquote>
<p>라우팅 추가</p>
<h3 id="127-보안-그룹-인바운드-규칙-편집">1.2.7 보안 그룹 인바운드 규칙 편집</h3>
<h6 id="-25"><img src="https://velog.velcdn.com/images/sanbon_8/post/319c5ae6-e1c1-465b-9337-46e7426853c8/image.PNG" alt=""></h6>
<p>gcp-vpc 가용영역 ICMP 규칙 허용</p>
<h3 id="128-gcp-vpc-방화벽-규칙-확인">1.2.8 GCP VPC 방화벽 규칙 확인</h3>
<h6 id="-26"><img src="https://velog.velcdn.com/images/sanbon_8/post/0ea9f24b-faee-49e1-934f-c7ee81f4ecf9/image.PNG" alt=""></h6>
<h1 id="2-cloudwatch">2. CloudWatch</h1>
<h2 id="21-opnestack-서버-및-gcp-인스턴스-cwagent-설치">2.1 OpneStack 서버 및 GCP 인스턴스 CWAgent 설치</h2>
<pre><code>sudo su

yum install –y wget unzip

wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm
sudo rpm -U ./amazon-cloudwatch-agent.rpm

mkdir ~/.aws
vi ~/.aws/credentials
[AmazonCloudWatchAgent] 
aws_access_key_id = [Access_Key]
aws_secret_access_key = [Secret_Access_Key]
region = ap-northeast-2

vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
[credentials]
   shared_credential_profile = &quot;AmazonCloudWatchAgent&quot;
   shared_credential_file = &quot;/root/.aws/credentials&quot;

curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
unzip awscliv2.zip
./aws/install

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
#설정 시작
#linux -&gt; On-Premises -&gt; 쭉 디폴트로 진행 
#-&gt; Log file path 에 &#39;/home/centos/logs/**.log&#39; 입력
#더이상 추가할 파일 없고 SSM 파라미터 스토어에 저장하지 않는다로 마무리

#생성한 설정 파일 확인하려면
vi /opt/aws/amazon-cloudwatch-agent/bin/config.json

mkdir -p /usr/share/collectd/ &amp;&amp; touch /usr/share/collectd/types.db

systemctl enable —now amazon-cloudwatch-agent

#실행 명령어
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

※ 처음은 system상 amazon-cloudwatch-agent.service가 실행되고 있지 않기 때문에 &#39;stopped&#39; 상태가 됐을시에 한번 더 실행시켜준다.

#중지 명령어
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a stop

#CloudWatchAgent 로그 경로
/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log</code></pre><h2 id="22-sns-주제-및-구독-생성">2.2 sns 주제 및 구독 생성</h2>
<h2 id="23-경보-생성">2.3 경보 생성</h2>
<h6 id="-27"><img src="https://velog.velcdn.com/images/sanbon_8/post/68127119-c035-4fa3-8f73-510e56827265/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/f6221516-a713-4cf2-90a1-d5355be60430/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/8a3d4a7e-e793-4d5c-8344-a0263e243e8b/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/6ba4637a-08c8-42b7-854a-fd039d8c034e/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/8980ad14-c3f5-4924-acd1-6952130203b5/image.PNG" alt=""></h6>
<p>경보 이름: gcp-web01-cpu-util-alarm
다음</p>
<h6 id="-28"><img src="https://velog.velcdn.com/images/sanbon_8/post/74eaed94-abd5-4d70-8253-b6c1b92eca4c/image.PNG" alt=""></h6>
<p>경보 생성</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.13 Cloud Computing 8]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.13-Cloud-Computing-8</link>
            <guid>https://velog.io/@sanbon_8/2023.04.13-Cloud-Computing-8</guid>
            <pubDate>Thu, 13 Apr 2023 11:14:57 GMT</pubDate>
            <description><![CDATA[<h1 id="vpc">VPC</h1>
<blockquote>
<p>Virtual Private Cloud
사용자의 AWS 계정 전용 가상 네트워크</p>
</blockquote>
<h2 id="1-보안-그룹-설정">1. 보안 그룹 설정</h2>
<p>vpc 생성 전 전용 가상 네트워크 인바운드 규칙을 설정하여 사용할 수 있도록 한다.</p>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/9aecbd0f-bc05-45f6-b76c-891595283493/image.PNG" alt=""></h6>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/60981111-e529-48e5-a5b4-f3ce5d55e374/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/a640411b-93c4-4e9c-ad61-eee5fa224769/image.PNG" alt=""></h6>
<h2 id="2-vpc-생성">2. VPC 생성</h2>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/a5dd86a7-5363-47f8-852e-751d24058345/image.PNG" alt=""></h6>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/63196f6c-9744-42ce-9938-70f70866e89b/image.PNG" alt=""></h6>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/d5f05ecd-87e0-4a82-9f98-5e8c80539c2a/image.PNG" alt=""></h6>
<h2 id="3-서브넷-생성">3. 서브넷 생성</h2>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/b04bd1cf-b26e-454f-bccd-47ca35e9292a/image.PNG" alt=""></h6>
<h6 id="-7"><img src="https://velog.velcdn.com/images/sanbon_8/post/a6e0b093-11a2-48c0-96f0-20fa64171a1b/image.PNG" alt=""></h6>
<h6 id="-8"><img src="https://velog.velcdn.com/images/sanbon_8/post/8217ec32-d426-4a12-a4cc-e252a6496589/image.PNG" alt=""></h6>
<h6 id="-9"><img src="https://velog.velcdn.com/images/sanbon_8/post/7a516501-06cd-40f8-bc5f-f03320524eee/image.PNG" alt=""></h6>
<h6 id="-10"><img src="https://velog.velcdn.com/images/sanbon_8/post/22bef620-e9fa-48d0-b080-ee3dc504f131/image.PNG" alt=""></h6>
<h6 id="-11"><img src="https://velog.velcdn.com/images/sanbon_8/post/eec8ca69-dc82-4d1d-9d55-c8e16d06dc33/image.PNG" alt=""></h6>
<h6 id="-12"><img src="https://velog.velcdn.com/images/sanbon_8/post/e3bba7cd-8dd2-4071-9b8a-a63f87fd02db/image.PNG" alt=""></h6>
<h6 id="-13"><img src="https://velog.velcdn.com/images/sanbon_8/post/2af87088-059f-418d-824b-0ecb81b5bc51/image.PNG" alt=""></h6>
<ul>
<li>결과<h6 id="-14"><img src="https://velog.velcdn.com/images/sanbon_8/post/ce3383f3-cdf7-4c7d-be56-d9b89aa66e1f/image.PNG" alt=""></h6>
</li>
</ul>
<h2 id="3-인터넷-게이트웨이-생성">3. 인터넷 게이트웨이 생성</h2>
<h6 id="-15"><img src="https://velog.velcdn.com/images/sanbon_8/post/6a92c420-27e4-4272-bbd4-7ac78c35871e/image.PNG" alt=""></h6>
<h6 id="-16"><img src="https://velog.velcdn.com/images/sanbon_8/post/a8d8f9e1-cb57-4a69-a27f-e8cf45dfa2fd/image.PNG" alt=""></h6>
<h2 id="4-생성한-게이트웨이를-vpc에-연결">4. 생성한 게이트웨이를 VPC에 연결</h2>
<h6 id="-17"><img src="https://velog.velcdn.com/images/sanbon_8/post/eab5f5a6-1c10-4835-aeb2-b67c26fec699/image.PNG" alt=""></h6>
<h6 id="-18"><img src="https://velog.velcdn.com/images/sanbon_8/post/ec261033-c908-4685-abf5-88ffc13c1ce9/image.PNG" alt=""></h6>
<h6 id="-19"><img src="https://velog.velcdn.com/images/sanbon_8/post/acd437c1-66b1-4bd3-80b7-d78d28e76986/image.PNG" alt=""></h6>
<h2 id="5-라우팅-테이블-생성">5. 라우팅 테이블 생성</h2>
<h6 id="-20"><img src="https://velog.velcdn.com/images/sanbon_8/post/d811e76b-46d8-422e-b458-2004c38fca55/image.PNG" alt=""></h6>
<h6 id="-21"><img src="https://velog.velcdn.com/images/sanbon_8/post/f466059b-74ac-4c7c-99cb-81bd5ddfd5cf/image.PNG" alt=""></h6>
<blockquote>
<p>0.0.0.0/0 설정을 통해 어디서든지 어떤 IP던 간에 사용할 수 있도록 설정</p>
</blockquote>
</br>

<h6 id="-22"><img src="https://velog.velcdn.com/images/sanbon_8/post/210e6d6c-5145-47c1-8842-04163d32253c/image.PNG" alt=""></h6>
<h6 id="-23"><img src="https://velog.velcdn.com/images/sanbon_8/post/8b65839b-e9f2-4bf3-ac78-31eeb4722acb/image.PNG" alt=""></h6>
<h6 id="-24"><img src="https://velog.velcdn.com/images/sanbon_8/post/d39ea8bc-06a0-4831-b051-4cf092c10f2c/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/11dbec7d-b767-4ed1-a7b1-10b6e903dcc0/image.PNG" alt=""></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.13 Cloud Computing 7]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.13-Cloud-Computing-7</link>
            <guid>https://velog.io/@sanbon_8/2023.04.13-Cloud-Computing-7</guid>
            <pubDate>Thu, 13 Apr 2023 08:15:44 GMT</pubDate>
            <description><![CDATA[<h1 id="ec2-ami">EC2 AMI</h1>
<h2 id="1-이미지-생성-ami">1. 이미지 생성 (AMI)</h2>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/566678ac-4a19-4224-ad25-0807953e8bba/image.PNG" alt=""></h6>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/44c07821-4a56-4b5c-a546-4cba63f1f417/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/f3449af0-fb78-42ee-aa9d-e6eefa2e52e5/image.PNG" alt=""></h6>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/265f273b-bd23-441a-8617-236175982eee/image.PNG" alt=""></h6>
<h2 id="2-ami로-인스턴스-시작하기">2. AMI로 인스턴스 시작하기</h2>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/a64ac285-e590-4a64-ac8f-c4cdacd74e48/image.PNG" alt=""></h6>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/26325a31-3c80-4275-82a2-8f7055147eb9/image.PNG" alt=""></h6>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/a057d082-99fd-44af-b272-4e7f766a9e94/image.PNG" alt=""></h6>
<h6 id="-7"><img src="https://velog.velcdn.com/images/sanbon_8/post/29edcbb9-2160-40cf-b542-bb5c4f1b6cc1/image.PNG" alt=""></h6>
<h6 id="-8"><img src="https://velog.velcdn.com/images/sanbon_8/post/23ac257b-eba4-49e5-b9b1-92024abcdb5b/image.PNG" alt=""></h6>
<h2 id="3-시작-템플릿-만들기-auto-scaling-기초">3. 시작 템플릿 만들기 (auto scaling 기초)</h2>
<h6 id="-9"><img src="https://velog.velcdn.com/images/sanbon_8/post/816d4dd0-a944-476c-ac37-4f6a4158834c/image.PNG" alt=""></h6>
<h6 id="-10"><img src="https://velog.velcdn.com/images/sanbon_8/post/99530095-553b-4263-8b4c-c7e0b4e5e878/image.PNG" alt=""></h6>
<h6 id="-11"><img src="https://velog.velcdn.com/images/sanbon_8/post/fab04b65-cffa-442e-b38c-b0bcded1f224/image.PNG" alt=""></h6>
<h6 id="-12"><img src="https://velog.velcdn.com/images/sanbon_8/post/f6c1b659-fd85-46a7-a83c-251ee481df6e/image.PNG" alt=""></h6>
<h6 id="-13"><img src="https://velog.velcdn.com/images/sanbon_8/post/8595cb98-d3df-48f0-bea9-7d27982e23a2/image.PNG" alt=""></h6>
<h6 id="-14"><img src="https://velog.velcdn.com/images/sanbon_8/post/c532b6a3-ed00-4e41-a0ee-968ac49a49ec/image.PNG" alt=""></h6>
<h6 id="-15"><img src="https://velog.velcdn.com/images/sanbon_8/post/b01cda2b-930e-4e92-ae1c-2b5ee461301f/image.PNG" alt=""></h6>
<h6 id="-16"><img src="https://velog.velcdn.com/images/sanbon_8/post/2808a3e6-34bb-4cec-b429-3dd23a255df6/image.PNG" alt=""></h6>
<h2 id="4-시작-템플릿으로-인스턴스-시작하기">4. 시작 템플릿으로 인스턴스 시작하기</h2>
<h6 id="-17"><img src="https://velog.velcdn.com/images/sanbon_8/post/38097ff0-59f2-4f76-b1b0-098739409f09/image.PNG" alt=""></h6>
<h6 id="-18"><img src="https://velog.velcdn.com/images/sanbon_8/post/8bbf7050-5562-4f6b-b511-4123245864e9/image.PNG" alt=""></h6>
<h6 id="-19"><img src="https://velog.velcdn.com/images/sanbon_8/post/06e160e1-6eeb-4652-8b1d-162cbacfc738/image.PNG" alt=""></h6>
<h6 id="-20"><img src="https://velog.velcdn.com/images/sanbon_8/post/5c4a8378-b930-4c66-8e9d-bb7d06c61718/image.PNG" alt=""></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.12 Cloud Computing 6]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-6</link>
            <guid>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-6</guid>
            <pubDate>Wed, 12 Apr 2023 10:33:44 GMT</pubDate>
            <description><![CDATA[<h1 id="s3">S3</h1>
<h2 id="s3-생성">S3 생성</h2>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/eaf764c8-5884-4cf9-adb8-f6c6f0539ea2/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/f9c2800f-fe69-4774-b028-df8ac9ab147b/image.PNG" alt=""></h6>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/bc94d420-cb91-4392-80f7-efa3daedd65b/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/b9b4f2ba-b2e6-44a2-acb3-14ae86edd96b/image.PNG" alt=""></h6>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/92033bfb-7bb9-45e2-9a69-4cb21810aa6f/image.PNG" alt=""></h6>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/600c224e-4f1e-4a77-8d2e-da78875dd86e/image.PNG" alt=""></h6>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/fc58d41c-e6e7-4491-a8d1-6656fa138f4f/image.PNG" alt=""></h6>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/4c01e978-0241-40ca-9086-8514965a67bb/image.PNG" alt=""></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.12 Cloud Computing 5]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-5</link>
            <guid>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-5</guid>
            <pubDate>Wed, 12 Apr 2023 10:17:31 GMT</pubDate>
            <description><![CDATA[<h1 id="efs">EFS</h1>
<h2 id="1-efs-생성">1. EFS 생성</h2>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/53425ea4-dae3-4eec-a01b-b5021a19c50c/image.PNG" alt=""></h6>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/34f699ba-9a19-42ca-b7b8-a86f61fe50fe/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/0975f66c-5cc7-4725-bec2-90c144a2798d/image.PNG" alt=""></h6>
<h2 id="2-efs-보안그룹-설정-nfs">2. EFS 보안그룹 설정 (nfs)</h2>
<h3 id="1-보안그룹-efs를-위한-nfs-규칙-만들기">1) 보안그룹 efs를 위한 nfs 규칙 만들기</h3>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/97155d00-da7d-49de-96c2-60e83043862f/image.PNG" alt=""></h6>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/87a9c51f-8b30-4e24-8e58-2dae26c6228f/image.PNG" alt=""></h6>
<h3 id="2-가용-영역-보안그룹-default---efs내가-만든-보안-그룹">2) 가용 영역 보안그룹 Default -&gt; efs(내가 만든 보안 그룹)</h3>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/f9ecadb7-c080-491c-a8dd-4c743fc81a09/image.PNG" alt=""></h6>
<h2 id="3-ec2와-연결-확인">3. EC2와 연결 확인</h2>
<h3 id="1-연결-할-ec2-서버-접속">1) 연결 할 EC2 서버 접속</h3>
<pre><code>mkdir efs
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0f43337d9fff133ab.efs.ap-northeast-2.amazonaws.com:/ efs</code></pre><p><img src="https://velog.velcdn.com/images/sanbon_8/post/bc666552-8b34-4434-b9ac-8789b0d56020/image.PNG" alt=""><code>sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0f43337d9fff133ab.efs.ap-northeast-2.amazonaws.com:/ efs</code></p>
<p>해당 명령어는 빨간 네모칸에 있는 코드를 복사한 것이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.12 Cloud Computing 4]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-4</link>
            <guid>https://velog.io/@sanbon_8/2023.04.12-Cloud-Computing-4</guid>
            <pubDate>Wed, 12 Apr 2023 08:49:09 GMT</pubDate>
            <description><![CDATA[<h1 id="스토리지-서비스">스토리지 서비스</h1>
<blockquote>
<p>데이터 스토리지를 서비스로서 관리하고 운영하는 클라우드 컴퓨팅 공급자를 통해
데이터를 인터넷에 저장하는 클라우드 컴퓨팅 모델</p>
</blockquote>
<h2 id="1-ebs">1. EBS</h2>
<blockquote>
<p>EBS: Elastice Storage Service</p>
</blockquote>
<h3 id="1-볼륨-생성">1) 볼륨 생성</h3>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/8ec7c90e-9918-49fb-908a-b303c9ad2c0c/image.PNG" alt=""></h6>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/417f301b-c37b-4040-840b-bd31dfb92715/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/fadbf253-3528-4245-8d9a-a61b9a2125ca/image.PNG" alt=""></h6>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/e8f2b4ec-3e80-4522-9839-8f3207d7c7ed/image.PNG" alt=""></h6>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/78909490-5f3a-4e62-b406-cfe8485fbe92/image.PNG" alt=""></h6>
<h3 id="2-볼륨-연결">2) 볼륨 연결</h3>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/71c060f8-7eb3-4f51-9e65-61aaca29b779/image.PNG" alt=""></h6>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/1295efcc-a871-4a60-8870-d649a0b7c4a4/image.PNG" alt=""></h6>
<h6 id="-7"><img src="https://velog.velcdn.com/images/sanbon_8/post/91e2cc43-ff29-4382-bff2-b764e7bc8811/image.PNG" alt=""></h6>
<h3 id="3-스냅샷-생성">3) 스냅샷 생성</h3>
<h6 id="-8"><img src="https://velog.velcdn.com/images/sanbon_8/post/6cde5706-b043-43ef-a04a-d42f5e2f6512/image.PNG" alt=""></h6>
<h6 id="-9"><img src="https://velog.velcdn.com/images/sanbon_8/post/b894ab00-d0e5-44cf-abe6-e59ce0c67daa/image.PNG" alt=""></h6>
<h6 id="-10"><img src="https://velog.velcdn.com/images/sanbon_8/post/8a1417b0-49e6-4f81-b46a-01b4f9cda7b6/image.PNG" alt=""></h6>
<h3 id="4-스냅샷을-통한-볼륨-생성-및-연결">4) 스냅샷을 통한 볼륨 생성 및 연결</h3>
<h6 id="-11"><img src="https://velog.velcdn.com/images/sanbon_8/post/4e641b23-4a87-41cf-94a2-59db4bb92c36/image.PNG" alt=""></h6>
<h6 id="-12"><img src="https://velog.velcdn.com/images/sanbon_8/post/9fa9cc5a-92ee-442b-bb02-366faee73227/image.PNG" alt=""></h6>
<h6 id="-13"><img src="https://velog.velcdn.com/images/sanbon_8/post/b8658d26-e5f7-40a6-bd2c-c63f86513dbb/image.PNG" alt=""></h6>
<p>가용 영역 변경해서 EC2-web02 서버 볼륨으로 사용</p>
<h6 id="-14"><img src="https://velog.velcdn.com/images/sanbon_8/post/e1018120-0065-405d-953f-5b645067c36e/image.PNG" alt=""></h6>
<h6 id="-15"><img src="https://velog.velcdn.com/images/sanbon_8/post/093827c7-112f-4a2e-baf9-284903781523/image.PNG" alt=""></h6>
<h6 id="-16"><img src="https://velog.velcdn.com/images/sanbon_8/post/e40f11b1-9136-4a30-a593-89d8ea0b95ff/image.PNG" alt=""></h6>
<h6 id="-17"><img src="https://velog.velcdn.com/images/sanbon_8/post/1efbff75-01a3-48c3-b527-5d26fbcae7ab/image.PNG" alt=""></h6>
<h3 id="5-스냅샷-복사를-통한-지역-변경-및-볼륨-생성">5) 스냅샷 복사를 통한 지역 변경 및 볼륨 생성</h3>
<h6 id="-18"><img src="https://velog.velcdn.com/images/sanbon_8/post/9b64a53e-63ab-40d3-a086-3c28258385af/image.PNG" alt=""></h6>
<h6 id="-19"><img src="https://velog.velcdn.com/images/sanbon_8/post/b39116d5-e226-4acf-805c-84e3332ac26d/image.PNG" alt=""></h6>
<h6 id="-20"><img src="https://velog.velcdn.com/images/sanbon_8/post/2a587ed7-6563-494e-ac0a-43001eb74ffd/image.PNG" alt=""></h6>
<h6 id="-21"><img src="https://velog.velcdn.com/images/sanbon_8/post/61b8093f-8aea-471d-b254-063d40709288/image.PNG" alt=""></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.11 Cloud Computing 3]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.11-Cloud-Computing-3</link>
            <guid>https://velog.io/@sanbon_8/2023.04.11-Cloud-Computing-3</guid>
            <pubDate>Tue, 11 Apr 2023 12:44:15 GMT</pubDate>
            <description><![CDATA[<h1 id="ec2">EC2</h1>
<blockquote>
<p>EC2: Amazon Elastic Compute Cloud
사용자가 가상 컴퓨터를 임대 받아 그 위에 자신만의 컴퓨터 애플리케이션들을
실행할 수 있게 하는 서비스</p>
</blockquote>
<h2 id="1-ec2-관련-페이지-접속">1. EC2 관련 페이지 접속</h2>
<h6 id=""><img src="https://velog.velcdn.com/images/sanbon_8/post/83b6676e-8ff3-4d9b-83b1-a75276792cb2/image.PNG" alt=""></h6>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/b5663d1c-fc73-48b0-8862-1e8b935f11ac/image.PNG" alt=""></p>
<h2 id="2-ec2---보안그룹">2. EC2 - 보안그룹</h2>
<h6 id="-1"><img src="https://velog.velcdn.com/images/sanbon_8/post/b7d1f1df-3b3c-4c34-8462-f03bd89864bd/image.PNG" alt=""></h6>
<h6 id="-2"><img src="https://velog.velcdn.com/images/sanbon_8/post/751d97cb-ebd7-48ac-9881-24cb47bb4ad3/image.PNG" alt=""></h6>
<h2 id="3-ec2---인스턴스-유형">3. EC2 - 인스턴스 유형</h2>
<h6 id="-3"><img src="https://velog.velcdn.com/images/sanbon_8/post/d1223e5e-fe1b-4f48-831b-13cd7f3d3032/image.PNG" alt=""></h6>
<blockquote>
<p><code>t2.nano</code> <code>t2.micro</code> : Free Tier</p>
</blockquote>
<h2 id="4-ec2---인스턴스-통합-제어-기능">4. EC2 - 인스턴스 통합 제어 기능</h2>
<h6 id="-4"><img src="https://velog.velcdn.com/images/sanbon_8/post/3054d27d-ceea-45d5-820d-3e1c6548d627/image.PNG" alt=""></h6>
<h2 id="5-ec2---인스턴스-시작">5. EC2 - 인스턴스 시작</h2>
<h3 id="1-name-and-tags">1) Name and tags</h3>
<h6 id="-5"><img src="https://velog.velcdn.com/images/sanbon_8/post/bca6bee1-58a0-43bb-9ed2-6e9d3f31c3ad/image.PNG" alt=""></h6>
<p><code>이름</code> : web01 (작성자가 사용하기 용이한 이름으로 설정)</p>
<h3 id="2-애플리케이션-및-os-이미지">2) 애플리케이션 및 OS 이미지</h3>
<h6 id="-6"><img src="https://velog.velcdn.com/images/sanbon_8/post/35df921a-3d69-40d5-b31f-cf1e0c6634cc/image.PNG" alt=""></h6>
<p><code>OS</code> : Amazon Linux
<code>AMI</code> : Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
<code>아키텍처</code> : 64비트(x86)</p>
<h6 id="-7"><img src="https://velog.velcdn.com/images/sanbon_8/post/b15f04ae-833f-44c0-b15c-60eb77b404c1/image.PNG" alt=""></h6>
<p><code>인스턴스 유형</code> : t2.micro</p>
<p>이후 <code>키 페어</code>생성</p>
<h3 id="3-키-페어">3) 키 페어</h3>
<h6 id="-8"><img src="https://velog.velcdn.com/images/sanbon_8/post/d31b3f10-6403-40d7-9c86-ddbb51222019/image.PNG" alt=""></h6>
<p><code>키페어 이름</code> : new-key (자신이 쓰기 용이한 이름으로 짓기)
<code>키 페어 유형</code> : RSA
<code>프라이빗 키 파일 형식</code> : .pem</p>
<p>이후 <code>키 페어 생성</code> 클릭</p>
<h6 id="-9"><img src="https://velog.velcdn.com/images/sanbon_8/post/8173fdba-144f-413f-a354-a40409754cb8/image.PNG" alt=""></h6>
<p>다운로드 성공</p>
<h3 id="4-네트워크-설정">4) 네트워크 설정</h3>
<h6 id="-10"><img src="https://velog.velcdn.com/images/sanbon_8/post/771f14fd-ca67-4a6c-b2ac-d9d9a895f654/image.PNG" alt=""></h6>
<p><code>방화벽 (보안 그룹)</code> : 파란 네모칸 전부 체크
이후 <code>편집</code> 버튼 클릭</p>
<h4 id="1-서브넷">(1) 서브넷</h4>
<h6 id="-11"><img src="https://velog.velcdn.com/images/sanbon_8/post/3e459040-b212-4cbc-be1d-348033e7e359/image.PNG" alt=""></h6>
<p><code>서브넷</code> : 서브넷 설정
<code>보안 그룹 이름</code> : web (사용자가 사용하기 용이한 이름으로 설정)</p>
<h6 id="-12"><img src="https://velog.velcdn.com/images/sanbon_8/post/ca263501-3e87-4f2b-b1f8-18aa061ac4c8/image.PNG" alt=""></h6>
<h4 id="2-보안-그룹-규칙">(2) 보안 그룹 규칙</h4>
<h6 id="-13"><img src="https://velog.velcdn.com/images/sanbon_8/post/02c9baf3-bb4b-4cd0-bb3f-2763b6c52bbe/image.PNG" alt=""></h6>
<ul>
<li><p>보안 그룹 규칙 1</p>
<ul>
<li><code>유형</code> : ssh</li>
<li><code>소스 유형</code> : 내 IP</li>
</ul>
</li>
<li><p>보안 그룹 규칙 2</p>
<ul>
<li><code>유형</code> : http</li>
<li><code>소스 유형</code> : 위치 무관 (로드 밸런서를 위해서. 추후참고)</li>
</ul>
</li>
<li><p>보안 그룹 규칙 3</p>
<ul>
<li><code>유형</code> : https</li>
<li><code>소스 유형</code> : 위치 무관</li>
</ul>
</li>
</ul>
<h6 id="-14"><img src="https://velog.velcdn.com/images/sanbon_8/post/6f02a4ab-b712-403a-9ab5-3105b05af9fe/image.PNG" alt=""></h6>
<ul>
<li><p>보안 그룹 규칙 4</p>
<ul>
<li><code>유형</code> : 사용자 지정 TCP</li>
<li><code>소스 유형</code> : 위치 무관 (로드 밸런서를 위해서. 추후참고)</li>
<li><code>포트 범위</code> : 8080</li>
<li><code>설명</code> : tomcat</li>
</ul>
</li>
<li><p>보안 그룹 규칙 5</p>
<ul>
<li><code>유형</code> : 사용자 지정 ICMP - IPv4</li>
<li><code>소스 유형</code> : 내 IP</li>
</ul>
</li>
</ul>
<h3 id="5-스토리지-구성">5) 스토리지 구성<img src="https://velog.velcdn.com/images/sanbon_8/post/76dc8ed5-289f-42f5-af3f-c6d13e203d8d/image.PNG" alt=""></h3>
<p><code>어드밴스드</code> 클릭</p>
<h6 id="-15"><img src="https://velog.velcdn.com/images/sanbon_8/post/e0f355d5-44c6-4240-a6f7-d0a54a049aaf/image.PNG" alt=""></h6>
<p><code>gp3</code> -&gt; <code>gp2</code></p>
<h6 id="-16"><img src="https://velog.velcdn.com/images/sanbon_8/post/b2b0076f-5991-4c9b-812a-c4eeeaafc151/image.PNG" alt=""></h6>
<p><code>종료 시 삭제</code> : 예</p>
<h3 id="6-고급-세부-정보">6) 고급 세부 정보</h3>
<h6 id="-17"><img src="https://velog.velcdn.com/images/sanbon_8/post/02114b82-87b6-4a58-b518-b7845b179949/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/76ecc015-9392-484e-b895-3e26242cbd35/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/c29ae90d-3512-4a4d-8db0-c0115d81ea2a/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/981bf321-e973-4b45-aa62-d81b2357c9f0/image.PNG" alt=""></h6>
<p><code>사용자 데이터</code></p>
<blockquote>
<p><code>CentOS</code> <code>RedHat</code> :</p>
</blockquote>
<pre><code>#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo &quot;&lt;h1&gt;web01&lt;/h1&gt;&quot; &gt; /var/www/html/index.html</code></pre><blockquote>
<p><code>Ubuntu</code> :</p>
</blockquote>
<pre><code class="language-#!/bin/bash">apt update
apt install -y apache2
echo &quot;&lt;h1&gt;web02&lt;/h1&gt;&quot; &gt; /var/www/html/index.html</code></pre>
<h3 id="7-생성">7) 생성</h3>
<h6 id="-18"><img src="https://velog.velcdn.com/images/sanbon_8/post/3786fd98-ceae-4cbc-a51c-d60c951c5a2a/image.PNG" alt=""></h6>
<h3 id="8-결과">(8) 결과</h3>
<h6 id="-19"><img src="https://velog.velcdn.com/images/sanbon_8/post/f0cb6d27-793e-421d-901e-8c0849a149dd/image.PNG" alt=""></h6>
<h2 id="6-탄력적-ip-주소">6. 탄력적 IP 주소</h2>
<h6 id="-20"><img src="https://velog.velcdn.com/images/sanbon_8/post/27b866bc-ced5-49f5-aa4e-7660f5eff1a4/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/69ef79c0-1726-419b-a69c-931553334d2a/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/bf12faec-0039-4a61-9fc0-47de22ef8f5a/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/07e65011-8e18-4747-92e8-666f9ce6c1c5/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/c7d451cd-06ee-45a8-b59d-5f1164a9cc4f/image.PNG" alt=""></h6>
<h2 id="7-로드밸런서">7. 로드밸런서</h2>
<h3 id="1-과정">1) 과정</h3>
<h6 id="-21"><img src="https://velog.velcdn.com/images/sanbon_8/post/1cc2cc88-4687-440a-a327-246b8613d575/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/98854bf4-b4a5-41a9-963f-d7209cbf4fea/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/ec6f3c37-3c38-454e-9f23-bc7a159aab37/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/52390b52-2274-4069-9552-0de0a3890c7b/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/ea16139f-823a-411f-80b6-175d2dc6ae57/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/221038da-b5dc-4747-a7bb-90ffaa4fe542/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/a172ba97-0d79-49c0-922b-76634316a821/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/342c1d52-f7c7-4b07-a1a7-f8ec5f20484a/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/f2d20bb4-f2fe-470b-944a-d8777fe99b1e/image.PNG" alt=""></h6>
<h3 id="2-결과">2) 결과</h3>
<h6 id="-22"><img src="https://velog.velcdn.com/images/sanbon_8/post/e919485a-e263-4c72-916d-d6d793ee69a9/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/ef5a0f31-d31b-4564-a7d8-7f17de46a873/image.PNG" alt=""></h6>
<p><code>상태</code> : <code>InService</code>일 경우 잘 작동되고 있는 것이다.</p>
<h2 id="8-삭제">8. 삭제</h2>
<h3 id="1-인스턴스">1) 인스턴스</h3>
<h6 id="-23"><img src="https://velog.velcdn.com/images/sanbon_8/post/d00028e4-f8a6-4618-a3d1-a6a6b16ca728/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/e4b3f5f1-6195-458e-9984-b5980a64e4f6/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/ba9b560d-5278-458c-b65c-2884a1b7ce34/image.PNG" alt=""></h6>
<h3 id="2-로드밸런서">2) 로드밸런서</h3>
<h6 id="-24"><img src="https://velog.velcdn.com/images/sanbon_8/post/3c79b28e-db9b-4a52-bc25-21a5930fff0e/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/d522e7fb-d6a4-4baf-a692-513b2ba3aa7b/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/90020113-5d4e-45b8-a2b4-4cab57d90005/image.PNG" alt=""></h6>
<h3 id="3-탄력적-ip-주소">3) 탄력적 IP 주소</h3>
<blockquote>
<p>해당 기능은 연결을 하지 않고 가지고 있을 시 비용이 나가므로 반드시 삭제해 주자</p>
</blockquote>
<h6 id="-25"><img src="https://velog.velcdn.com/images/sanbon_8/post/41d3c148-6cc3-4fdf-9c2d-d53b86276f50/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/3be81360-1feb-4c9b-931d-c7346ad326a1/image.PNG" alt=""><img src="https://velog.velcdn.com/images/sanbon_8/post/941b1062-a2d7-419a-b408-7fcf30b98245/image.PNG" alt=""></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.11 Cloud Computing 2]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.11-Cloud-Computing-2</link>
            <guid>https://velog.io/@sanbon_8/2023.04.11-Cloud-Computing-2</guid>
            <pubDate>Tue, 11 Apr 2023 04:37:10 GMT</pubDate>
            <description><![CDATA[<h1 id="클라우드aws">클라우드(AWS)</h1>
<h2 id="보안-자격-증명-mfa">보안 자격 증명 (MFA)</h2>
<blockquote>
<p>MFA : Multi Factor Authentication</p>
</blockquote>
<h3 id="1-보안-자격-증명-페이지-들어가기">1. 보안 자격 증명 페이지 들어가기<img src="https://velog.velcdn.com/images/sanbon_8/post/5c6c42dd-4002-4941-96b3-42c03e1fdec1/image.PNG" alt=""></h3>
<p>우측 상단 이메일 -&gt; 보안 자격 증명</p>
<h3 id="2-mfa-할당-인증받기">2. MFA 할당 인증받기<img src="https://velog.velcdn.com/images/sanbon_8/post/4e63097f-a9d7-411b-b7ff-07267ac07710/image.PNG" alt=""></h3>
<p>MFA 할당</p>
<h3 id="3-mfa-디바이스-선택">3. MFA 디바이스 선택<img src="https://velog.velcdn.com/images/sanbon_8/post/2aef9e9d-8ad6-4b4b-afcd-f61f112b5c52/image.png" alt=""></h3>
<p><code>디바이스 이름</code>: new-mfa ( 자신이 기억하기 용이한 이름으로 설정 )
<code>MFA 디바이스 선택</code>: 인증 관리자 앱</p>
<h3 id="4-mfa-디바이스-설정">4. MFA 디바이스 설정<img src="https://velog.velcdn.com/images/sanbon_8/post/8ee65018-13a3-492d-b4ec-30f0f4919b10/image.png" alt=""></h3>
<p><code>안드로이드</code> : otp (google otp)
<code>아이폰</code> : google authenticator</p>
<ol>
<li>QR 코드 표시</li>
<li>앱을 통한 QR코드 인증 절차 밟기</li>
<li>MFA 코드 1 입력</li>
<li>이후 바뀐 연속된 코드 2 입력</li>
<li>MFA 추가 클릭</li>
</ol>
<h3 id="5-mfa-할당-정보-확인">5. MFA 할당 정보 확인</h3>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/454964f7-b722-4abf-be0d-48fd3b846075/image.PNG" alt=""></p>
<h3 id="6-mfa-사용해보기">6. MFA 사용해보기<img src="https://velog.velcdn.com/images/sanbon_8/post/77eca681-fed9-4cc4-8f71-360208f84f7b/image.PNG" alt=""></h3>
<p>로그아웃 후 휴대폰 앱에 나오는 MFA 코드 입력 후 재로그인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023.04.10
Cloud Computing 1]]></title>
            <link>https://velog.io/@sanbon_8/2023.04.10%ED%8D%BC%EB%B8%94%EB%A6%AD-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-1</link>
            <guid>https://velog.io/@sanbon_8/2023.04.10%ED%8D%BC%EB%B8%94%EB%A6%AD-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-1</guid>
            <pubDate>Mon, 10 Apr 2023 08:37:32 GMT</pubDate>
            <description><![CDATA[<h1 id="클라우드aws">클라우드(AWS)</h1>
<h2 id="1-가입하기">1. 가입하기</h2>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/7d0c7068-09c7-41cd-a36c-31216750b3c2/image.PNG" alt="">
<a href="https://aws.amazon.com/ko/free">https://aws.amazon.com/ko/free</a></p>
<p><strong>계정 생성간 필요사항</strong></p>
<blockquote>
</blockquote>
<ol>
<li>이메일</li>
<li>휴대폰 인증</li>
<li>집 주소</li>
<li>해외결제 가능한 카드</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/bbb0541a-4dce-45fd-a244-6dd5fe5a0329/image.png" alt="">
Complete</p>
<h2 id="2-계정-설정">2. 계정 설정</h2>
<p><img src="https://velog.velcdn.com/images/sanbon_8/post/9ec9e8ee-af15-47b9-ac2b-c41f4cb044cd/image.png" alt="">
언어: <code>한국어</code>
기본 리전(지역): <code>아시아 태평양(서울) ap-northeast-2</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Velog Start]]></title>
            <link>https://velog.io/@sanbon_8/Velog-Start</link>
            <guid>https://velog.io/@sanbon_8/Velog-Start</guid>
            <pubDate>Thu, 06 Apr 2023 00:26:20 GMT</pubDate>
            <description><![CDATA[<p>현재 시각 2023-04-06
클라우드 교육 전 블로그 생성날짜</p>
]]></description>
        </item>
    </channel>
</rss>