はじめに
本記事では、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)必要ですが少し余裕があった方が安定します)※拡張されるまで数分程度かかります。

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→ネットワークの欄を確認


Bastionの接続情報はmain.tfの下記を確認すること。
vm_username 例)vm_admin
vm_password 例) XXXXXで設定した値
Bastion上では、ブラウザを起動しTeratermをインストールして、Teraterm経由でLinux VMにアクセスを行います。
ブラウザ上で「Teraterm」で検索すればインストーラーページがでてきます。基本的に最新版(今回は5.6.0)でよいです。


インストーラーを実行※お好みで言語だけ日本語にして、他は設定変更せず「次へ」で完了まで進めてよいです。

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


前提パッケージのインストール
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
踏み台サーバ(Bastion)上のブラウザで開きます。
http://<VM-IP>:8080
※VM-IPは
hotname -I
で確認できます。
ブラウザ上でConfigファイル作成画面が起動します。下記入力内容に従ってファイル作成を行う。

【入力内容】
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のキーからコピー)

Certificate: 何も入力しないでOK
Advanced Configurations: 何も入力しないでOK
Product Specific Configurations: 何も入力しないでOK
あとはDownloadを実行
cluster_config.json 配置
ファイルをダウンロードしたのち移動させる。
直接/opt配下には格納できないので、/home/"username"等にドラッグ&ドロップしたのちmvする。
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
Azure リソース削除(構築完了後、環境を削除したいとき)
Terraform で作成した環境を削除します。
こちらを実行しておけば、課金されることを防げます。
削除してもmain.tfが残っていれば、同じ手順で再構築できます。
terraform destroy
→Enter a value: yes
実行後念のため、Azure Portalのリソースグループを見て、全て削除されているか確認しましょう。
※課金を防ぐ方法としてAzure Portal上でVMを停止しておく方法もありますが、VM以外にも課金が発生するものもあるので全て削除するのが確実です
振り返り
つまづいたところ含めて振り返り
- 最小構成に従って構築しましょう。一度、最小スペック16CPU未満の8CPUのVMで構築したら、install実行時Podが全部乗らず初めからやりなおしになりました。Podが乗らなくてもinstallバッチログはエラーを出さないので、しばらく待つことになりました。必ず最小構成以上で構築しましょう。










