Azure

[Azure] Application Gateway

bbiyak2da 2023. 3. 16. 09:44

해당 게시글은 Microsoft Azure 설명서를 기반으로, 공부 차원에서 작성한 게시글입니다.

자세한 설명은 하단의 링크에서 확인할 수 있습니다.

 

** 참고문서 : https://learn.microsoft.com/ko-kr/azure/application-gateway/overview

 

Azure Application Gateway란?

Azure 애플리케이션 게이트웨이를 사용하여 애플리케이션에 대한 웹 트래픽을 관리하는 방법을 알아봅니다.

learn.microsoft.com

 

Application Gateway

 

- 웹 애플리케이션에 대한 트래픽을 관리할 수 있도록 하는 웹 트래픽 부하 분산 장치

 

<차이점>

-  Application gateway : 애플리케이션 계층(OSI 계층 7) 부하 분산, URL 기반 라우팅 및 기타 작업 수행

- 기존 부하 분산 장치 : 전송 계층(OSI 계층 4 - TCP 및 UDP)에서 작동, 원본 IP 주소와 포트를 기반으로 대상 IP 주소와 포트에 트래픽을 라우팅


실습 아키텍처

Azure CLI를 사용하여 애플리케이션 게이트웨이를 생성한다.

애플리케이션 게이트웨이는 애플리케이션 웹 트래픽을 백 엔드 풀의 특정 리소스로 보낸다.

수신기를 포트에 할당하고, 규칙을 만들고, 백 엔드 풀에 리소스를 추가한다.

 

해당 실습에서는 공용 프런트 엔드 IP 주소가 있는 간단한 설정, 애플리케이션 게이트웨이에서 단일 사이트를 호스트하는 기본 수신기, 기본 요청 라우팅 규칙 및 백 엔드 풀의 두 가상 머신을 사용한다.


0. AZ login

az login

azure cli를 사용할 것이기 때문에, 터미널에서 az login 명령어를 입력해주어 Azure 내 계정과 연동한다.


 

1. 리소스 그룹 생성

az group create --name myResourceGroupAG --location eastus

: eastus 위치에 myResourceGroupAG라는 리소스 그룹 생성

 

 az group create를 사용하여 리소스 그룹을 만든다.

 


2. 네트워크 리소스 생성

az network vnet create --name myVNet --resource-group myResourceGroupAG --location eastus --address-prefix 10.21.0.0/16 --subnet-name myAGSubnet --subnet-prefix 10.21.0.0/24
az network vnet subnet create --name myBackendSubnet --resource-group myResourceGroupAG --vnet-name myVNet --address-prefix 10.21.1.0/24
az network public-ip create --resource-group myResourceGroupAG --name myAGPublicIPAddress --allocation-method Static --sku Standard

: 1. 가상 네트워크(myVnet), 서브넷1(애플리케이션 게이트웨이용 서브넷, myAGsubnet)

: 2. 서브넷2(백 엔드 서버용 서브넷, myBackendSubnet)

: 3. 공용 프런트 엔드 IP 주소를 생성

 

Azure가 사용자가 만든 리소스 간에 통신하려면 가상 네트워크가 필요하다.

또한, 애플리케이션 게이트웨이 서브넷은 애플리케이션 게이트웨이만 포함할 수 있다. 다른 리소스는 허용되지 않는다.

 

이 예제에서는 두 개의 서브넷을 만든다. 하나는 애플리케이션 게이트웨이용 서브넷(10.21.0.0/24)이고, 다른 하나는 백 엔드 서버용 서브넷(10.21.1.0/24)이다.

 

사용 사례에 따라 Application Gateway의 프런트 엔드 IP를 공용 또는 프라이빗 IP로 구성할 수 있다. 이 예제에서는 공용 프런트 엔드 IP 주소를 선택한다.


3. 백 엔드 서버 생성

이 예제에서는 애플리케이션 게이트웨이의 백 엔드 서버로 사용되는 두 개의 가상 머신을 만든다.

또한 가상 머신에 NGINX를 설치하여 애플리케이션 게이트웨이를 테스트한다.

 

[yaml 파일]

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
  - path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

:  cloud-init 구성 파일을 사용하여 NGINX를 설치하고 Linux 가상 머신에서 "Hello World" Node.js 앱을 실행

 

애플리케이션 게이트웨이가 성공적으로 만들어졌는지 확인할 수 있도록 가상 머신에 NGINX 웹 서버를 설치한다.

먼저, Azure Cloud Shell에서 다음 구성을 복사하여 cloud-init.txt 파일에 붙여넣는다.

이후 editor cloud-init.txt를 입력하여 파일을 만든다.

 

[Azure CLI 파일]

for i in `seq 1 2`; do
  az network nic create \
    --resource-group myResourceGroupAG \
    --name myNic$i \
    --vnet-name myVNet \
    --subnet myBackendSubnet
  az vm create \
    --resource-group myResourceGroupAG \
    --name myVM$i \
    --nics myNic$i \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt
done

: az network nic create를 사용하여 네트워크 인터페이스 생성, az vm create를 통해 가상머신 생성


 

4. Application gateway 생성

address1=$(az network nic show --name myNic1 --resource-group myResourceGroupAG | grep "\"privateIpAddress\":" | grep -oE '[^ ]+$' | tr -d '",')
address2=$(az network nic show --name myNic2 --resource-group myResourceGroupAG | grep "\"privateIpAddress\":" | grep -oE '[^ ]+$' | tr -d '",')
az network application-gateway create \
  --name myAppGateway \
  --location eastus \
  --resource-group myResourceGroupAG \
  --capacity 2 \
  --sku Standard_v2 \
  --public-ip-address myAGPublicIPAddress \
  --vnet-name myVNet \
  --subnet myAGSubnet \
  --servers "$address1" "$address2" \
  --priority 100

: az network application-gateway create를 사용하여 애플리케이션 게이트웨이를 생성한다.

 

Azure CLI를 사용하여 애플리케이션 게이트웨이를 만들 때 용량, SKU, HTTP 설정 등의 구성 정보를 지정한다.

그러면 Azure가 네트워크 인터페이스의 개인 IP 주소를 애플리케이션 게이트웨이의 백 엔드 풀에 서버로 추가한다.

 

만들어지면 애플리케이션 게이트웨이 페이지의 설정 섹션에서 다음 설정을 볼 수 있다.

  • appGatewayBackendPool백 엔드 풀 페이지에 있습니다. 필요한 백 엔드 풀을 지정합니다.
  • appGatewayBackendHttpSettingsHTTP 설정 페이지에 있습니다. 애플리케이션 게이트웨이가 통신에 포트 80 및 HTTP 프로토콜을 사용하도록 지정합니다.
  • appGatewayHttpListener수신기 페이지에 있습니다. appGatewayBackendPool과 연결되는 기본 수신기를 지정합니다.
  • appGatewayFrontendIP프런트 엔드 IP 구성 페이지에 있습니다. myAGPublicIPAddress를 appGatewayHttpListener에 할당합니다.
  • rule1규칙 페이지에 있습니다. appGatewayHttpListener에 연결되는 기본 회람 규칙을 지정합니다.

5. Application gateway 테스트

az network public-ip show \
  --resource-group myResourceGroupAG \
  --name myAGPublicIPAddress \
  --query [ipAddress] \
  --output tsv

: az network public-ip show 새 애플리케이션 게이트웨이의 공용 IP 주소를 가져오기

 

Azure에서 애플리케이션 게이트웨이를 만들려면 반드시 NGINX 웹 서버가 필요한 것은 아니지만, Azure가 애플리케이션 게이트웨이를 성공적으로 만들었는지 확인하기 위해 설치하였다.

 

이후 공용 IP 주소를 복사하여, 웹 페이지에 띄워본다.

 

브라우저를 새로 고치면 보조 VM의 이름이 표시된다.

이는 애플리케이션 게이트웨이가 성공적으로 만들어졌으며 백 엔드에 연결할 수 있다는 의미이다.


6.  리소스 정리

az group delete --name myResourceGroupAG

: az group delete 리소스 그룹 삭제

 

애플리케이션 게이트웨이로 만든 리소스가 더 이상 필요 없으면 az group delete 명령을 사용하여 리소스 그룹을 삭제한다. 리소스 그룹을 삭제하면 애플리케이션 게이트웨이 및 모든 관련 리소스도 함께 삭제된다.