2022 오픈소스 컨트리뷰션 아카데미 "NHN Toast Power Platform Connector" 프로젝트에 참여하면서 Challengers 기간 동안 배운 내용을 기록하였습니다.
멘토님이 직접 강의하신 Bicep으로 애저 리소스 프로비저닝하기를 추가로 공부하면서 기록하였습니다.
Provisioning
사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다.
Cloud에 Application을 배포하기 위해 서버(Virtual machine, Docker machine, Azure funtion etc...)가 필요하고 서버가 돌아가기 위해 필요한 것은 Azure Cloud 안의 모든 인스턴스가 돌아가야 한다
서버가 돌아가려면 필요한 리소스(인스턴스)
- 컴퓨터, CPU, 램, 네트워크, 네트워크 인터페이스 카드, IP 주소, 가상 머신, 스토리지 계정, 웹앱, 데이터베이스 등등
- 이때, 무료인 리소스가 있고 유료(CPU, 램, 보안, 방화벽 등등)인 리소스도 있으므로 나한테 가장 맞는 서버, 네트워크를 선택하고 그에 따라 적절히 용량을 구매하는 것이 리소스를 잘 활용할 수 있는 방법이다.
이때 Azure Cloud의 모든 인스턴스를 Resource라고 한다. 그리고 Cloud에 Resource를 생성하는 것을 Provisioning이라고 한다.
이때 Provisioning의 핵심은 바로 Azure Resource Manager(ARM)이다.
ARM은 크게 명령형과 선언형 2가지 방식으로 Provisioning을 한다.
명령형
위의 사진은
리소스 그룹을 명령어로 생성하고 rscgrp 변수에 저장 -> 저장소 account를 명령어로 생성함
이때 rscgrp는 리소스 그룹의 실행상태를 저장한 변수값!
선언형
ARM template부분의 사진임!
varibales : 변수 선언
resource : 변수를 참조하긴 하지만 ARM template 안에서 리소스가 만들어지진 않음! ARM template 자체를 실행시킨 후에야 리소스가 생성!
선언형 방식의 대표주자가 바로 ARM 템플릿인데...
구조(Json 객체로 이뤄짐)가 복잡해서 사용하기 힘들었다고 한다... 진입장벽과 러닝 커브가 높다는 것!! 이는 유지보수하기에 어렵다는 의미를 갖는다.
Bicep은 선언적으로 Azure 리소스를 배포하는 데 사용되는 Resource Manager 템플릿 언어이다. Bicep은 DSL(Domain-Specific Language)로, 특정 시나리오 또는 ‘도메인’을 위해 설계되었다.
먼저 Visual Studio code에 가서 bicep extesion 설치 후
az bicep upgrade
az bicep version
// 22.07.19 기준 0.8.9
az login
// Microsoft Azure 계정으로 로그인
// Azure 구독해야 로그인이 된다
위의 코드를 차례대로 진행한다.
로그인이 아주 잘 되었군!
그리고 루드 티렉토리 아래에 infra라는 폴더를 생성하고 main.bicep 파일을 만든다.
az bicep build -f main.bicep
위의 코드처럼 빌드시켜 ARM Template를 생성한다! main.json이 생성된 것을 볼 수 있다.
→ bicep 파일이랑 json 파일 한번 비교해보면 bicep이 엄청 간단하다는 것을 알 수 있다!
→ 현재 bicep에는 아무런 코드가 없다(그래서 "resources" key의 value 부분이 null이징! )
외쳐... Bicep의 핵심..!!! 리소스 Provisioning할 때 필요한 요소이다! 이때 Resource는 무조건!!! 필수로!! 적어줘야 한다! 나머지는 빠져도 상관없음
Define resources with Bicep and ARM templates
위 링크 가서 원하는 리소스의 Template format을 복사해서 bicep에 붙여넣기 하면 된다!!
파라미터 정의는 다음과 같다!
param name string // 필수로 외부에서 값을 넘겨줘야 함
param env string = 'dev' // 외부에서 값을 입력받아도 됨, 따로 입력이 없다면 default 값은 dev다.
이때 default값을 따로 지정해주지 않으면 반드시 다음과 같이 외부에서 값을 넘겨줘야 한다!
az deployment group create -n oca -g rg-oca-krc -f main.bicep -p name=oca
Terminal에 위의 코드를 실행시키면 bicep으로 리소스 그룹을 생성할 수 있는데(Provisioning), 이때 name은 파라미터로 사용자가 필수로 값을 건내야 한다.
이때 사용자로부터 입력을 받을 때 선택지 중에서만 입력값을 받아야 한다면? @allowed를 활용한다!
@allowed([
'Standard_LRS'
'Standard_GRS'
])
param sku string = 'Standard_LRS'
위의 코드의 경우 sku는 사용자의 입력을 받을 경우 'Standard_LRS', 'Standard_GRS' 이 두 가지 값만 받아들일 수 있다 라고 한정한다. 이때 아무값이 들어오지 않으면 'Standard_LRS'로 정의한다.
var rg = 'rg-${name}-${env}' // 파라미터를 받아서 리소스 그룹 이름으로 설정
위의 코드를 통해 파라미터를 전달받을 것을 이용해 리소스 그룹 이름 변수를 설정해 놓았다!
추가 활용 예시는 다음과 같다!
var metadata = {
longName: '{0}-${name}-${locationCode}' // {0} 부분은 placeholder
shortName: '{0}${name}${locationCode}'
}
resource st 'Microsoft.Storage/storageAccounts@2021-02-01' = {
name : format(metadata.shortName, 'st') // placeholder는 'st'다!
빌드(az bicep build -f main.bicep)하고 실행시켜 보면!! ARM 파일에 다음과 같이 생성된 것을 볼 수 있다!!
ARM 파일은 무조건 파라미터 변수 순서로 작성해야 하는데 bicep은 자유도가 높아서 아무렇게 작성해도 가능하다. 계속 바이셉에서 작성하고 빌드(az bicep build -f main.bicep) 해주면 된다!
보면 같은 이름의 namespace/type이 있는데 @api version이 날짜별로 다른 것을 확인할 수 있다! 우리는 가장 최신 날짜의 api를 사용하면 된다!
resource identifier에 빨간 줄 혹은 노란 줄이 생기면 드래그 하고 마우스 커서를 가져가면 어떤 properties가 필요한지 뜬다!! 빨간 줄 or 노란 줄이 뜨면 안 된다!! 또한 Define resources with Bicep and ARM templates를 보면서 필요한 properties를 채우면 된다!
bicep 내용을 어떻게 썼는지 보고 싶다면 nhn-toast-notification-service-custom-connector
여기를 참고!!
output id string = st.id // 리소스(여기서는 storage 리소스!)의 id값을 받음
output name string = st.name // 리소스의 name 값을 받음
bicep으로 빌드(컴파일)하고 배포 하는 코드는 다음과 같다!!!! az deployment group 참고!!
az bicep build -f main.bicep
az deployment group create -n oca -g rg-oca-krc -f main.bicep -p name=oca
-n 옵션 : 배포하는 이름
-g 옵션 : 리소스 그룹 이름
bicep을 provisioning하면 이런 아웃풋이 나오고
Azure Portal에서도 확인 가능하다!
참고로 웹브라우저 상에서도 리소스를 만들어볼 수 있다고 한다~~