Azure DevOps를 이용하여 Spring Boot 앱을 Azure Virtual Machine Scale Set(VMSS)에 배포하기

Last Update: 공유

다음은 Azure DevOps Pipeline을 이용하여 간단한 Spring Boot 앱을 빌드하여 Azure Blob Storage에 배포한 후에 Custom Script Extension을 이용하여 VMSS에 해당 앱을 설치하는 과정을 단계별로 실습해 볼 수 있습니다. 아래의 단계는 업무에 사용될 수 있는 완벽한 예제는 아니며, VMSS에 Java 앱을 배포하는 여러가지 방법 중에 한가지 아이디어로써 참고하실 수 있습니다.

Storage Account의 생성


  1. Azure 포털에 로그온 합니다.
  2. 좌측 메뉴에서 Create Resource를 선택합니다.
  3. 찾기에서 Storage Account찾아 선택합니다.
  4. 생성 시, 새로운 resource group을 만들고, 임의의 Storage Account의 이름을 입력한 후, 적당한 Region을 선택하여 생성합니다.
  5. 생성이 완료된 후, Storage Account로 들어가서 새로운 container를 추가합니다.
  6. Container 생성시, Public Access Level을 Blob으로 선택하여 생성합니다.

Azure DevOps Repo의 구성


  1. Azure DevOps 포털에 로그온 합니다.
  2. New Project를 선택하여 새로운 Project를 생성합니다.
  3. 생성된 Project로 들어가서 좌측의 Repos메뉴를 선택합니다.
  4. 이후 Import a Repository 부분에서 사용하고자 하는 Spring Boot 예제를 import 하여 구성합니다. (예, https://github.com/spring-guides/gs-spring-boot.git )

Azure DevOps Service Connection 추가


  1. 이전 단계에서 생성된 Project의 Project settings에 들어갑니다.
  2. Service Connections에서 새로운 Service Connection을 생성합니다.
  3. New Service Connection에서 Azure Resource Manager를 선택합니다.
  4. Authentication Metod는 Service principal (automatic)을 선택한 후 다음을 누릅니다.
  5. Scope level은 Subscription으로 선택하고 Subscription, Resource Group(기존에 생성한 Resource Group을 선택) 그리고, Service Connection 이름을 입력하고 저장합니다.

Azure DevOps Pipeline의 구성


  1. Project내에서Pipelines를 선택하고 Create Pipeline을 선택합니다.
  2. Azure Repos Git을 선택하여 이전 단계에서 구성한 Repo를 선택합니다.
  3. Configure your pipeline 단계에서는 Repo에 구성된 소스를 컴파일하기 위해 Maven (build your java project and run tests with Apache Maven)을 선택합니다.
  4. 프로젝트 내에 azure-pipelines.yml 파일이 자동 생성되고, 아래와 같이 내용을 추가합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    trigger:
    - no

    pool:
    vmImage: ubuntu-latest

    steps:
    - task: Maven@3
    inputs:
    mavenPomFile: 'pom.xml'
    mavenOptions: '-Xmx3072m'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.8'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: true
    testResultsFiles: '**/surefire-reports/TEST-*.xml'
    goals: 'package'

    - task: CopyFiles@2
    displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
    inputs:
    SourceFolder: '$(system.defaultworkingdirectory)'
    Contents: '**/*.?(jar|sh)'
    TargetFolder: '$(build.artifactstagingdirectory)'
    flattenFolders: true
    condition: succeededOrFailed()

    - task: PublishBuildArtifacts@1
    displayName: 'Publish Artifact: drop'
    inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'
    enabled: false
    condition: succeededOrFailed()

    - task: AzureCLI@2
    displayName: 'Azure CLI '
    inputs:
    azureSubscription: '$(AZURE_SUBSCRIPTION)'
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: 'az storage blob upload-batch --destination artifacts --source $(build.artifactstagingdirectory) --account-name $AZURE_STORAGE_ACCOUNT'
  5. Maven에 의해서 생성된 Task 외에 Copy Files, Publish Build Artifacts, 그리고, Azure CLI task를 차례로 추가합니다. 특히, Azure CLI task에서는 Maven Task에서 생성된 Artifacts를 지정된 Azure Blob Storage에 업로드를 합니다.
  6. Variables에 AZURE_SUBSCRIPTION과 AZURE_STORAGE_ACCOUNT를 추가하고, 앞서서 추가한 Service Connection과 Storage Account이름을 값으로 각각 입력합니다.
  7. Run합니다.
  8. 문제가 없다면, Maven을 통해 생성된 (예를 들어, spring-boot-0.0.1-SNAPSHOT.jar) jar 파일이 지정된 Blob Storage에 업로드가 됩니다.

Shell Script 파일의 추가


  1. Azure DevOps 포털에 로그온 합니다.
  2. 이전 단계에서 생성한 Project 내의 Repos의 Files로 이동합니다.
  3. 기존의 소스 폴더에 Shell Script 파일(.sh 파일)을 생성합니다.
  4. 아래와 같이 내용을 추가합니다.
    1
    2
    3
    4
    #!/bin/sh
    sudo apt-get update -y
    sudo apt-get install -y default-jre
    java -jar spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
  5. 저장한 후 다시 build Pipeline을 Run 합니다.
  6. 문제가 없다면, 지정된 Azure Blob Storage에 jar 파일과 더불어 .sh 파일이 업로드가 됩니다.

Azure Virtual Machine Scale Set (VMSS)의 구성


  1. Azure 포털에 로그온 합니다.
  2. 좌측 메뉴에서 Create resource를 선택합니다.
  3. 찾기 메뉴에서 Virtual Machine Scale Set을 찾아 선택합니다.
  4. 생성시 기존에 생성한 Storage Account와 동일한 Resource Group을 선택합니다.
  5. Virtual Machine Scale Set name을 입력하고, Resource Group이 위치한 Region을 선택합니다.
  6. Ubuntu Server 20.04 LTS를 선택합니다.
  7. Networking에서 “Edit Network Interface”을 클릭하고, (간단한 Spring Boot 예제의 실행 테스트를 위해서) Public Ip Address를 enable 한 후 OK를 누릅니다.
  8. Management에서 Upgrade Policy는 Automatic으로 선택합니다.
  9. Review+Create를 선택하여 VMSS를 생성합니다.

Azure Virtual Machine Scale Set (VMSS) Port 오픈


  1. Azure 포털에서 이전 단계에서 생성한 VMSS 환경으로 들어갑니다.
  2. Settings의 Networking메뉴를 선택하고, 이후 Add Inbound Port Rule을 선택합니다.
  3. Source Port range는 “*”, Destination Port는 “8080”, Source 와 Destination을 둘 다 Any로 선택하고, TCP에 대해서 “Allow”로써 추가합니다.
  4. 이후 TCP 8080 포트가 오픈됩니다.

Azure DevOps의 Release Pipeline구성


  1. Azure DevOps 포털에 로그온 합니다.
  2. 해당 Project로 들어가서 좌측의 Release 메뉴를 선택합니다. 이후 New Pipeline을 생성합니다.
  3. Empty Job을 선택합니다.
  4. Agent Job에서 Agent Specification을 ubuntu-20.04 로 선택합니다.
  5. Agent Job에 Azure CLI task를 추가합니다.
  6. Azure CLI task에서 Azure Resource Manager Connection은 이전 단계에서 생성한 Service Connection을 선택합니다.
  7. Script Type은Shell 로 선택합니다.
  8. Script Location은 inline script로 선택하고, 아래의 script를 추가합니다.
    1
    az vmss extension set --resource-group vmss_rg --vmss-name vmssmachines --name customScript --publisher Microsoft.Azure.Extensions --version 2.0 --extension-instance-name JarExt --settings '{"fileUris": ["https://myvmssstorage.blob.core.windows.net/artifacts/deploy.sh", "https://myvmssstorage.blob.core.windows.net/artifacts/spring-boot-0.0.1-SNAPSHOT.jar"],"commandToExecute": "./deploy.sh"}'
  9. Create Release를 통해 deploy를 합니다.
  10. 이전 Build Pipeline을 통해 업로드가 된 jar 파일과 shell script로 구성된 Custom Script Extension이 지정된 VMSS에 설치가 되고 Automatic Upgrade Policy에 의해 자동 업데이트가 됩니다.
  11. 정상적으로 설치가 완료되면, VMSS에서 관리 중인 임의의 VM에 대한 지정된 Public IP와 8080 port를 이용해 Spring Boot 앱에 접근 테스트를 합니다.

※본 정보의 내용(첨부문서, 링크처 등을 포함)은 작성일 현재이며, 예고없이 변경될 수 있습니다.