본문 바로가기

AI, 논문, 데이터 분석

[클라우드 컴퓨팅] [Azure 실습7] Azure App 서비스 배포하기

실습 환경 준비

Portal이 편하긴 하지만, Portal이 불편해지기 시작하면 전문가,,

1. Azure CLI 설치 및 확인 https://learn.microsoft.com/ko-kr/cli/azure/install-azure-cli-windows?tabs=azure-cli

# 윈도우 터미널 (Windows Power Shell) 실행 후
az --version # 으로 버전 및 설치 확인

2. Node.js (18.20.5 LTS 버젼) 설치 및 확인 https://nodejs.org/pt/download

# 윈도우 터미널 (Windows Power Shell) 실행 후
node --version # 으로 버전 및 설치 확인

 

3. VS Code 설치 및 확인 https://code.visualstudio.com/download

 

4. VS Code 확장 설치 Action Bar에서 Extension 4가지 다운로드 

  • Azure Account
  • Azure App Service
  • Azure CLI Tools
  • Azure Functions

Step 0 : Azure CLI를 사용해 Azure를 다루는 기본 단계

#1. Azure CLI 버전 확인
az --version

#2. Azure CLI 수동 업그레이드
az upgrade

#3. Azure CLI 자동 업그레이드
az config set auto-upgrade.enable=yes

#3.1 업그레이드 중 사용자 확인 인터럽트 방지
az config set auto-upgrade.prompt=no

#4. 자동 업그레이드 해제
az config set auto-upgrade.enable=no

#5. Azure 로그인 # 로그인 페이지가 뜨면 로그인. # 이후 터미널에 구독 옵션들이 뜬다. 그 중에 선택 (필자의 경우 '1' 입력)
az login --output table  # 로그인 (-- out table은 옵션. 표/테이블 형태로 출력.)
# az login -o table # 로그인 (-- out table과 같은 코드. 축약한 형태이다.)
# az login -t {tanentID} -o table
# az login --use-device-code

#6. Azure 로그아웃
# az logout

#7. Azure 구독 목록 조회
az account list -o table

#8. Azure 구독 변경
# az account set --subscription "c312f328-d0e4-4d5b-a9ec-0eb25dd00d47"

#9. Azure 구독 정보 정리
# CLl 로컬 캐시에서 모든 구독 정리 # 로그인 A 계정하고, A 구독인데, 다른 B 계정으로 로그인 한 B 구독이 뜨는... 상황에서 모두 다 clear
# az account clear

#10. Azure 공급자 확인 ( | more 는 한 페이지씩 정보를 출력해준다.)
az provider show --namespace Microsoft.App | more

az provider show --namespace Microsoft.DataMigration -o table # NotRegistered

#11. Azure 공급자 등록
az provider register --namespace Microsoft.App
더보기
PS C:\lab> az --version
azure-cli                         2.67.0

core                              2.67.0
telemetry                          1.1.0

Dependencies:
msal                              1.31.0
azure-mgmt-resource               23.1.1

Python location 'C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe'
Extensions directory 'C:\Users\032\.azure\cliextensions'

Python (Windows) 3.12.7 (tags/v3.12.7:0b05ead, Oct  1 2024, 03:06:41) [MSC v.1941 64 bit (AMD64)]

Legal docs and information: aka.ms/AzureCliLegal


Your CLI is up-to-date.
PS C:\lab> 
PS C:\lab> #2. Azure CLI 수동 업그레이드
PS C:\lab> az upgrade
This command is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
You already have the latest azure-cli version: 2.67.0
Upgrade finished.You can enable auto-upgrade with 'az config set auto-upgrade.enable=yes'. More details in https://docs.microsoft.com/cli/azure/update-azure-cli#automatic-update
PS C:\lab> 
PS C:\lab> #3. Azure CLI 자동 업그레이드
PS C:\lab> az config set auto-upgrade.enable=yes
Command group 'config' is experimental and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Auto upgrade failed. 'pypi'
PS C:\lab> 
PS C:\lab> #3.1 업그레이드 중 사용자 확인 인터럽트 방지
PS C:\lab> az config set auto-upgrade.prompt=no
Command group 'config' is experimental and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Auto upgrade failed. 'pypi'
PS C:\lab> 
PS C:\lab> #4. 자동 업그레이드 해제
PS C:\lab> az config set auto-upgrade.enable=no
Command group 'config' is experimental and under development. Reference and support levels: https://aka.ms/CLI_refstatus
PS C:\lab> az login --output table
Select the account you want to log in with. For more information on login with Azure CLI, see https://go.microsoft.com/fwlink/?linkid=2271136

Retrieving tenants and subscriptions for the selection...

[Tenant and subscription selection]

No     Subscription name    Subscription ID                       Tenant
-----  -------------------  ------------------------------------  ----------
[1] *  SKT FLYAI 과정       f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26  서울대학교

The default is marked with an *; the default tenant is '서울대학교' and subscription is 'SKT FLYAI 과정' (f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26).

Select a subscription and tenant (Type a number or Enter for no changes): 1

Tenant: 서울대학교
Subscription: SKT FLYAI 과정 (f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.
PS C:\lab> az account list -o table
Name            CloudName    SubscriptionId                        TenantId                              State    IsDefault
--------------  -----------  ------------------------------------  ------------------------------------  -------  -----------
SKT FLYAI 과정  AzureCloud   f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26  c3b5a8fe-e46d-4078-9bd0-5eb0bb801edb
PS C:\lab> az provider show --namespace Microsoft.App | more
{
  "authorizations": [
    {
      "applicationId": "7e3bc4fd-85a3-4192-b177-5b8bfc87f42c",
      "roleDefinitionId": "39a74f72-b40f-4bdc-b639-562fe2260bf0"
    },
    {
      "applicationId": "3734c1a4-2bed-4998-a37a-ff1a9e7bf019",
      "roleDefinitionId": "5c779a4f-5cb2-4547-8c41-478d9be8ba90"
    },
    {
      "applicationId": "55ebbb62-3b9c-49fd-9b87-9595226dd4ac",
-- More  --
PS C:\lab> az provider show --namespace Microsoft.DataMigration -o table
Namespace                RegistrationPolicy    RegistrationState
-----------------------  --------------------  -------------------
Microsoft.DataMigration  RegistrationRequired  NotRegistered
PS C:\lab> az provider register --namespace Microsoft.App

STEP 1 : Create Linux

# 변수 같은 거 만들 때, 마지막엔 나의 이니셜 'km' 추가함

#0. 공통 변수
$location = "koreacentral"

#1. 리소스 그룹 생성
az group create --name "rg-paaslab-km" --location $location

$rg = az group list --query "[?contains(name, 'km')].name" --output tsv # $rg 는 변수 선언. # 출력을 tsv (tab seperate version) # 이후 터미널에 $rg 입력하면 결과를 확인할 수 있다.

#1.1 리소스 그룹 필터링 rg-kdk로 시작하는 리소스 그룹만 조회
# $rg = az group list --query "[?starts_with(name, 'rg-kdk')].name" --output tsv

###### 여기서 rg 값이 내가 원하는 ,rg-paaslab-km이 아닌 3개나 나옴. 에러남. 그래서 따로 정의해줌.
$rg = "rg-paaslab-km"

#mac
# rg = $(az group list --query "[?contains(name, 'kdk')].name" --output tsv)
# echo $rg

#2. 가상 네트워크(vnet) 생성, 서브넷 생성 # $rg 결과가 여러개라면면... --resource-group $rg 가 아닌, --resource-group rg-paaslab-km
az network vnet create --name vnet-km --resource-group rg-paaslab-km --location $location --address-prefixes "10.57.0.0/16" --subnet-name subnet-mgmt --subnet-prefix "10.57.1.0/24"

$vnet = az network vnet list --query "[?contains(name, 'km')].name" --output tsv
###### 여기서 svnet 값이 1개가 아닌 3개나 나옴. 에러남 그래서 따로 정의해줌.
$vnet = "vnet-km"
$subnet= az network vnet subnet list --vnet-name vnet-km --query "[?contains(name, 'mgmt')].name" -g rg-paaslab-km --output tsv # --vnet-name $vnet 아니라 --vnet-name 
# subnet-mgmt 

#3. 네트워크 보안그룹 생성
az network nsg create --name nsg-km -g $rg -l $location

#4. 네트워크 보안그룹이 연결된 가상 네트워크 카드 만들기
az network nic create --name nic-km --resource-group $rg --vnet-name $vnet --subnet $subnet --network-security-group nsg-km

#5. 공용 IP 주소 생성
az network public-ip create --name pip-km --resource-group $rg --location $location

#6. 네트워크 인터페이스 카드에 공용 IP 주소 연결
az network nic ip-config update --name ipconfig1 --nic-name nic-km --public-ip-address pip-km --resource-group $rg

#7. 가상 머신 생성 # ssh key를 생성성 # --size Standard_B1s : 제일 작은 사이즈.1 cpu 1 memory
az vm create --resource-group $rg --name vm-km --image Ubuntu2204 --admin-username tony --generate-ssh-keys --nics nic-km --location $location --size Standard_B1s
# C:\Users\032\.ssh (자기 로컬의 .shh)에 id_rsa 파일이 2개 생성됐다. 

#8. 가상 머신에 연결 # 파일 이름을 변경
ren $home\.ssh\id_rsa vm-km_key

#Mac
# mv ~/.ssh/id_rsa ~/.ssh/vm-kdk_key
# mv $HOME/.ssh/id_rsa $HOME/.ssh/vm-kdk_key

#공용 Ip 주소 확인
$pip = az network public-ip show --name pip-km --resource-group $rg --query "[ipAddress]" --output tsv

ssh -i ~/.ssh/vm-km_key tony@$pip
# 에러 발생 # ssh: connect to host 4.217.175.39 port 22: Connection timed out
# 보안 규칙 추가해주자. # nsg-km > 설정 > 인바운드 보안 규칙 > + 추가 > '서비스' 탭에 SSH로 설정 # 접은 글의 사진 참고.


# ssh -i ~\.ssh\vm-km_key tony@$pip
더보기
PS C:\lab> #0. 공통 변수
PS C:\lab> $location = "koreacentral"
PS C:\lab>
PS C:\lab> #1. 리소스 그룹 생성
PS C:\lab> az group create --name "rg-paaslab-km" --location $location
{
  "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km",
  "location": "koreacentral",
  "managedBy": null,
  "name": "rg-paaslab-km",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}
PS C:\lab> $rg = az group list --query "[?contains(name, 'km')].name" --output tsv
PS C:\lab> $rg
rg-paaslab-kkm
rg-paaslab-kms
rg-paaslab-km
PS C:\lab> ###### 여기서 rg 값이 1개가 아닌 3개나 나옴. 에러남. 그래서 따로 정의해줌.
PS C:\lab> $rg = "rg-paaslab-km"

PS C:\lab> #2. 가상 네트워크(vnet) 생성, 서브넷 생성 # $rg 결과가 여러개라면면... --resource-group $rg 가 아닌, --resource-group rg-paaslab-km
PS C:\lab> az network vnet create --name vnet-km --resource-group rg-paaslab-km --location $location --address-prefixes "10.57.0.0/16" --subnet-name subnet-mgmt --subnet-prefix "10.57.1.0/24"
{
  "newVNet": {
    "addressSpace": {
      "addressPrefixes": [
        "10.57.0.0/16"
      ]
    },
    "enableDdosProtection": false,
    "etag": "W/\"0c89ccc9-f7db-4be8-a574-5310753b8a36\"",
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/virtualNetworks/vnet-km",
    "location": "koreacentral",
    "name": "vnet-km",
    "privateEndpointVNetPolicies": "Disabled",
    "provisioningState": "Succeeded",
    "resourceGroup": "rg-paaslab-km",
    "resourceGuid": "439937fc-400f-45cd-93c3-ecba0a3501b5",
    "subnets": [
      {
        "addressPrefix": "10.57.1.0/24",
        "delegations": [],
        "etag": "W/\"0c89ccc9-f7db-4be8-a574-5310753b8a36\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/virtualNetworks/vnet-km/subnets/subnet-mgmt",
        "name": "subnet-mgmt",
        "privateEndpointNetworkPolicies": "Disabled",
        "privateLinkServiceNetworkPolicies": "Enabled",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "type": "Microsoft.Network/virtualNetworks/subnets"
      }
    ],
    "type": "Microsoft.Network/virtualNetworks",
    "virtualNetworkPeerings": []
  }
}
PS C:\lab> $vnet = az network vnet list --query "[?contains(name, 'km')].name" --output tsv
PS C:\lab> $vnet
vnet-kkm
vnet-kms
vnet-km
PS C:\lab> ###### 여기서 svnet 값이 1개가 아닌 3개나 나옴. 에러남 그래서 따로 정의해줌.
PS C:\lab> $vnet = "vnet-km"

PS C:\lab> $subnet= az network vnet subnet list --vnet-name vnet-km --query "[?contains(name, 'mgmt')].name" -g rg-paaslab-km --output tsv # --vnet-name $vnet --vnet-name $vnet
PS C:\lab> $subnet
subnet-mgmt

PS C:\lab> #3. 네트워크 보안그룹 생성
PS C:\lab> az network nsg create --name nsg-km -g $rg -l $location
{
  "NewNSG": {
    "defaultSecurityRules": [
      {
        "access": "Allow",
        "description": "Allow inbound traffic from all VMs in VNET",
        "destinationAddressPrefix": "VirtualNetwork",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Inbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/AllowVnetInBound",
        "name": "AllowVnetInBound",
        "priority": 65000,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "VirtualNetwork",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      },
      {
        "access": "Allow",
        "description": "Allow inbound traffic from azure load balancer",
        "destinationAddressPrefix": "*",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Inbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/AllowAzureLoadBalancerInBound",
        "name": "AllowAzureLoadBalancerInBound",
        "priority": 65001,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "AzureLoadBalancer",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      },
      {
        "access": "Deny",
        "description": "Deny all inbound traffic",
        "destinationAddressPrefix": "*",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Inbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/DenyAllInBound",
        "name": "DenyAllInBound",
        "priority": 65500,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "*",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      },
      {
        "access": "Allow",
        "description": "Allow outbound traffic from all VMs to all VMs in VNET",
        "destinationAddressPrefix": "VirtualNetwork",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Outbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/AllowVnetOutBound",
        "name": "AllowVnetOutBound",
        "priority": 65000,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "VirtualNetwork",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      },
      {
        "access": "Allow",
        "description": "Allow outbound traffic from all VMs to Internet",
        "destinationAddressPrefix": "Internet",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Outbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/AllowInternetOutBound",
        "name": "AllowInternetOutBound",
        "priority": 65001,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "*",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      },
      {
        "access": "Deny",
        "description": "Deny all outbound traffic",
        "destinationAddressPrefix": "*",
        "destinationAddressPrefixes": [],
        "destinationPortRange": "*",
        "destinationPortRanges": [],
        "direction": "Outbound",
        "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km/defaultSecurityRules/DenyAllOutBound",
        "name": "DenyAllOutBound",
        "priority": 65500,
        "protocol": "*",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "sourceAddressPrefix": "*",
        "sourceAddressPrefixes": [],
        "sourcePortRange": "*",
        "sourcePortRanges": [],
        "type": "Microsoft.Network/networkSecurityGroups/defaultSecurityRules"
      }
    ],
    "etag": "W/\"6df5c862-cdd4-403c-bad1-ca41cbc9c81c\"",
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km",
    "location": "koreacentral",
    "name": "nsg-km",
    "provisioningState": "Succeeded",
    "resourceGroup": "rg-paaslab-km",
    "resourceGuid": "b988d6b2-bbcb-4a67-a0fd-2cf5f38b6f90",
    "securityRules": [],
    "type": "Microsoft.Network/networkSecurityGroups"
  }
}

PS C:\lab> #4. 네트워크 보안그룹이 연결된 가상 네트워크 카드 만들기
PS C:\lab> az network nic create --name nic-km --resource-group $rg --vnet-name $vnet --subnet $subnet --network-security-group nsg-km
{
  "NewNIC": {
    "auxiliaryMode": "None",
    "auxiliarySku": "None",
    "disableTcpStateTracking": false,
    "dnsSettings": {
      "appliedDnsServers": [],
      "dnsServers": [],
      "internalDomainNameSuffix": "5q1zsqypidgule4d3s3aunibwf.syx.internal.cloudapp.net"
    },
    "enableAcceleratedNetworking": false,
    "enableIPForwarding": false,
    "etag": "W/\"1a7ecb52-d070-497f-8e73-3783f0bb9e86\"",
    "hostedWorkloads": [],
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkInterfaces/nic-km",
    "ipConfigurations": [
      {
        "etag": "W/\"1a7ecb52-d070-497f-8e73-3783f0bb9e86\"",
        "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkInterfaces/nic-km/ipConfigurations/ipconfig1",
        "name": "ipconfig1",
        "primary": true,
        "privateIPAddress": "10.57.1.4",
        "privateIPAddressVersion": "IPv4",
        "privateIPAllocationMethod": "Dynamic",
        "provisioningState": "Succeeded",
        "resourceGroup": "rg-paaslab-km",
        "subnet": {
          "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/virtualNetworks/vnet-km/subnets/subnet-mgmt",
          "resourceGroup": "rg-paaslab-km"
        },
        "type": "Microsoft.Network/networkInterfaces/ipConfigurations"
      }
    ],
    "location": "koreacentral",
    "name": "nic-km",
    "networkSecurityGroup": {
      "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkSecurityGroups/nsg-km",
      "resourceGroup": "rg-paaslab-km"
    },
    "nicType": "Standard",
    "provisioningState": "Succeeded",
    "resourceGroup": "rg-paaslab-km",
    "resourceGuid": "133cc7cb-bf03-4a72-8557-745bcf1c8fbc",
    "tapConfigurations": [],
    "type": "Microsoft.Network/networkInterfaces",
    "vnetEncryptionSupported": false
  }
}
PS C:\lab> #5. 공용 IP 주소 생성
PS C:\lab> az network public-ip create --name pip-km --resource-group $rg --location $location
[Coming breaking change] In the coming release, the default behavior will be changed as follows when sku is Standard and zone is not provided: For zonal regions, you will get a zone-redundant IP indicated by zones:["1","2","3"]; For non-zonal regions, you will get a non zone-redundant IP indicated by zones:null.
{
  "publicIp": {
    "ddosSettings": {
      "protectionMode": "VirtualNetworkInherited"
    },
    "etag": "W/\"9746e591-4624-40b7-9fcf-d5f83c1eac0d\"",
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/publicIPAddresses/pip-km",
    "idleTimeoutInMinutes": 4,
    "ipAddress": "4.217.175.39",
    "ipTags": [],
    "location": "koreacentral",
    "name": "pip-km",
    "provisioningState": "Succeeded",
    "publicIPAddressVersion": "IPv4",
    "publicIPAllocationMethod": "Static",
    "resourceGroup": "rg-paaslab-km",
    "resourceGuid": "8ab5cf40-dfd5-49f7-85d8-2617af346c03",
    "sku": {
      "name": "Standard",
      "tier": "Regional"
    },
    "type": "Microsoft.Network/publicIPAddresses"
  }
}
PS C:\lab> #6. 네트워크 인터페이스 카드에 공용 IP 주소 연결
PS C:\lab> az network nic ip-config update --name ipconfig1 --nic-name nic-km --public-ip-address pip-km --resource-group $rg
{
  "etag": "W/\"d4b0af09-b437-42fd-a388-0a7f65df61d5\"",
  "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/networkInterfaces/nic-km/ipConfigurations/ipconfig1",
  "name": "ipconfig1",
  "primary": true,
  "privateIPAddress": "10.57.1.4",
  "privateIPAddressVersion": "IPv4",
  "privateIPAllocationMethod": "Dynamic",
  "provisioningState": "Succeeded",
  "publicIPAddress": {
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/publicIPAddresses/pip-km",
    "resourceGroup": "rg-paaslab-km"
  },
  "resourceGroup": "rg-paaslab-km",
  "subnet": {
    "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Network/virtualNetworks/vnet-km/subnets/subnet-mgmt",
    "resourceGroup": "rg-paaslab-km"
  },
  "type": "Microsoft.Network/networkInterfaces/ipConfigurations"
}
PS C:\lab> #7. 가상 머신 생성 # ssh key를 생성성 # --size Standard_B1s : 제일 작은 사이즈.1 cpu 1 memory
PS C:\lab> az vm create --resource-group $rg --name vm-km --image Ubuntu2204 --admin-username tony --generate-ssh-keys --nics nic-km --location $location --size Standard_B1s
SSH key files 'C:\Users\032\.ssh\id_rsa' and 'C:\Users\032\.ssh\id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage, back up your keys to a safe location.
{
  "fqdns": "",
  "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Compute/virtualMachines/vm-km",
  "location": "koreacentral",
  "macAddress": "00-22-48-CD-EE-77",
  "powerState": "VM running",
  "privateIpAddress": "10.57.1.4",
  "publicIpAddress": "4.217.175.39",
  "resourceGroup": "rg-paaslab-km",
  "zones": ""
}
PS C:\lab> #8. 가상 머신에 연결
PS C:\lab> ren $home\.ssh\id_rsa vm-km_key
PS C:\lab> #공용 Ip 주소 확인
PS C:\lab> $pip = az network public-ip show --name pip-km --resource-group $rg --query "[ipAddress]" --output tsv
PS C:\lab> $pip 
4.217.175.39

PS C:\lab> ssh -i ~/.ssh/vm-km_key tony@$pip
ssh: connect to host 4.217.175.39 port 22: Connection timed out
PS C:\lab> # 에러 발생 # ssh: connect to host 4.217.175.39 port 22: Connection timed out
PS C:\lab> # 보안 규칙 추가해주자. # nsg-km > 설정 > 인바운드 보안 규칙 > + 추가 > SSH

PS C:\lab> ssh -i ~/.ssh/vm-km_key tony@$pip
The authenticity of host '4.217.175.39 (4.217.175.39)' can't be established.
ED25519 key fingerprint is SHA256:fuynfxR6Av6MxbBkGyOMdCZdCXwRuH6jqGzF9SDrLIc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '4.217.175.39' (ED25519) to the list of known hosts.
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.5.0-1025-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Thu Jan  9 03:00:21 UTC 2025

  System load:  0.0               Processes:             103
  Usage of /:   5.2% of 28.89GB   Users logged in:       0
  Memory usage: 33%               IPv4 address for eth0: 10.57.1.4
  Swap usage:   0%

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Azure App 서비스

고객의 요구에 따라 다양하게 서비스 제공

더보기

Monolithic Architecture (모놀리식 아키텍처)

  • 모든 기능(모듈)이 하나의 코드베이스에 포함된 단일 애플리케이션으로 배포됩니다.
  • 단일 프로세스로 실행되며, 모든 구성 요소(예: UI, 데이터베이스 처리, 비즈니스 로직 등)가 서로 긴밀하게 결합되어 있습니다.

Microservices Architecture (마이크로서비스 아키텍처)

  • 애플리케이션을 작고 독립적인 서비스들로 분리하여 설계합니다.
  • 각 서비스는 독립적으로 개발, 배포, 확장, 유지보수할 수 있으며, 서로 다른 언어나 기술 스택을 사용할 수도 있습니다.
  1. HTTP 기반 서비스 ; 웹 애플리케이션, REST API, 모바일 백엔드
  2. Windows 및 Linux 환경 지원
  3. Microsoft Azure의 강력한 기능
  4. DevOps 기능 활용 ; Azure DevOps, GitHub, Docker Hub, CI/CD
  5. App 서비스 계획(요금제)을 통한 컴퓨팅 리소스 결정
  • 기본 제공 이미지와 사용자 지정 이미지
    • 기본 제공 이미지 : 제공 되는 것들 중 사용자가 자유롭게 선택 ; Linux, Windows, 미리 정의된 애플리케이션 스택
    • 사용자 지정 이미지 → ‘게시’ 항목에서 ‘컨테이너’로 선택 ; 정의 되지 않은 애플리케이션 스택 (ex. kotlin), 허용된 것 보다 더 많은 액세스 권한이 필요한 경우

STEP 2 : [실습] App Service 생성하기

1. 전역 검색에서 "App Services" 검색 후 [만들기]
2. [기본]
- 리소스 그룹: rg-paaslab-km
- 이름: webkm
    - 끄기 : 고유한 기본 호스트 이름(미미리 보기)을 사용해 보세요.
- 게시: 코드
- 런타임 스택: .NET 6
- 운영 체제: Windows
- 지역: East US ( 에러나서 변경 -> Australia Central )
- 플랜: asp-windows / Premium V2 P1v2
- 영역 중복: 사용

3. [배포]
GitHub Actions: 사용 안 함

4. [네트워킹]
Enable public access: 켜기
네트워크 삽입 사용: 끄기

5. [모니터링]
Application Insights: 아니오

-------------------------------------------

웹 앱 [webkm] > 개요 > 찾아보기 : 화면이 잘 나오는지 확인. "웹앱이 실행 중이며 콘텐츠를 기다리는 중입니다"

STEP 2 : [실습] 이번엔 Azure CLI로, App Service 생성하기

#1. 로그인
# az login -t <TENENANT ID>
az login --output table 
#2. 기본 구독 변경
# az account set --subscription <SUBSCRIPTION ID>

# +) 리소스 그룹 만들기 # STEP 1 에서 안 만들었다면, 실행
# az group create -n rg-paaslab-km -l australiaeast

#3. 가격 책정 플랜 만들기 # 인스턴스의 갯수 1개로 : --number-of-workers 1 # 코드에서 사용하는 Name :australiaeast, 포털에서 사용한 보여지는 DisplayName : Australia Central 
az appservice plan create -g rg-paaslab-km -n asp-linux --is-linux --number-of-workers 1 --sku B1 -l australiaeast

#4. 사용 가능한 런타임 확인
az webapp list-runtimes 
az webapp list-runtimes --os windows
az webapp list-runtimes --os Linux

#5. 앱 서비스 배포
az webapp create -g rg-paaslab-km -p asp-linux -n web-node-km --runtime "NODE:18-lts"
더보기
PS C:\lab> #1. 로그인
PS C:\lab> az login --output table
Select the account you want to log in with. For more information on login with Azure CLI, see https://go.microsoft.com/fwlink/?linkid=2271136

Retrieving tenants and subscriptions for the selection...

[Tenant and subscription selection]

No     Subscription name    Subscription ID                       Tenant
-----  -------------------  ------------------------------------  ----------
[1] *  SKT FLYAI 과정       f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26  서울대학교

The default is marked with an *; the default tenant is '서울대학교' and subscription is 'SKT FLYAI 과정' (f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26).

Select a subscription and tenant (Type a number or Enter for no changes): 1

Tenant: 서울대학교
Subscription: SKT FLYAI 과정 (f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.


PS C:\lab> #3. 가격 책정 플랜 만들기 # 인스턴스의 갯수 1개로 : --number-of-workers 1 # 코드에서 사용하는 Name :australiaeast, 포털에서 사용한 보여지는 DisplayName : Australia Central 
PS C:\lab> az appservice plan create -g rg-paaslab-km -n asp-linux --is-linux --number-of-workers 1 --sku B1 -l australiaeast
Readonly attribute name will be ignored in class <class 'azure.mgmt.web.v2023_01_01.models._models_py3.AppServicePlan'>
{
  "elasticScaleEnabled": false,
  "extendedLocation": null,
  "freeOfferExpirationTime": "2025-02-08T08:34:47.740000",
  "geoRegion": "Australia East",
  "hostingEnvironmentProfile": null,
  "hyperV": false,
  "id": "/subscriptions/f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26/resourceGroups/rg-paaslab-km/providers/Microsoft.Web/serverfarms/asp-linux",
  "isSpot": false,
  "isXenon": false,
  "kind": "linux",
  "kubeEnvironmentProfile": null,
  "location": "australiaeast",
  "maximumElasticWorkerCount": 1,
  "maximumNumberOfWorkers": 0,
  "name": "asp-linux",
  "numberOfSites": 0,
  "numberOfWorkers": 1,
  "perSiteScaling": false,
  "provisioningState": "Succeeded",
  "reserved": true,
  "resourceGroup": "rg-paaslab-km",
  "sku": {
    "capabilities": null,
    "capacity": 1,
    "family": "B",
    "locations": null,
    "name": "B1",
    "size": "B1",
    "skuCapacity": null,
    "tier": "Basic"
  },
  "spotExpirationTime": null,
  "status": "Ready",
  "subscription": "f5bc93f2-df0a-4b1a-ab9e-2b0203fc7d26",
  "tags": null,
  "targetWorkerCount": 0,
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null,
  "zoneRedundant": false
}


PS C:\lab> #4. 사용 가능한 런타임 확인
PS C:\lab> az webapp list-runtimes 
{
  "linux": [
    "DOTNETCORE:9.0",
    "DOTNETCORE:8.0",
    "DOTNETCORE:7.0",
    "DOTNETCORE:6.0",
    "NODE:20-lts",
    "NODE:18-lts",
    "NODE:16-lts",
    "PYTHON:3.12",
    "PYTHON:3.11",
    "PYTHON:3.10",
    "PYTHON:3.9",
    "PYTHON:3.8",
    "PHP:8.3",
    "PHP:8.2",
    "PHP:8.1",
    "PHP:8.0",
    "JAVA:21-java21",
    "JAVA:17-java17",
    "JAVA:11-java11",
    "JAVA:8-jre8",
    "JBOSSEAP:8-java17",
    "JBOSSEAP:8-java11",
    "JBOSSEAP:8-java17_byol",
    "JBOSSEAP:8-java11_byol",
    "JBOSSEAP:7-java17",
    "JBOSSEAP:7-java11",
    "JBOSSEAP:7-java8",
    "JBOSSEAP:7-java17_byol",
    "JBOSSEAP:7-java11_byol",
    "JBOSSEAP:7-java8_byol",
    "TOMCAT:10.1-java21",
    "TOMCAT:10.1-java17",
    "TOMCAT:10.1-java11",
    "TOMCAT:10.0-java17",
    "TOMCAT:10.0-java11",
    "TOMCAT:10.0-jre8",
    "TOMCAT:9.0-java21",
    "TOMCAT:9.0-java17",
    "TOMCAT:9.0-java11",
    "TOMCAT:9.0-jre8",
    "TOMCAT:8.5-java11",
    "TOMCAT:8.5-jre8"
  ],
  "windows": [
    "dotnet:9",
    "dotnet:8",
    "dotnet:7",
    "dotnet:6",
    "ASPNET:V4.8",
    "ASPNET:V3.5",
    "NODE:20LTS",
    "NODE:18LTS",
    "NODE:16LTS",
    "JAVA:21",
    "JAVA:17",
    "JAVA:11",
    "JAVA:8",
    "TOMCAT:10.1-java21",
    "TOMCAT:10.1-java17",
    "TOMCAT:10.1-java11",
    "TOMCAT:10.1-java8",
    "TOMCAT:10.0-java21",
    "TOMCAT:10.0-java17",
    "TOMCAT:10.0-java11",
    "TOMCAT:10.0-java8",
    "TOMCAT:9.0-java21",
    "TOMCAT:9.0-java17",
    "TOMCAT:9.0-java11",
    "TOMCAT:9.0-java8",
    "TOMCAT:8.5-java21",
    "TOMCAT:8.5-java17",
    "TOMCAT:8.5-java11",
    "TOMCAT:8.5-java8"
  ]
}
PS C:\lab> az webapp list-runtimes --os windows
[
  "dotnet:9",
  "dotnet:8",
  "dotnet:7",
  "dotnet:6",
  "ASPNET:V4.8",
  "ASPNET:V3.5",
  "NODE:20LTS",
  "NODE:18LTS",
  "NODE:16LTS",
  "JAVA:21",
  "JAVA:17",
  "JAVA:11",
  "JAVA:8",
  "TOMCAT:10.1-java21",
  "TOMCAT:10.1-java17",
  "TOMCAT:10.1-java11",
  "TOMCAT:10.1-java8",
  "TOMCAT:10.0-java21",
  "TOMCAT:10.0-java17",
  "TOMCAT:10.0-java11",
  "TOMCAT:10.0-java8",
  "TOMCAT:9.0-java21",
  "TOMCAT:9.0-java17",
  "TOMCAT:9.0-java11",
  "TOMCAT:9.0-java8",
  "TOMCAT:8.5-java21",
  "TOMCAT:8.5-java17",
  "TOMCAT:8.5-java11",
  "TOMCAT:8.5-java8"
]
PS C:\lab> az webapp list-runtimes --os Linux
[
  "DOTNETCORE:9.0",
  "DOTNETCORE:8.0",
  "DOTNETCORE:7.0",
  "DOTNETCORE:6.0",
  "NODE:20-lts",
  "NODE:18-lts",
  "NODE:16-lts",
  "PYTHON:3.12",
  "PYTHON:3.11",
  "PYTHON:3.10",
  "PYTHON:3.9",
  "PYTHON:3.8",
  "PHP:8.3",
  "PHP:8.2",
  "PHP:8.1",
  "PHP:8.0",
  "JAVA:21-java21",
  "JAVA:17-java17",
  "JAVA:11-java11",
  "JAVA:8-jre8",
  "JBOSSEAP:8-java17",
  "JBOSSEAP:8-java11",
  "JBOSSEAP:8-java17_byol",
  "JBOSSEAP:8-java11_byol",
  "JBOSSEAP:7-java17",
  "JBOSSEAP:7-java11",
  "JBOSSEAP:7-java8",
  "JBOSSEAP:7-java17_byol",
  "JBOSSEAP:7-java11_byol",
  "JBOSSEAP:7-java8_byol",
  "TOMCAT:10.1-java21",
  "TOMCAT:10.1-java17",
  "TOMCAT:10.1-java11",
  "TOMCAT:10.0-java17",
  "TOMCAT:10.0-java11",
  "TOMCAT:10.0-jre8",
  "TOMCAT:9.0-java21",
  "TOMCAT:9.0-java17",
  "TOMCAT:9.0-java11",
  "TOMCAT:9.0-jre8",
  "TOMCAT:8.5-java11",
  "TOMCAT:8.5-jre8"
]
PS C:\lab> 

PS C:\lab> #5. 앱 서비스 배포
PS C:\lab> az webapp create -g rg-km -p asp-linux -n web-node-km --runtime "NODE:18-lts"
There are multiple plans with name asp-linux.
Try using the plan resource ID instead.

STEP 3 : [실습] VS Code로 App Service 생성하기 => Express 웹 코드를 만드는 과정

1. App Service 버튼을 '우클릭'

2. Create New Web App... (Advanced) 클릭

단계를 따라가고, 마지막 6단계는 'SKIP'!!

1. VS Code의 Azure 확장
Azure Sign in

2. 구독 필터로 기본 구독 설정

3. 웹 앱 만들기 옵션 
Create New Web App... (Advanced)

4. 웹 앱 정보 입력
- 이름: api[SUFFIX]
- 리소스 그룹: rg-paaslab-km
- 런타임 스택: .NET 6 (LTS)
- OS: Windows
- 위치: East US (or 그냥 뜨는 것??)
- 앱 서비스 요금제: asp-windows
- Application Insights: Skip     ### 꼭 Skip 하자

(앞서 만든 코드로) Express로 App Service 생성하기

< 로컬에만 실행 (배포) >

Express 접속 완료!

0. VS Code 터미널 사용

1. Express Generator 설치
npm install -g express-generator

2. 샘플 Express 프로젝트 만들고 VS Code의 프로젝트 폴더 변경
express testejs --view ejs --git

3. 프로젝트 종속성 라이브러리 설치
npm install

4. Node.js 앱 실행
npm start

5. 로컬 확인
http://localhost:3000
더보기
PS C:\lab> express testejs --view ejs --git
express : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\032\AppData\Roaming\npm\express.ps1 파일을 로드할 수  
없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.     
위치 줄:1 문자:1
+ express testejs --view ejs --git
+ ~~~~~~~
    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess


"""
터미널 열어서, 입력.
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
"""

PS C:\lab> express testejs --view ejs --git

   create : testejs\
   create : testejs\public\
   create : testejs\public\javascripts\
   create : testejs\public\images\
   create : testejs\public\stylesheets\
   create : testejs\public\stylesheets\style.css
   create : testejs\routes\
   create : testejs\routes\index.js
   create : testejs\routes\users.js
   create : testejs\views\
   create : testejs\views\error.ejs
   create : testejs\views\index.ejs
   create : testejs\.gitignore
   create : testejs\app.js
   create : testejs\package.json
   create : testejs\bin\
   create : testejs\bin\www

   change directory:
     > cd testejs

   install dependencies:
     > npm install

   run the app:
     > SET DEBUG=testejs:* & npm start
     


PS C:\lab> cd .\testejs
PS C:\lab\testejs> npm install

added 54 packages, and audited 55 packages in 2s

8 vulnerabilities (3 low, 4 high, 1 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.


PS C:\lab\testejs> npm start

> testejs@0.0.0 start
> node ./bin/www

GET / 200 10.225 ms - 207
GET /stylesheets/style.css 200 3.429 ms - 111
GET /favicon.ico 404 1.593 ms - 843
일괄 작업을 끝내시겠습니까 (Y/N)? Y

< 이번엔 Azure를 통해, '인터넷'에 배포(실행) >

6. 이번엔, VS Code에서 Azure로 코드 배포하기
Deploy to Web App

 

배포할 코드 페이지 파일을 열어두고 >

배포할 App Servieces를 선택한 뒤, '우클릭'. >
Deploy to Web App... 클릭 >
배포할 코드를 클릭 >
Deploy

웹 앱 배포 Succeeded 했다면,

Azure Portal의 웹 앱 > 개요 > 찾아보기

페이지가 배포되었다!


STEP 3 : [실습] 이번엔 다른 코드로 같은 과정 ; Express로 App Service 생성하기

< 로컬에만 실행 (배포) >

아까 [실습] 상단의 로컬 배포 방법으로 똑같이 실행.

1. guestbook.zip 압축 풀기
2. VS Code 프로젝트 폴더를 guestbook으로 변경
3. 프로젝트 종속성 라이브러리 설치
npm install

4. 방명록 Node.js 앱 실행
npm start

5. 방명록 앱 로컬 동작 확인
http://localhost:3000
더보기
PS C:\lab> cd .\day1\guestbook
PS C:\lab\day1\guestbook> npm install
npm warn old lockfile
npm warn old lockfile The package-lock.json file was created with an old version of npm,
npm warn old lockfile so supplemental metadata must be fetched from the registry.
npm warn old lockfile
npm warn old lockfile This is a one-time fix-up, please be patient...
npm warn old lockfile

added 53 packages, and audited 54 packages in 2s

9 vulnerabilities (4 low, 4 high, 1 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
PS C:\lab\day1\guestbook> npm start

> mytestexpressapp@0.0.0 start
> node ./bin/www

GET / 200 10.103 ms - 418
GET /new-entry 200 2.912 ms - 954
POST /new-entry 302 13.712 ms - 46
GET / 200 2.100 ms - 703
일괄 작업을 끝내시겠습니까 (Y/N)? Y
PS C:\lab\day1\guestbook>

웹이 실행 되면 GET, POST 등의 상황이 터미널에 나온다.

Ctrl + C를 누르고, Y를 입력하면, 작업을 끝낼 수 있다.


< 이번엔 Azure를 통해, '인터넷'에 배포(실행) >

 

 

아까 [실습] 하단의 Azure 배포 방법으로 똑같이 실행.

더보기

배포할 코드 페이지 파일을 열어두고 >

 

배포할 App Servieces를 선택한 뒤, '우클릭'. >

Deploy to Web App... 클릭 >

배포할 코드를 클릭 >

Deploy

 

웹 앱 배포 Succeeded 했다면,

 

Azure Portal의 웹 앱 > 개요 > 찾아보기

 

페이지가 배포되었다!


Azure App 서비스 요금제

  • 개요
    • 앱에 사용 가능한 VM 리소스의 기능과 용량 정의
      • 기능 : App에 내가 넣을 기능이 들어가는가
      • 용량 : 고가 - 높은/빠른 성능의 플랫폼 vs 저가
    • 웹 앱의 가격과 기능을 정의하는 방법
    • 하나의 웹 앱은 하나의 앱 서비스 계획만 사용 → 변경 가능
    • 앱 서비스 계획에 포함되는 정보
      • 구독, 지역, 리소스 그룹, 가격 계층, 인스턴스 크기, 인스턴스 개수
  • App 서비스 요금제 공유
    • 다수의 웹 및 모바일, API 앱에서 하나의 앱 서비스 계획 공유 가능
  • App 서비스 요금제
    • 운영체제 관점 ; Linux, Windows(’공유’ : 사용자 지정 도메인(도메인을 사서 연결 가능)) ; ‘기본’의 경우 Windows가 훨 비싸다. 왜냐하면, window 운영체제가 포함되어 있으며 좀 더 포퍼먼스가 좋게 하기 때문.
    • 하드웨어(Cpu, Memory, Remote Storage, Scale, SLA) 및 소프트웨어(Custom domain, Auto Scale 등) 관점
    • EX) 모범 사례 : 무료 계층으로 웹 앱 개발 후, 앱 규모의 성장에 따라 더 높은 가격 계층으로 업그레이드