Bicep을 사용하여 Linux 가상 머신 프로비전
Bicep 템플릿의 핵심 요소는 Azure 리소스를 지정하는 리소스입니다. 각 리소스에는 제네릭 및 리소스별 속성 집합이 포함되어 있습니다. 예를 들어 다음 예제에 사용된 템플릿은 Azure 가상 네트워크에 대해 설명합니다. 이름 및 위치 속성은 일반적이지만 addressPrefix
는 리소스별로 다릅니다. 리소스 옆에 있는 Microsoft.Network/virtualNetworks@2021-05-01
문자열은 해당 API 버전을 지정하고, virtualNetwork
항목은 템플릿 내에서 리소스를 참조하는 방법을 제공하는 기호 이름을 나타냅니다.
리소스 요소 외에도 다음 샘플 템플릿에는 배포 중에 가상 네트워크에 이름을 할당할 수 있는 매개 변수 요소도 포함되어 있습니다. 이때 이름을 할당하지 않으면 기본값인 lnx-bcp-vnet
이 대신 적용됩니다. 설명 요소는 선행 @
문자로 표시되는 데코레이터의 예입니다. 매개 변수의 역할을 설명하는 것이 목적이며 Azure Portal을 사용하여 해당 Azure Resource Manager 템플릿을 검토하거나 배포할 때 매개 변수의 텍스트 상자 옆에 출력이 표시됩니다. Bicep을 사용하여 Linux VM을 프로비전하려면 다음 코드 예제를 사용합니다.
@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
}
}
Bicep 템플릿을 사용하여 Linux VM 배포
Bicep 작업에는 템플릿 작성 및 배포가 포함됩니다. 작성 환경을 간소화하고 향상시키려면 Bicep 확장과 함께 Visual Studio Code를 사용합니다. 동일한 확장은 Bicep 기반 배포도 지원합니다. 명령줄 또는 스크립팅된 작업의 일부로 배포를 트리거하려는 경우 Bicep CLI를 독립 실행형 유틸리티로 설치하여 사용하거나 Azure CLI 세션 내에서 직접 사용할 수 있습니다. Azure CLI는 az bicep
명령을 처음 호출하는 동안 Bicep CLI를 자동으로 설치합니다. 그러나 Bicep의 수동 설치를 수행하려면 az bicep install
을 실행합니다.
실제로 Bicep을 사용하여 Linux를 실행하는 Azure VM을 프로비전하는 프로세스에는 일반적으로 다음과 같은 개략적인 단계 시퀀스가 포함됩니다.
- 적합한 VM 이미지를 식별합니다.
- 적합한 VM 크기를 식별합니다.
- Bicep 템플릿을 작성합니다.
- Bicep 템플릿의 배포를 시작합니다.
Bicep 템플릿을 배포할 때 변환이라고 하는 작업을 통해 자동으로 이 템플릿을 동일한 Azure Resource Manager 템플릿으로 변환합니다. bicep build
및 bicep decompile
명령을 각각 실행하여 Bicep과 Azure Resource Manager 형식 간의 변환을 수행할 수도 있습니다.
적합한 VM 이미지와 크기를 식별하려면 이 모듈의 이전 단원에 설명된 단계를 따릅니다. 이 단원에서는 Bicep 관련 작업에 중점을 둡니다.
Bicep 템플릿 작성
Bicep 템플릿을 작성하려면 먼저 Bicep 확장이 설치된 Visual Studio Code 세션을 시작합니다. 다음으로 main.bicep이라는 파일을 만듭니다. 파일에 다음 콘텐츠를 추가하고 변경 내용을 저장합니다.
참고
Bicep 파일을 위해 선택한 파일 이름은 임의로 지정할 수 있지만 파일 콘텐츠 또는 용도를 반영하는 이름을 선택하는 것이 좋으며, 파일 확장명에 “.bicep”을 사용해야 합니다.
@description('The name of your virtual machine')
param vmName string = 'lnx-bcp-vm'
@description('Username for the virtual machine')
param adminUsername string
@description('Type of authentication to use on the virtual machine')
@allowed([
'sshPublicKey'
'password'
])
param authenticationType string = 'password'
@description('SSH Key or password for the virtual machine')
@secure()
param adminPasswordOrKey string
@description('Unique DNS Name for the Public IP used to access the virtual machine')
param dnsLabelPrefix string = toLower('${vmName}-${uniqueString(resourceGroup().id)}')
@description('The allowed Linux distribution and version for the VM')
@allowed([
'Ubuntu-2204'
])
param ubuntuOSVersion string = 'Ubuntu-2204'
@description('Location for all resources')
param location string = resourceGroup().location
@description('The size of the VM')
param vmSize string = 'Standard_F4s'
@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'
@description('Name of the subnet in the virtual network')
param subnetName string = 'subnet0'
@description('Name of the network security group')
param networkSecurityGroupName string = 'lnx-bcp-nsg'
var imageReference = {
'Ubuntu-2204': {
publisher: 'Canonical'
offer: '0001-com-ubuntu-server-jammy'
sku: '22_04-lts-gen2'
version: 'latest'
}
}
var publicIPAddressName = '${vmName}-pip'
var networkInterfaceName = '${vmName}-nic'
var osDiskType = 'Standard_LRS'
var subnetAddressPrefix = '10.3.0.0/24'
var addressPrefix = '10.3.0.0/16'
var linuxConfiguration = {
disablePasswordAuthentication: true
ssh: {
publicKeys: [
{
path: '/home/${adminUsername}/.ssh/authorized_keys'
keyData: adminPasswordOrKey
}
]
}
}
resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
name: networkInterfaceName
location: location
properties: {
ipConfigurations: [
{
name: 'ipconfig1'
properties: {
subnet: {
id: subnet.id
}
privateIPAllocationMethod: 'Dynamic'
publicIPAddress: {
id: publicIPAddress.id
}
}
}
]
networkSecurityGroup: {
id: networkSecurityGroup.id
}
}
}
resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2021-05-01' = {
name: networkSecurityGroupName
location: location
properties: {
securityRules: [
{
name: 'ssh'
properties: {
priority: 1000
protocol: 'Tcp'
access: 'Allow'
direction: 'Inbound'
sourceAddressPrefix: '*'
sourcePortRange: '*'
destinationAddressPrefix: '*'
destinationPortRange: '22'
}
}
]
}
}
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
}
}
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
parent: virtualNetwork
name: subnetName
properties: {
addressPrefix: subnetAddressPrefix
privateEndpointNetworkPolicies: 'Enabled'
privateLinkServiceNetworkPolicies: 'Enabled'
}
}
resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
name: publicIPAddressName
location: location
sku: {
name: 'Basic'
}
properties: {
publicIPAllocationMethod: 'Dynamic'
publicIPAddressVersion: 'IPv4'
dnsSettings: {
domainNameLabel: dnsLabelPrefix
}
idleTimeoutInMinutes: 4
}
}
resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
name: vmName
location: location
properties: {
hardwareProfile: {
vmSize: vmSize
}
storageProfile: {
osDisk: {
createOption: 'FromImage'
managedDisk: {
storageAccountType: osDiskType
}
}
imageReference: imageReference[ubuntuOSVersion]
}
networkProfile: {
networkInterfaces: [
{
id: networkInterface.id
}
]
}
osProfile: {
computerName: vmName
adminUsername: adminUsername
adminPassword: adminPasswordOrKey
linuxConfiguration: ((authenticationType == 'password') ? null : linuxConfiguration)
}
securityProfile: json('null')
}
}
output adminUsername string = adminUsername
output fqdn string = publicIPAddress.properties.dnsSettings.fqdn
output sshCommand string = 'ssh ${adminUsername}@${publicIPAddress.properties.dnsSettings.fqdn}'
참고
이 템플릿은 GitHub 리포지토리 Azure 빠른 시작 템플릿의 콘텐츠를 기반으로 합니다.
Bicep 템플릿 배포 시작
main.bicep 파일을 저장한 후, 템플릿 기반 배포를 진행할 수 있습니다. 먼저 로컬 컴퓨터에서 Azure CLI 세션을 시작하고 az login
를 실행하여 인증합니다. Azure 구독에서 리소스를 프로비전할 수 있는 충분한 권한이 있는 사용자의 자격 증명을 제공해야 합니다. 다음으로 현재 디렉터리를 main.bicep 파일이 있는 디렉터리로 변경합니다. 또는 Azure Cloud Shell Bash 세션을 시작하고 해당 파일을 Azure Cloud Shell 환경 내의 홈 디렉터리에 업로드할 수 있습니다.
다음으로, 인증된 Azure CLI 세션에서 다음 명령을 실행하여 후속 배포의 일부인 모든 리소스를 포함하는 리소스 그룹을 만듭니다.
az group create --name rg-lnx-bcp --location eastus
계속 진행하기 전에 다음 명령을 실행하여 최신 버전의 Bicep CLI를 사용하고 있는지 확인할 수 있습니다.
az bicep upgrade
마지막으로 다음 명령을 실행하여 배포를 시작합니다.
az deployment group create --resource-group rg-lnx-bcp --template-file main.bicep --parameters adminUsername=azureuser
참고
이 명령에는 --parameters
스위치가 포함되어 있으며 이 경우 배포 중인 Azure VM에 대한 로컬 관리자의 이름을 설정합니다. Azure CLI는 adminPasswordOrKey
매개 변수의 기본값이 설정되지 않았기 때문에 해당 암호를 제공하라는 메시지를 표시합니다.
Azure VM은 일반적으로 몇 분 이내에 곧 실행되기 시작해야 합니다. 연결하려면 배포에서 생성된 출력을 검토하여 네트워크 인터페이스와 연결된 FQDN(정규화된 도메인 이름)을 식별합니다. 또는 shCommand
값을 사용할 수도 있습니다. 메시지가 표시되면 SSH 연결을 설정할 때 인증할 새로 설정된 암호를 제공합니다.
Bicep 배포의 출력 값을 기록하지 않은 경우 다음 명령을 실행하여 다시 표시할 수 있습니다.
az deployment group show \
--resource-group rg-lnx-bcp \
--name main \
--query properties.outputs
JSON 형식 출력은 다음 내용과 유사해야 합니다.
{
"adminUsername": {
"type": "String",
"value": "azureuser"
},
"fqdn": {
"type": "String",
"value": "lnx-bcp-vm-example.eastus.cloudapp.azure.com"
},
"sshCommand": {
"type": "String",
"value": "ssh azureuser@lnx-bcp-vm-example.eastus.cloudapp.azure.com"
}
}