0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UiPath Automation Suite 2025.10 を Azure (Single Node) で初期構築する手順

0
Last updated at Posted at 2026-04-21

はじめに

本記事では、UiPath Automation Suite 2025.10 を Azure 上に Single Node 構成で初期構築する手順をまとめます。
初めて構築して、Automation Suiteを起動させるところまでを目的としており、機能、スペックは最小構成(Single NodeでOrchestratorのみ)としております。

本記事はこちらの記事を参考に作成しております。バージョンが古く、実施できなかった部分を補完しております。

構成概要

  • Azure
  • Single Node
  • VM(Automation Suite用): Standard_D16s_v3
  • OS: RHEL 8.8 Gen2
  • DB: Azure SQL
  • Storage: Azure Blob
  • サービス: Orchestratorのみ
  • 踏み台サーバ(Bastion): Standard_D2s_v3

Azureアカウント登録

Azure Portalからアカウント登録します。

・ひととおりの構築作業をするのに、2,000円から数千円(1日での作業前提。2日以上にわたる場合はもっと)程度かかりますが、初回は無料のクレジットが30日間3万円程度あるので基本的にはその範囲内で構築できるはずです。
・特に2日以上にわたって作業する場合は無料クレジット分を超えないか、Azure Portalのコスト分析のところを適宜見ながら実施しましょう(左側メニューのコストの管理と請求→コスト管理→コスト分析※コスト反映まで時間がかかります)
課金を止める方法は後述してます

AzureのvCPU拡張

・Azureはサブスクリプションごとに利用できる最大vCPUが割り当てられています。
・無料アカウントのデフォルトだと4vCPUでAutomation Suite起動要件を満たさないです。
・そのため、一度、クレジットカードを登録して有料アカウントにしたのち下記のとおり、vCPUの拡張を行います。
 ※有料アカウントになりますが初回のみ30日間は3万円程度分のクレジットが付与されるのですぐ請求とはならないです。

・クォータ→Compute→マイクォータ→拡張対象のクォータ選択→新しい制限を20にする(最低18vCPU(踏み台サーバBastionで2+VMで16)必要ですが少し余裕があった方が安定します)※拡張されるまで数分程度かかります。
image.png

Terraform 設定

ローカル端末にて、Terraformを使って構築を行います。
こちらの記事を参照してTerraformの実行環境をセットアップしてください。
AzureリソースをTerraformにて作成するためにはAzure CLIをインストールします。

az loginでサブスクリプションをしているAzureアカウントにログインします。※初期は一つしかサブスクリプションないのでそこでOK

az login
az account show

続いて、Terraformで実行するmain.tfは下記です。
 ※パスワード部分XXXXXは自分で設定してください。

main.tf
terraform {
  required_version = ">= 1.5.0"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 3.0.0"
    }
  }
}

# Local variables (change them according to your environment and the selected Automation Suite version 2025.10)
locals {
  res_prefix = "imacha"
  rg_name    = "imacha-rg"
  location   = "Japan East"
  tags = {
    Owner   = "imacha"
    Project = "AutomationSuite"
  }

  # Update these values to avoid conflicts and match your environment.
  vnet_address    = "10.1.0.0/16"
  subnet_address  = "10.1.0.0/24"
  storage_account = "imachastorage01" # must be globally unique, 3-24 chars, lowercase letters/numbers only
  vm_username     = "vm_admin"
  vm_password     = "xxxxx"
  web_hostname    = "imacha-web"
  sql_hostname    = "imachasql01"      # must be globally unique within Azure SQL server namespace
  sql_username    = "sql_admin"
  sql_password    = "xxxxx"
  as_fqdn         = "as.lab.test"

  # VM
  as_vm_size = "Standard_D16s_v3"

  # UiPath supports RHEL 8.8 / 8.9 / 8.10 / 9.2 / 9.4 / 9.5 / 9.6.
  rhel_publisher = "RedHat"
  rhel_offer     = "RHEL"
  rhel_sku       = "88-gen2"
  rhel_version   = "latest"
}

variable "my_ip" {
  description = "Your current public IP address"
  type        = string
}

provider "azurerm" {
  features {}

  # Terraform's automatic RP registration can be slow on a new subscription.
  # Disable it and register only the required providers manually before planning.
  resource_provider_registrations = "none"
}

# Create Resource Group
resource "azurerm_resource_group" "rg" {
  name     = local.rg_name
  location = local.location
  tags     = local.tags
}

# Create Virtual Network
resource "azurerm_virtual_network" "vnet" {
  name                = "${local.res_prefix}-vnet"
  address_space       = [local.vnet_address]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_subnet" "subnet" {
  name                 = "${local.res_prefix}-subnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = [local.subnet_address]
}

resource "azurerm_network_security_group" "nsg" {
  name                = "${local.res_prefix}-nsg"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_network_security_rule" "nsg_rule" {
  name                        = "RDP"
  priority                    = 1001
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "*"
  destination_port_range      = "3389"
  source_address_prefix       = var.my_ip
  destination_address_prefix  = "*"
  resource_group_name         = azurerm_resource_group.rg.name
  network_security_group_name = azurerm_network_security_group.nsg.name
}

# This allows SSH from within the VNet so you can connect from the bastion VM.
resource "azurerm_network_security_rule" "ssh_rule" {
  name                        = "SSH"
  priority                    = 1002
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "*"
  destination_port_range      = "22"
  source_address_prefix       = "VirtualNetwork"
  destination_address_prefix  = "*"
  resource_group_name         = azurerm_resource_group.rg.name
  network_security_group_name = azurerm_network_security_group.nsg.name
}

# Create Windows VM for Bastion
resource "azurerm_public_ip" "public_ip" {
  name                = "${local.res_prefix}-bastion-pip"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method   = "Static"
}

resource "azurerm_network_interface" "vm_nic" {
  name                          = "${local.res_prefix}-bastion-nic"
  location                      = azurerm_resource_group.rg.location
  resource_group_name           = azurerm_resource_group.rg.name
  accelerated_networking_enabled = true

  ip_configuration {
    name                          = "ipconfig"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.public_ip.id
  }
}

resource "azurerm_network_interface_security_group_association" "vm_sg_nic_association" {
  network_interface_id      = azurerm_network_interface.vm_nic.id
  network_security_group_id = azurerm_network_security_group.nsg.id
}

resource "azurerm_windows_virtual_machine" "vm_bastion" {
  name                  = "${local.res_prefix}-bastion"
  resource_group_name   = azurerm_resource_group.rg.name
  location              = azurerm_resource_group.rg.location
  size                  = "Standard_D2s_v3"  # x64, supports Premium storage, and is available in japaneast
  computer_name         = "bastion"
  admin_username        = local.vm_username
  admin_password        = local.vm_password
  network_interface_ids = [azurerm_network_interface.vm_nic.id]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2022-datacenter-g2"
    version   = "latest"
  }
}

# Azure SQL
resource "azurerm_mssql_server" "sql_server" {
  name                          = local.sql_hostname
  resource_group_name           = azurerm_resource_group.rg.name
  location                      = azurerm_resource_group.rg.location
  version                       = "12.0"
  administrator_login           = local.sql_username
  administrator_login_password  = local.sql_password
  public_network_access_enabled = false
}

resource "azurerm_private_endpoint" "sql_server_endpoint" {
  name                = "${local.sql_hostname}-endpoint"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  subnet_id           = azurerm_subnet.subnet.id

  private_service_connection {
    name                           = "${local.sql_hostname}-private-conn"
    private_connection_resource_id = azurerm_mssql_server.sql_server.id
    subresource_names              = ["sqlServer"]
    is_manual_connection           = false
  }
}

data "azurerm_private_endpoint_connection" "sql_server_conn" {
  name                = azurerm_private_endpoint.sql_server_endpoint.name
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone" "sql_server_zone" {
  name                = "privatelink.database.windows.net"
  resource_group_name = azurerm_resource_group.rg.name
  depends_on          = [azurerm_private_endpoint.sql_server_endpoint]
}

resource "azurerm_private_dns_zone_virtual_network_link" "sql_server_vnet_link" {
  name                  = "${local.sql_hostname}-vnet-link"
  resource_group_name   = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.sql_server_zone.name
  virtual_network_id    = azurerm_virtual_network.vnet.id
}

resource "azurerm_private_dns_a_record" "sql_server_dns_record" {
  name                = azurerm_mssql_server.sql_server.name
  zone_name           = azurerm_private_dns_zone.sql_server_zone.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 3600
  records             = [data.azurerm_private_endpoint_connection.sql_server_conn.private_service_connection[0].private_ip_address]
}

# Storage Account for Object Storage
resource "azurerm_storage_account" "storage_account" {
  name                          = local.storage_account
  location                      = azurerm_resource_group.rg.location
  resource_group_name           = azurerm_resource_group.rg.name
  account_tier                  = "Standard"
  account_replication_type      = "LRS"
  public_network_access_enabled = false
}

resource "azurerm_private_endpoint" "storage_endpoint" {
  name                = "${local.storage_account}-endpoint"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  subnet_id           = azurerm_subnet.subnet.id

  private_service_connection {
    name                           = "${local.storage_account}-private-conn"
    private_connection_resource_id = azurerm_storage_account.storage_account.id
    subresource_names              = ["blob"]
    is_manual_connection           = false
  }
}

data "azurerm_private_endpoint_connection" "storage_conn" {
  name                = azurerm_private_endpoint.storage_endpoint.name
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone" "storage_zone" {
  name                = "privatelink.blob.core.windows.net"
  resource_group_name = azurerm_resource_group.rg.name
  depends_on          = [azurerm_private_endpoint.storage_endpoint]
}

resource "azurerm_private_dns_zone_virtual_network_link" "storage_vnet_link" {
  name                  = "${local.storage_account}-vnet-link"
  resource_group_name   = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.storage_zone.name
  virtual_network_id    = azurerm_virtual_network.vnet.id
}

resource "azurerm_private_dns_a_record" "storage_account_dns_record" {
  name                = azurerm_storage_account.storage_account.name
  zone_name           = azurerm_private_dns_zone.storage_zone.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 3600
  records             = [data.azurerm_private_endpoint_connection.storage_conn.private_service_connection[0].private_ip_address]
}

# RHEL VM for Automation Suite WebAP server
resource "azurerm_network_interface" "web_server_nic" {
  name                          = "${local.res_prefix}-${local.web_hostname}-nic"
  location                      = azurerm_resource_group.rg.location
  resource_group_name           = azurerm_resource_group.rg.name
  accelerated_networking_enabled = true

  ip_configuration {
    name                          = "ipconfig"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_network_interface_security_group_association" "web_sg_nic_association" {
  network_interface_id      = azurerm_network_interface.web_server_nic.id
  network_security_group_id = azurerm_network_security_group.nsg.id
}

resource "azurerm_linux_virtual_machine" "web_server_vm" {
  name                  = "${local.res_prefix}-${local.web_hostname}"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  network_interface_ids = [azurerm_network_interface.web_server_nic.id]
  size                  = local.as_vm_size

  os_disk {
    name                 = "${local.res_prefix}-${local.web_hostname}_OsDisk"
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }

  source_image_reference {
    publisher = local.rhel_publisher
    offer     = local.rhel_offer
    sku       = local.rhel_sku
    version   = local.rhel_version
  }

  computer_name                   = local.web_hostname
  admin_username                  = local.vm_username
  admin_password                  = local.vm_password
  disable_password_authentication = false
}

locals {
  disk_sizes = [256, 16, 512, 512, 512]
}

resource "azurerm_managed_disk" "web_server_disk" {
  count                = length(local.disk_sizes)
  name                 = "${local.res_prefix}-${local.web_hostname}_DataDisk_${count.index}"
  location             = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  storage_account_type  = "StandardSSD_LRS"
  create_option         = "Empty"
  disk_size_gb          = element(local.disk_sizes, count.index)
}

resource "azurerm_virtual_machine_data_disk_attachment" "web_server_disk_attach" {
  count              = length(local.disk_sizes)
  managed_disk_id    = element(azurerm_managed_disk.web_server_disk.*.id, count.index)
  virtual_machine_id = azurerm_linux_virtual_machine.web_server_vm.id
  lun                = count.index
  caching            = "ReadWrite"
}

# Private DNS Zone for Automation Suite WebAP
resource "azurerm_private_dns_zone" "web_server_zone" {
  name                = local.as_fqdn
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone_virtual_network_link" "web_server_vnet_link" {
  name                  = "${local.res_prefix}-web-link"
  resource_group_name   = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.web_server_zone.name
  virtual_network_id    = azurerm_virtual_network.vnet.id
}

resource "azurerm_private_dns_a_record" "web_server_dns_a_record" {
  name                = "@"
  zone_name           = azurerm_private_dns_zone.web_server_zone.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 3600
  records             = [azurerm_linux_virtual_machine.web_server_vm.private_ip_address]
}

resource "azurerm_private_dns_cname_record" "web_server_dns_cname_record" {
  for_each = toset(["alm", "monitoring", "objectstore", "registry", "insights"])

  name                = each.key
  zone_name           = azurerm_private_dns_zone.web_server_zone.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 3600
  record              = local.as_fqdn
}

output "bastion_public_ip_address" {
  value = azurerm_public_ip.public_ip.ip_address
}

output "web_server_private_ip_address" {
  value = azurerm_linux_virtual_machine.web_server_vm.private_ip_address
}

output "sqlserver_hostname" {
  value = azurerm_mssql_server.sql_server.fully_qualified_domain_name
}

terraform.tfvars

IP設定用。terraform.tfvarsという名称でファイルを作成。
my_ipは
curl ipinfo.io/ip
等で取得して貼り付けできます。

my_ip = "あなたのグローバルIP"

Terraform 実行

cd "main.tfを配置したパス"
terraform init
terraform plan -out main.tfplan
terraform apply main.tfplan

VM に接続

RDPで踏み台サーバ(Bastion) 経由で Linux VM に接続します。

BastionのパブリックIPはAzurePorta上で確認できます。
例)ホーム→リソースグループ→imacha-rg→imacha-bastion→ネットワークの欄を確認
image.png
image.png

Bastionの接続情報はmain.tfの下記を確認すること。
vm_username 例)vm_admin
vm_password 例) XXXXXで設定した値

image.png

Bastion上では、ブラウザを起動しTeratermをインストールして、Teraterm経由でLinux VMにアクセスを行います。
ブラウザ上で「Teraterm」で検索すればインストーラーページがでてきます。基本的に最新版(今回は5.6.0)でよいです。
image.png
image.png
インストーラーを実行※お好みで言語だけ日本語にして、他は設定変更せず「次へ」で完了まで進めてよいです。
image.png

接続先のLinux VMのホスト名は下記をmain.tf上で確認すること。
web_hostname 例)imacha-web
vm_username 例)vm_admin
vm_password 例) XXXXXで設定した値
image.png
image.png

VMへのSSH接続完了
image.png

前提パッケージのインストール

Kubernetes(RKE2)+ UiPath が動くための最低限のLinuxツール各種をインストールします。

sudo dnf -y install iscsi-initiator-utils nfs-utils rpcbind util-linux \
nmap-ncat openssl httpd-tools gettext zstd podman \
bind-utils wget unzip conmon

「Complete!」と表示されれば完了。

Automation SuiteのInstaller の配置

sudo mkdir -p /opt/UiPathAutomationSuite/2.2510.1
cd /opt/UiPathAutomationSuite/2.2510.1

sudo wget https://download.uipath.com/automation-suite/2.2510.1/installer-2.2510.1.zip -O as-installer.zip
sudo unzip as-installer.zip
sudo chmod -R +x .

ディスク構成

※下記の部分はsdd、sde等が対応します。ディスクサイズで判断して割り当てします。

ディスク状態確認

lsblk

#出力例
NAME   SIZE
sdc    16G
sdd   512G
sde   512G
sdf   512G
sdg   256G

cluster / etcd

sudo ./bin/uipathctl rke2 disk \
--cluster-disk-name /dev/<256G> \
--etcd-disk-name /dev/<16G>

data ディスク

※上記の「cluster / etcd」構築時インストーラーのフォルダが削除されるため、下記インストーラー配置を再実行したのち、dataディスク構成を実施

#インストーラー配置
sudo mkdir -p /opt/UiPathAutomationSuite/2.2510.1
cd /opt/UiPathAutomationSuite/2.2510.1

sudo wget https://download.uipath.com/automation-suite/2.2510.1/installer-2.2510.1.zip -O as-installer.zip
sudo unzip as-installer.zip
sudo chmod -R +x .
#dataディスク構成
sudo ./bin/uipathctl rke2 disk --volume /dev/<512G-1>
sudo ./bin/uipathctl rke2 disk --volume /dev/<512G-2>
sudo ./bin/uipathctl rke2 disk --volume /dev/<512G-3>

割り当て

sudo ./bin/uipathctl rke2 disk --monitoring
sudo ./bin/uipathctl rke2 disk --insights
sudo ./bin/uipathctl rke2 disk --docker-registry
sudo ./bin/uipathctl rke2 disk --objectstore

sysctl 設定

sudo tee /etc/sysctl.d/99-uipath.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
EOF

sudo sysctl --system

Configファイル(cluster_config.json) 作成

#Webアクセス用にファイアウォール停止※ネットワーク制御はAzureのNSGにてアクセス元・ポートを制限
sudo systemctl disable --now firewalld

#Webアクセス用ポートを指定
sudo ./bin/uipathctl config generate --port 8080 --host 0.0.0.0

image.png

踏み台サーバ(Bastion)上のブラウザで開きます。

http://<VM-IP>:8080

※VM-IPは
hotname -I
で確認できます。

ブラウザ上でConfigファイル作成画面が起動します。下記入力内容に従ってファイル作成を行う。
image.png

【入力内容】
Select Platform: Automation Suite on Linux

Basic Configurations:
Deployment mode: Online
Deployment type: Single Node
FQDN: as.lab.test
Fixed RKE address: as.lab.test
Admin Username: ※任意
Admin Password: ※任意。後ほどAutomation Suiteログインで使います
Select Services: 任意だが、最小構成であればOrchestratorだけ ON にしておく。

Database:
Create Database: ON
FQDN: imachasql01.database.windows.net
Port: 1433
Username: ※sql_username で設定した値 例)sql_admin
Password: ※sql_password で設定した値

Object Store:
Storage Type: Azure Blob
Storage Account Name: imachastorage01
Azure FQDN suffix: core.windows.net
Storage Accout Key: ※Azure portalにて確認(リソースグループ→imacha-rg→imachastorage01→アクセスキー→Key1のキーからコピー)
image.png

Certificate: 何も入力しないでOK
Advanced Configurations: 何も入力しないでOK
Product Specific Configurations: 何も入力しないでOK
あとはDownloadを実行

<入力時キャプチャ>
image.png
image.png
image.png
image.png
image.png
image.png

cluster_config.json 配置

ファイルをダウンロードしたのち移動させる。
直接/opt配下には格納できないので、/home/"username"等にドラッグ&ドロップしたのちmvする。

image.png

sudo mv ~/cluster_config.json /opt/UiPathAutomationSuite/

install事前確認(prereq)

sudo ./bin/uipathctl rke2 prereq run \
/opt/UiPathAutomationSuite/cluster_config.json \
--node-type server \
--versions versions/helm-charts.json

Errorがなく「Checks complete!」が出力されればOK

install実行

30分から2時間程度かかります。※途中でCtrl+Cで止めないように

sudo ./install-uipath.sh \
-i /opt/UiPathAutomationSuite/cluster_config.json \
-o /opt/UiPathAutomationSuite/output.json \
-a \
--accept-license-agreement

(install途中で状態確認)

sudo /var/lib/rancher/rke2/data/*/bin/kubectl \
--kubeconfig /etc/rancher/rke2/rke2.yaml get pods -A

PodのSTATUSが 「Running」「Completed」であればOK。
「Pending」がしばらく続くようであればエラー解析してください。

完了確認

下記ログが出力されたら、インストール完了

UiPath Services were installed successfully.

Bastionのブラウザ上で下記URLへアクセスし、Automation Suiteにアクセスとログインできることを確認できたら完了です。

https://as.lab.test

image.png

Azure リソース削除(構築完了後、環境を削除したいとき)

Terraform で作成した環境を削除します。
こちらを実行しておけば、課金されることを防げます。
削除してもmain.tfが残っていれば、同じ手順で再構築できます。

terraform destroy
 →Enter a value: yes

実行後念のため、Azure Portalのリソースグループを見て、全て削除されているか確認しましょう。
 ※課金を防ぐ方法としてAzure Portal上でVMを停止しておく方法もありますが、VM以外にも課金が発生するものもあるので全て削除するのが確実です

振り返り

つまづいたところ含めて振り返り

  • 最小構成に従って構築しましょう。一度、最小スペック16CPU未満の8CPUのVMで構築したら、install実行時Podが全部乗らず初めからやりなおしになりました。Podが乗らなくてもinstallバッチログはエラーを出さないので、しばらく待つことになりました。必ず最小構成以上で構築しましょう。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?