APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure PipelinesでSelf-hosted agentを利用してみた

はじめに

こんにちは、ACS事業部の過部です。
この記事では、Azure PipelinesでSelf-hosted agentを利用するための作業手順をご紹介します。


Self-hosted agentとは

Azure Pipelinesでパイプラインを実行するためには、実際の処理を担うエージェントが必要となります。
エージェントには以下のような種類があり、その中の1つがSelf-hosted agentに当たります。

  • Microsoft-hosted agent - Microsoftが提供する実行環境を利用
  • Self-hosted agent - 独自に用意したVMを実行環境として利用
  • Azure virtual machine scale set agent - 独自に用意したVMSS(Virtual Machine Scale Set)を実行環境として利用。Self-hosted agentの一種。

Self-hosted agentは、独自に用意したVMにエージェント用プログラムをインストールし、エージェント化させたものを指します。VM本体の用意、メンテナンス及びアップグレードを独自で行う必要が出てくる代わりに、実行環境を細かく制御できる様になります。


Self-hosted agentの利用ケース

Self-hosted agentを利用することで、Microsoft-hosted agentでは実現困難な以下のケースに対応できます。

  • エージェントがアクセスするAzureリソースにIPアドレス制限を実装したい
  • エージェントがアクセスするAzureリソースをプライベート化したい

Microsoft-hosted agent利用時は、ジョブごとにMicrosoftが保有するエージェントの中からランダムで割り当てられます。ランダムなパブリックIPアドレスを用いてエージェントからAzureリソースへアクセスする形になるため、①IPアドレス制限の許可リストに登録できない、②プライベートなAzureリソースに到達できない といった課題がありました。

Self-hosted agentの場合は、エージェントのIPアドレスが固定化されるため、Azureリソース側でIPアドレスを指定して許可することが可能です。 また、プライベート化されたAzureリソースと同一VNetにVMをデプロイすることで、プライベートIPを用いてAzureリソースに到達することが可能です。


アクセス先AzureリソースにIPアドレス制限を実装する場合


アクセス先Azureリソースをプライベート化する場合


前提条件

  • エージェント用ホストマシンとしてオンプレVMも利用可能ですが、今回はAzure VMを利用します。
  • エージェントはLinux、macOS、Windows、及びDocker コンテナーにインストール可能ですが、今回はUbuntu 20.04を利用します。
  • エージェントにはLinux x64用2.213.2バージョンのバイナリファイルを利用します。
  • Azureリソースの作成はLinux上でaz-cliを用いて行います。


作業手順の全体像


以下のような流れで作業を行います。

  • まずAzure DevOps上で準備作業を行う(①②)
  • 次にターミナル上でaz-cliを用いて各種Azureリソースを作成する(③)
  • 最後にVMにSSHしてエージェント登録作業を行う(④)


手順① Agent Poolの作成

エージェントとAzure Pipelinesを紐づけるためには、エージェントをAzure PipelinesのAgent poolに追加する必要があります。そのため、まずはAzure Devops上でAgent Poolを作成します。

Agent Pool設定画面へ移動


Self-hosted agentを利用したいプロジェクトのトップ画面へ移動し、Project Settings -> Agent pools -> Add pool の順にクリックします。


各種パラメータ入力


設定用のポップアップが開くので、上記の様に各値を入力し、右下のCreateをクリックします。


手順② PATの作成

エージェントをAzure Pipelinesに登録するためにはをPATを入力する必要があります。エージェント登録の実施者が正規のAzure DevOpsユーザーであることを保証するためです。 そのため、引き続きAzure DevOps上でPAT(Personal Access Token)を作成していきます。

PAT設定画面へ移動


Uesr settings(右上のマーク) -> Personal access tokens -> New Token の順にクリックします。


各種パラメータ入力


設定用のポップアップが開くので、上記の様に各値を入力し、左下のCreateをクリックします。
※ Agent Pools項目が表示されない場合は、左下のShow more scopesをクリックしてください。


PAT値を確認


無事作成できたら、PAT値がこの場限りで表示されます。 次の手順で利用するので、大切に控えてください。


手順③ 各種Azureリソースの作成

ターミナル上で以下のコマンドを実行します。

# ResourceGroupの作成
az group create --location japaneast \
     --name "rg-sample"

# ネットワークの作成
az network vnet create --name "vnet-sample" \
    --resource-group "rg-sample" \
    --location japaneast \
    --address-prefixes "192.168.0.0/24" \
    --subnet-name "snet-sample" \
    --subnet-prefixes "192.168.0.0/28"

# VMの作成
az vm create --name "vm-sample" \
    --resource-group "rg-sample" \
    --image UbuntuLTS \
    --size Standard_B2s \
    --admin-username azureuser \
    --vnet-name "vnet-sample" \
    --subnet "snet-sample" \
    --generate-ssh-keys


手順④ VMをAzure Pipelinesへ登録

VMへSSH後、以下の様に登録作業を行います。

# VMへSSH接続
ssh azureuser@XXX.XXX.XXX.XXX

# Self-hosted agent用ツールのダウンロード及び解凍
mkdir myagent && cd myagent
curl -LO https://vstsagentpackage.azureedge.net/agent/2.213.2/vsts-agent-linux-x64-2.213.2.tar.gz
tar zxvf vsts-agent-linux-x64-2.213.2.tar.gz

# Self-hosted agentの対話的な初期設定
./config.sh

  ___                      ______ _            _ _
 / _ \                     | ___ (_)          | (_)
/ /_\ \_____   _ _ __ ___  | |_/ /_ _ __   ___| |_ _ __   ___  ___
|  _  |_  / | | | '__/ _ \ |  __/| | '_ \ / _ \ | | '_ \ / _ \/ __|
| | | |/ /| |_| | | |  __/ | |   | | |_) |  __/ | | | | |  __/\__ \
\_| |_/___|\__,_|_|  \___| \_|   |_| .__/ \___|_|_|_| |_|\___||___/
                                   | |
        agent v2.213.2             |_|          (commit 4f90e68)

>> End User License Agreements:

Building sources from a TFVC repository requires accepting the Team Explorer Everywhere End User License Agreement. This step is not required for building sources from Git repositories.

A copy of the Team Explorer Everywhere license agreement can be found at:
  /home/azureuser/myagent/license.html

# 今回はTFVCを利用しないため、Nを入力
Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) > N

>> Connect:

# Azure DevOpsのOrganizationトップページのURLを入力
Enter server URL > https://dev.azure.com/XXXXX

# PATを選択
Enter authentication type (press enter for PAT) >

# PATの値を入力
Enter personal access token > ****************************************************
Connecting to server ...

>> Register Agent:

# Agent Pool名を入力
Enter agent pool (press enter for default) > sample

# Agent名を設定。デフォルトはAzureリソース名
Enter agent name (press enter for vm-sample) >

# 作業フォルダを設定。デフォルトは_work
Enter work folder (press enter for _work) >

# Self-hosted agent用ツールのインストール
sudo ./svc.sh install azureuser

# Self-hosted agent用サービスの開始
sudo ./svc.sh start


エージェント登録の確認

最後にエージェント登録が完了したことをAzure DevOps上で確認します。

sample Agent Pool確認画面へ移動


プロジェクトのトップ画面へ移動し、Project settings -> Agent pools -> sample の順にクリックします。


登録済みエージェントの確認


先程登録したエージェントがOnline状態であることを確認します。

以上でSelf-hosted agentを利用するための準備作業は完了です。 パイプラインYAML内で以下の様に記述し、今回登録したエージェント上でパイプライン処理を走らせてみましょう。

pool:
  name: vm-sample


おわりに

今回はAzure PipelinesにおけるSelf-hosted agent利用手順をご紹介しました。 別の記事でVMSSをエージェントとして利用するための手順も紹介しているので、興味がある方はこちらの記事をご覧ください。 また、Azure Pipelinesを用いたCI/CDの一例として、Terraformを使ったインフラCI/CDの実装例もこちらで紹介しております。

最後に、 私たちはAzure・AKSを活用したシステムのSIや内製化のお手伝いをさせていただいております。ご相談等ありましたらお気軽にご連絡ください。