본문 바로가기

AI, 논문, 데이터 분석

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

배포 슬롯 구현

배포 슬롯이란?

테스트 서버가 배포 서버와 100% 동일한 환경인 것을 보장해 준다. 그러면, 이후 배포했을 때 발생할 문제를 줄일 수 있다. 테스트에서 작동이 잘 되었으면, 배포 환경에서도 잘 작동되리라 안심하고 믿을 수 있다.

배포 시에는, Production slot 과 staging slot을 교환하면 된다. 혹시 되돌리고 싶으면, 다시 교환을 해버리면 된다!

  • 환경
    • App 서비스 요금제가 표준, 프리미엄 또는 격리 계층이어야 한다.
    • 프로덕션 슬롯과 교환하기 전에 스테이징 배포 슬롯에서 앱 변경 사항의 유효성을 검사.
    • '스테이징 슬롯으로 앱을 배포하기 때문에 프로덕션으로 교환되기 전에 슬롯에 있는 모든 인스턴스가 준비되어 있는 상태.
    • '교환 후에는 스테이징 슬롯 안에 이전 프로덕션 앱 존재.
  • 슬롯 간 트래픽 라우팅
    • 여러 슬롯 간의 트래픽 가중치 수동 구성 가능
    • 설정 후 비 프로덕션 슬롯으로 지정한 비율을 임의로 라우팅
      • 1 시간 동안 또는 쿠키 삭제 시 까지 슬롯 고정
      • staging 슬롯인지 확인하는 방법 : x-ms-routing-name=staging
      • 프로덕션 슬롯인지 확인하는 방법 : x-ms-routing-name= self

[실습] 배포 슬롯 구현

0. webgb[SUFFIX] 선택

1. (Azure 포털) [배포]-[배포 슬롯]-[+슬롯 추가]
- 이름: devtest
- 다음의 설정 복제: webgb[SUFFIX]

2. (VS Code) [Azure 확장] - [App Services] 
- webgb[SUFFIX] 하위 항목 확장
- [Deployment Slot] - [Create New Deployment Slot]
이름: staging
다음의 설정 복제: webgb[SUFFIX]

3. 방명록 코드 수정 (코드를 한글로 변경해보자)

4. (VS Code) 배포 슬롯으로 배포`
- 대상 슬롯: devtest

5. (Azure 포털) 슬롯 교환
- 소스: devtest
- 대상: staging

6. (VS Code) 슬롯 교환
- 소스: staging
- 대상: webgb[SUFFIX]

7. 슬롯간 트래픽 라우팅
- 프로덕션: 80
- staging: 20

 

 

step 0. 배포 슬롯 2개(devtest, staging) 만들기

([실습7]의 STEP 2 해두기 ; 로그인, '리소스 그룹', 플랜, 앱 서비스 배포)

web-node-km 에서 '배포 슬롯' 클릭. 

Add slot 클릭 (Add slot이 안 뜨고 요금제 업그레이드가 뜬다면, 요금제를 업그레이드 해줘야 한다.)

'web-node-km' 추가.

 

Azure Portal에서 devtest를 만들어졌다.

 

Azure CLI에서도 staging을 만들어 보자. (같은 행동 다른 방법)

'web-node-km' > 'Deployment Slots' 우클릭 > Create New Deployment Slot... > 'staging' 입력

 

배포 슬롯을 2개(devtest, staging) 만들어져있다.

이제 배포해보자. (코드를 한글로 변경한 페이지를 배포할 것이다.)


step 1. devtest에 배포

' 'web-node-km' > devtest' 우클릭 > 'Deploy to Slot...' > 배포할 경로 입력

devtest의 '찾아보기'를 클릭하면, 배포가 잘 된 페이지를 볼 수 있다.

devtest에 잘 배포 되었다.

 

devtest의 작동이 잘 되므로, 이제 staging에 배포하자.

SWAP을 통해, devtest의 내용을 staging으로 바꾸어 배포.


step 2. staging에 배포

(아까처럼 Azure CLI에서 해도 되고, 아니면 Azure Portal 에서는)

Swap 버튼을 눌러서,

Source : devtest의 내용을

Target : staging으로. 바꾸기.

 

staging의 '찾아보기'를 클릭하면, 배포가 잘 된 페이지를 볼 수 있다.

staging에 잘 배포 되었다.

(참고로 swap 한 devtest는 그럼 영어 버젼으로 바뀌어있다.)


step 3. 이제 진짜 production에 배포

이제는 또, 진짜 production에 상용화 되도록 배포하자.

(아까처럼 Azure Portal에서 해도 되고, 아니면 Azure CLI에서는)

staging 우클릭 > Swap Deployment Slot... 클릭 > (swap할) production 선택

production 페이지 (web-node-km)의 페이지가 잘 배포되었다.

 


STEP 2 : 웹 앱 만들기

1. 스토리지 계정 만들기 
- 리소스 그룹: rg-paaslab
- 이름: stimg[SUFFIX]
- 위치: Australia Centra
- 성능: 표준
- 복제: LRS

- 고급 탭에 3가지 다 체크

2. 만든 스토리지 계정의 연결 문자열 기록
엑세스 키 > 
DefaultEndpointsProtocol=https;AccountName=stimgkm;AccountKey=LHzrk7XvFvU00iNz/0f3WVa0CNG0E+5Xuft9HbM5Z72c3rUUQmhMzMBynPxKRUdJpWUic3KctGXZ+AStTGKCqA==;EndpointSuffix=core.windows.net

3. 컨테이너 만들기
- 이름: images
- 공용 액세스 수준: Blob (anonymous read access for blobs only)

4. 샘플 blob 업로드
- grilledcheese.jpg

5. API 웹 앱 만들기
[기본]
- 리소스 그룹: rg-paaslab
- 이름: api[SUFFIX]
- 게시: 코드
- 런타임 스택: .NET 6 (LTS)
- 운영 체제: windows
- 위치: Australia Centra # 코드에서 사용하는 Name :australiaeast, 포털에서 사용한 보여지는 DisplayName : Australia Centra
- Windows 플랜: 새로만들기 -> asp-imgapp 
[모니터링]
Application Insights 사용: 아니오

[표준 s1]


6. 프런트엔드 웹 앱 만들기
[기본]
- 리소스 그룹: rg-paaslab
- 이름: web[SUFFIX]
- 게시: 코드
- 런타임 스택: .NET 6 (LTS)
- 운영 체제: windows
- 위치: East US
- Windows 플랜: asp-imgapp 
[모니터링]
Application Insights 사용: 아니오

 

먼저 스토리지 계정(stimg)을 만들어주자.

여기에 이미지 파일을 저장해둘 것이다.

 

(이후 웹앱의 환경변수를 만들 때 사용하기 위해) 액세스 키를 복사해두자.

'images' 컨테이너를 만들어주자. 여기에 이미지를 넣을 것이다.

 

만든 컨테이너 stimg에 이미지 업로드.

App Service 에서, 배포할 웹앱을 만들자. ; apikm

 

아까 이미지 파일을 올려놓은 스토리지 계정(stimg) 키 복사했던 것을, 환경변수에 추가해주자.

(그럼 스토리지 계정의 이미지 파일이 api 앱으로 가지고 온 셈이다.)

api 사이트로 들어가보면, 이미지 파일이 잘 전달되어 온 것을 확인할 수 있다.

다음으로는 이 이미지 파일을 활용하여 프런트 웹사이트를 만들어 보자.


이제 프런트엔드 웹앱만들기

App Service 에서, 배포할 웹앱을 만들자. ; webkm

환경 변수에

 

환경변수에, 이미지를 가지고 있는 api를 넣어주자.

(그럼 이미지가 web 프론트엔드에 가져와져서, 화면에 보이게 된다.)

마지막, 배포하자.

#1. api 앱 구성
#1.1 [설정] 섹션의 [구성] 링크

#1.2 [애플리케이션 설정] 탭의 [+새 애플리케이션 설정]
#이름: StorageConnectionString
#값: 스토리지 계정 연결 문자열
# DefaultEndpointsProtocol=https;AccountName=stimgkm;AccountKey=LHzrk7XvFvU00iNz/0f3WVa0CNG0E+5Xuft9HbM5Z72c3rUUQmhMzMBynPxKRUdJpWUic3KctGXZ+AStTGKCqA==;EndpointSuffix=core.windows.net


#2. web 앱 구성
#2.1 [개요] 섹션의 [기본 도메인] 링크

#2.2 (나의) 웹 앱 > 설정 > 환경 변수 > 추가
#이름: ApiUrl
#값: api 앱의 URL # https://apikm.azurewebsites.net

#3. api 앱 코드 배포 (app.zip이 존재하는 폴더로 이동) 
# az login
az webapp deployment source config-zip --resource-group rg-paaslab-km --src api.zip --name apikm

#4. api 앱 동작 테스트

#5. web 앱 코드 배포 (web.zip이 존재하는 폴더로 이동) 
az webapp deployment source config-zip --resource-group rg-paaslab-km --src web.zip --name webkm

#6. web 앱 동작 테스트
# https://webkm.azurewebsites.net/

이미지가 잘 나온다!

끝!

 

스토리지 계정에 이미지를 올리고,
먼저 api 앱으로 이미지를 가져오고,
(프론트) web 앱을 통해 이미지를 활용/배포해봤다!

더보기
PS C:\lab\day2> #3. api 앱 코드 배포
PS C:\lab\day2> # az login
PS C:\lab\day2> az webapp deployment source config-zip --resource-group rg-paaslab-km --src api.zip --name apikm
This command has been deprecated and will be removed in a future release. Use 'az webapp deploy' instead.
Getting scm site credentials for zip deployment
Starting zip deployment. This operation can take a while to complete ...
Deployment endpoint responded with status code 202
Polling the status of async deployment. Start Time: 2025-01-10 02:51:47.915945+00:00 UTC
{
  "active": true,
  "author": "N/A",
  "author_email": "N/A",
  "complete": true,
  "deployer": "ZipDeploy",
  "end_time": "2025-01-10T02:52:07.5992629Z",
  "id": "b58e5c05314749e393836fed128182a3",
  "is_readonly": true,
  "is_temp": false,
  "last_success_end_time": "2025-01-10T02:52:07.5992629Z",
  "log_url": "https://apikm.scm.azurewebsites.net/api/deployments/latest/log",
  "message": "Created via a push deployment",
  "progress": "",
  "provisioningState": "Succeeded",
  "received_time": "2025-01-10T02:51:47.8931664Z",
  "site_name": "apikm",
  "start_time": "2025-01-10T02:51:48.5338535Z",
  "status": 4,
  "status_text": "",
  "url": "https://apikm.scm.azurewebsites.net/api/deployments/latest"
}