はじめに
「FTPでファイルをやりとりしたいんだけれども、何かいい手はないか?」という話をいただくことがあります。少し前にAzure Blob StorageでのSFTPサポートがプレビューで提供されたのですが、プレビューということもあって現時点(2022年10月)で本番投入はしにくいです。
そんな中、Azureのサンプルの中にAzure Container Instance上でSFTPサーバーを起動する方法が記されていました。
これをやってみました。
実装
上記サイトからリンクされているGitHubリポジトリにあるARMテンプレートやBicepファイルを元に実装してみます。
個人的にはTerraformのほうが馴染みがあるのでTerraformで実装してみます。
やっていることは単純で、以下のことを実装します。
- Azure Storage File Shareを作成する
- Dockerコンテナ
atomz/sftp
を使ってSFTPサーバーを起動する - ユーザー名とパスワードの設定は環境変数
SFTP_USERS
で指定しておく
こんな感じの実装になりました。全部のソースは末尾を参照してください。
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上にファイルが作成されました。
ソース
実装したソースは以下に置いてあります。