SFTPでファイルを送受信するためのサーバーをAzure上で構築してみた

はじめに

FTPでファイルをやりとりしたいんだけれども、何かいい手はないか?」という話をいただくことがあります。少し前にAzure Blob StorageでのSFTPサポートがプレビューで提供されたのですが、プレビューということもあって現時点(2022年10月)で本番投入はしにくいです。

learn.microsoft.com

そんな中、Azureのサンプルの中にAzure Container Instance上でSFTPサーバーを起動する方法が記されていました。

learn.microsoft.com

これをやってみました。

実装

上記サイトからリンクされているGitHubリポジトリにあるARMテンプレートやBicepファイルを元に実装してみます。

github.com

個人的にはTerraformのほうが馴染みがあるのでTerraformで実装してみます。

やっていることは単純で、以下のことを実装します。

  1. Azure Storage File Shareを作成する
  2. Dockerコンテナatomz/sftpを使ってSFTPサーバーを起動する
  3. ユーザー名とパスワードの設定は環境変数SFTP_USERSで指定しておく

hub.docker.com

こんな感じの実装になりました。全部のソースは末尾を参照してください。

resource "azurerm_resource_group" "main" {
  name     = "rg-myftp"
  location = var.location
}

resource "azurerm_storage_account" "main" {
  name                     = "st${var.prefix}myftp001"
  resource_group_name      = azurerm_resource_group.main.name
  location                 = azurerm_resource_group.main.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

resource "azurerm_storage_share" "main" {
  name                 = var.filesharename
  storage_account_name = azurerm_storage_account.main.name
  quota                = 5
}

resource "azurerm_container_group" "main" {
  name                = "aci-myftp-name"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  ip_address_type     = "Public"
  os_type             = "Linux"
  restart_policy      = "Never"

  container {
    name   = "sftp"
    image  = "atmoz/sftp"
    cpu    = "1.0"
    memory = "1.0"

    ports {
      port     = 22
      protocol = "TCP"
    }

    secure_environment_variables = {
      SFTP_USERS = "${var.sftpuser}:${var.sftppassword}:1001"
    }

    volume {
      name       = "sftpvolume"
      mount_path = "/home/${var.sftpuser}/upload"
      read_only  = false
      share_name = var.filesharename

      storage_account_name = azurerm_storage_account.main.name
      storage_account_key  = azurerm_storage_account.main.primary_access_key
    }
  }
}

実行

Terraformでリソースを作成し、sftpコマンドで接続をしてみました。

miyohide@tsubame 01_exec % sftp sftpuser001@xxx.xxx.xxx.xxx
sftpuser001@xxx.xxx.xxx.xxx's password:
Connected to xxx.xxx.xxx.xxx.
sftp> ls
upload
sftp> cd upload
sftp> pwd
Remote working directory: /upload
sftp> put test.txt
Uploading test.txt to /upload/test.txt
test.txt                                      100%   16     1.4KB/s   00:00
sftp> ls
test.txt
sftp> quit
miyohide@tsubame 01_exec %

mount_pathで指定したパスがディレクトリにあるのでそこに移動してファイルをputします。

putコマンドでファイルをアップロードしたところ、Azure Storage上にファイルが作成されました。

ソース

実装したソースは以下に置いてあります。

github.com