SFTP on Azure with Azure Container Instance (ACI) and Azure File Share
เรียนรู้แนวทางการใช้งาน Azure Container Instance (ACI) ในการรัน Docker เพื่อใช้เป็น SFTP Server สำหรับแชร์ไฟล์ โดยเก็บ Files ไว้ที่ Azure File Share และจะลองใช้งาน Azure Resource Manager templates (ARM templates) เพื่อลดเวลาการติดตั้งลงครับ
FTP กับ SFTP แตกต่างกันอย่างไร
FTP (File Transfer Protocol) เป็นมาตราฐานในการโอนถ่ายไฟล์ระหว่าง Client กับ Server ในรูปแบบนึงที่ได้รับความนิยมสูง แต่ก็มีข้อเสียคือข้อมูลที่รับส่งกันนั้นไม่มีการเข้ารหัสทำให้อาจจะเกิดโอกาสที่มีบุคคลที่สามเข้าอ่านข้อมูลระหว่างทางได้ครับ
SFTP (Secure File Transfer Protocol) เป็นมาตราฐานที่ช่วยเพิ่มความปลอดภัยในการโอนถ่ายไฟล์ โดยทำการเข้ารหัสข้อมูลและคำสั่งก่อนที่จะถ่ายโอนไฟล์ระหว่าง Client และ Server ด้วย SSH (Secure Shell) ครับ ทำให้เรามั่นใจได้ว่าข้อมูลที่เรา Upload/ Download นั้นสามารถทำได้อย่างปลอดภัย ไม่ถูกบุคคลที่สามเข้าถึงได้หรือถ้าได้ข้อมูลไปก็เป็นข้อมูลที่เข้ารหัสไว้ไม่สามารถอ่านได้ครับ
ทำไมถึงเลือก Docker Image ไม่เลือกการติดตั้งโปรแกรมบน Server โดยตรง
จริงๆเราสามารถติดตั้งโปรแกรมใน Windows ของเราเพื่อให้เป็น SFTP Server ได้เลยโดยที่ไม่ต้องใช้งาน Docker Image นะครับ
แต่ที่ผมเลือกใช้ Docker Image เป็นเพราะว่าค่าใช้จ่ายในการที่เราต้องสร้าง VM ขึ้นมาเพื่อเป็น Windows/Linux Server บน Cloud นั้นมีราคาในการดูแลรักษาที่สูงครับ (เป็น Cloud Deployment Model แบบ IaaS — Infrastructure as a Service
) ทั้งเรื่องของ VM Package เอง (OS License, CPU, RAM, Disk) การสำรองข้อมูล การ Update OS Patch รวมไปถึงการดูแลรักษาความปลอดภัยครับ และก็ต้องใช้คนที่ชำนาญใน OS นั้นๆด้วยครับ
ซึ่งใน Cloud Deployment Model แบบ PaaS-Platform as a Service
จะเข้ามาช่วยลดค่าใช้จ่ายในจุดนี้ได้ครับ Developer เน้นดูแลเฉพาะระบบและข้อมูลของตัวเอง ในส่วนที่เหลือให้ทาง Cloud Provider ช่วยดูแลให้แทนครับ โดยในบทความนี้เราจะทำการสร้าง Docker Image แล้วนำไปรันบน PaaS
แทนครับผม ง่ายกับการติดตั้ง รวดเร็วทำซ้ำได้ และง่ายต่อการดูแลรักษาครับ แถมยังลดค่าใช้จ่ายลงได้อีกเยอะเลย
ขั้นตอนการสร้าง SFTP ด้วย Docker บน Local Machine
ใครยังไม่ติดตั้ง WSL 2, Docker Desktop, VS Code Remote — WSL Extension ให้ติดตั้งและทดลองใช้งานเบื้องต้นตามบทความ 2 บทความนี้ก่อนนะครับ
Docker Image
เราจะใช้ Docker Image ชื่อ atmoz/sftp
จาก Docker Hub ตามที่อยู่ข้างล่างนี้นะครับ ซึ่งติดตั้ง OpenSSH ไว้ให้เราแล้วเพื่อเป็น SFTP (SSH File Transfer Protocol) server ให้อย่างสะดวกรวดเร็ว
ติดตั้ง SFTP ด้วย Docker บน Local Machine
เปิด Windows Terminal, เลือก WSL2 ของเราแล้วรันคำสั่งนี้นะครับ (หรือรันผ่าน VS Code ก็ได้ครับ)
docker run \
-v ~/upload:/home/sftpUser/upload \
-p 22:22 \
-e SFTP_USERS=sftpUser:sftpPassword:1001 \
-d atmoz/sftp:latest
- เราทำการ mount volume จาก
home directory
ของ User ที่เรา Login เข้า WSL 2 ไปยังhome directory
ของ UsersftpUser
ที่เราจะสร้างไว้บน Docker Container - Map
SFTP port
เข้าด้วยกันระหว่างเราและ Docker - ระบุ
environment variable
เพื่อสร้าง UsersftpUser
โดยใช้:
เป็นตั่วคั่นนะครับ ตำแหน่งแรกคือชื่อuser
, ตำแหน่งที่สองคือpassword
, ตำแหน่งสุดท้ายคือUID
เพื่อให้เราสามารถเขียน Files บน Mounted Volumes ด้วยสิทธิที่อยู่ใน host filesystem.
ทดลองเชื่อมต่อด้วย File Zilla
ติดตั้ง File Zilla โดย Download จากลิ้งนี้นะครับ
สร้าง SFTP Connection บน File Zilla
ทดลอง Connect เข้า Local SFTP ของเรา และทำการ Upload Files เข้าไป จะพบว่า Files ที่เรา Upload เข้า SFTP แล้วจะอยู่บนเครื่องของเรานะครับ แม่ว่าเราจะปิด Docker Container แล้วก็ตาม
Azure Container Instance (ACI) คืออะไร
ACI เป็นหนึ่งใน Compute Options ของ Azure โดยเน้นการบริการในการนำ Docker Image มารันเพื่อสร้างเป็น Public Endpoint ที่เข้าถึงได้บน Internet อย่างรวดเร็วครับผม
ACI เหมาะสำหรับงานประเภท ระบบขนาดเล็กๆ ที่เราสามารถเปิดและปิดการทำงานในช่วงที่เรากำหนด ไม่จำเป็นต้องเปิดรันยาวทั้งเดือนครับ ข้อดีคือจะสามารถประหยัดค่าใช้จ่ายได้เพราะ Azure คิดค่าบริการตามวินาทีที่เราเปิดใช้งานครับ ถ้าปิดก็จะไม่เสียค่าใช้จ่าย เหมาะกับงาน run-once tasks เช่น image rendering, building and testing applications, task automation, build jobs นะครับ
ดูวิธีเปิดปิด ACI แบบ Schedule ด้วย Logic App ได้ที่ลิ้งข้างล่างนะครับ
บริการ Compute Options อื่นๆก็เช่น Virtual Machines, Azure App Service, Serverless Computing, Kubernetes ครับ โดยเราสามารถเลือกบริการได้จากตารางข้างล่างนี้นะครับ
ถ้าเป็นระบบ Websites ที่มีปริมาณการใช้งานและการปรับแต่งสูง ผมแนะนำบริการ Azure App Service for Containers ดีกว่าครับ เพราะมี Spec CPU, Memory ให้เลือกหลากหลายกว่าในการ Scale In, รวมถึงยังปรับแต่ง Scale Out ได้อีกด้วยครับ
ถ้าเราต้องการ Full container orchestration, เช่น Service Discovery, Automatic Scaling และ Coordinated Application Upgrades นั้นทาง Microsoft แนะนำให้ใช้อีกบริการนึงที่ชื่อ Azure Kubernetes Service (AKS) แทนนะครับ
ACI Pricing
ค่าใช้จ่ายจะคิดเหมาจ่ายเป็น Package รายเดือน แต่จะคิดเฉพาะเวลาที่เราเปิด Server นั้นครับ ถ้าเราปิด Server ไว้จะไม่เสียค่าใช้จ่ายในส่วนนี้(เฉพาะ CPU, Memory นะครับ แต่ถ้าเป็น Disk ยังคงเสียเหมือนเดิม)
ตัวอย่างเช่นเราเปิดระบบไว้ 5 วันใน 1 เดือน จะมีค่าใช้จ่ายในส่วนของ CPU, Memory แค่ 5 วันครับ ไม่ต้องเหมาจ่ายทั้งเดือน
ตัวอย่างการคำนวน
เราสร้าง ACI — Linux Container โดยมี 1 vCPU, 1 GB เพื่อทดลองเปิดรันแค่ 1 ชั่วโมง (3,600 วินาที) เสร็จแล้วก็ปิด ACI เพื่อประหยัดค่าใช้จ่าย
Memory duration = Number of container groups * memory duration (seconds) * GB * price per GB-s
1 container group * 3,600 seconds * 1 GB * $0.0000015 per GB-s
= $0.0054
vCPU duration = Number of container groups * vCPU duration (seconds) * vCPU(s) * price per vCPU-s
1 container groups * 3,600 seconds * 1 vCPU * $0.0000135 per vCPU-s days
= $0.0486
Total billing = Memory duration (seconds) + vCPU duration (seconds) = total cost
= $0.0054 + $0.0486 = $0.054
มาลองดูค่าใช้จ่ายจริงจากการเปิด ACI (1 vCPU, 1 GB) ทิ้งไว้ทั้งเดือนนะครับ
Azure File Share คืออะไร
บริการแบบ PaaS ที่รองรับการ Share File บน Protocal Server Message Block
(SMB) ที่ช่วยให้เราเข้าถึง File ได้ผ่านการ Mount Share Drive บน Windows, Linux, MacOS ครับผม
รองรับการ Encryption ทั้งแบบ At Rest (ข้อมูลที่ถูกจัดเก็บอยู่ใน Storage) และแบบ In Transit (รับส่งข้อมลู) ด้วยครับ
ในส่วนของราคานั้นเราสามารถดูรายละเอียดได้จากลิ้งข้างล่างนี้นะครับ
สร้าง Azure File Share
สร้าง Azure Resource Group
ในขั้นตอนแรกให้เราสร้าง Resource Group บน Azure Portal ก่อนนะครับ
สร้าง Azure File Share
Azure File Share จะอยู่ภายใต้ Storage accounts นะครับ เพราะงั้นเราจะทำ 3 ขั้นตอนคือ 1. สร้าง Storage accounts, 2. สร้าง File Share, 3. เก็บ File Secret Key เพื่อใช้ใน ACI
1.สร้าง Storage accounts
เลือกเมนู Storage accounts และทำการระบุรายละเอียดตามนี้นะครับ
- Region: เลือก
Southeast Asia
เพราะใกล้ประเทศไทยที่สุด - Performance: เลือก
Standard
เพื่อประหยัดค่าใช้จ่าย เพราะเราไม่ได้ต้องการ Low Latency - Redundancy: เลือก
Locally-redundant storage (LRS)
เพื่อประหยัดค่าใช้จ่าย โดยถ้า Server Rack / Drive ใน Data Center นั้นพัง ระบบจะย้ายเราไปใช้ข้อมูลบน Rack อื่นที่ได้สำรองไว้อีก 2 Server Rack / Drive
ส่วนที่เหลือให้คงตาม Default เลยครับ โดยเราจะได้เรื่อง Soft Delete ที่ Azure จะสำรองข้อมูลของ File ที่เราลบลไปให้อีก 7 วัน เผื่อเราต้องนำกลับมาใช้ครับผม
หน้าตาเมื่อสร้าง Storage account แล้ว
2.สร้าง File Share
เลือกที่เมนู File shares -> + File share, ระบุชื่อ file share
ทำการเลือก Storage tiers โดยมีรายละเอียดดังนี้
- Premium: ราคาแพงที่สุด, solid-state drives (SSDs), performance สูงและ latency ต่ำ เหมาะกับการเก็บข้อมูลสำหรับเป็น databases, web site hosting ใช้ได้ทั้ง Protocol Server Message Block (SMB),Network File System (NFS)
- Transaction optimized: hard disk drives (HDDs), transaction heavy workloads เหมาะกับการเก็บข้อมูลสำหรับเป็น file server เพื่อใช้ร่วมกับระบบอื่นๆเช่น website
- Hot: เหมาะสำหรับการใช้งานทั่วไป เช่นเป็น file server สำหรับใช้ภายในองค์กร
- Cool: ราคาถูกที่สุด เหมาะสำหรับเก็บข้อมูลที่เกี่ยวกับการ Backup
หน้าตาเมื่อสร้าง File Share เสร็จแล้ว
3. เก็บ File Secret Key เพื่อใช้ใน ACI
ก่อนที่เราจะ Mount File Share ไปยัง ACI ได้นั้นเราต้องการข้อมูล 3 ส่วนนี้ก่อนนะครับ
- Storage account name เราสร้างไว้แล้ว ชื่อ
mysftppersists
- File share name เราสร้า้งไว้แล้วชื่อ
docker-volume
- Storage account access key เราสามารถดูได้จาก Portal ตามขั้นตอนนี้นะครับ
สร้าง ACI และ Mount Volume มายัง Azure File Share
Azure Cloud Shell
ACI ไม่สามารถสร้างผ่าน UI บน Azure Portal ได้นะครับ เพราะงั้นเราจะทำการติดตั้งผ่าน Azure Cloud Shell ซึ่งทำให้เราสร้าง Resources บน Azure ได้ผ่าน CLI บน Web Browser เลยครับ โดยให้เราทำการจิ้มปุ่มข้างล่างนี้บน Azure Portal และเลือก Bash สำหรับ Shell ของเรา
ถ้าเรายังไม่เคยใช้งาน Azure Cloud Shell เราจะต้องสร้าง Azure File Share บน Storage Account ก่อนนะครับ ซึ่งมีค่าใช้จ่ายนิดหน่อยครับ
หรือถ้าท่านใดไม่อยากใช้งาน Azure Cloud Shell ก็ให้เราติดตั้ง Azure CLI บนเครื่อง Windows, Mac, Linux แทนได้เลยครับผม
สร้าง ACI ด้วย atmoz/sftp mage และ Mount File Share
เราจะทำการสร้าง Container บน ACI ผ่านคำสั่ง az container create
นะครับ เรามาลองดูตัวอย่างข้างล่างกัน
az container create \
--resource-group blog-aci \
--name my-sftp \
--location southeastasia \
--image atmoz/sftp:latest \
--ports 22 \
--dns-name-label blog-ponggun-sftp-aci \
--environment-variables \
SFTP_USERS=sftpUser:sftpPassword:1001 \
--azure-file-volume-account-name mysftppersists \
--azure-file-volume-account-key \
hDjGLkbphtz/03h+6M0NDV21M21vHNfuPDEQGrja \
--azure-file-volume-share-name docker-volume \
--azure-file-volume-mount-path /home/sftpUser/upload
คำอธิบาย
- ทำการสร้าง ACI ชื่อ
my-sftp
ภายใต้ Resource Groupblog-aci
บน RegionSoutheast Asia
ด้วย Docker Imageatmoz/sftp:latest
และ map ไปยัง port22
ซึ่งเป็น Port สำหรับ SFTP ใน Docker Image นั้น - ระบุ DNS ชื่อ
ponggun-sftp
เพื่อให้เข้าถึงได้จากภายนอก ในที่นี้เราจะใช้เพื่อเข้าถึง SFTP Server ผ่าน File Zilla - ระบุ
environment variables
เพื่อสร้าง UsersftpUser
ที่มี PasswordsftpPassword
- ระบุ
storage account name
,storage account key
,file share name
เพื่อ Bind Azure File Share มายัง Docker Volume และเลือก Bind ไปยัง Docker Volume Path/home/sftpUser/upload
เราสามารถดู List ของ Regions ทั้งหมดได้ด้วย Azure Cli นี้คำสั่งนะครับ
az account list-locations -o table
ลองเข้าไปดูที่ Azure Container instances กันครับ จะพบว่า ACI ของเราได้ถูกสร้างเรียบร้อยแล้ว
Overview
ในส่วนรายละเอียดเบื้องต้นนั้น เราจะพบว่า เราสามารถเข้าถึง ACI ได้ผ่าน FQDN เช่นในตัวอย่างนี้คือ blog-ponggun-sftp-aci.southeastasia.azurecontainer.io
ACI อยู่ภายใต้ group ชื่อ blog-aci
, location Southeast Asia
, OS type Linux
Containers -> Events
เราจะพบว่าเราได้ใช้ image ชื่อ atmoz/sftp:latest
และมี Log บอกเราว่ามีการสร้าง, pull image เมื่อไหร่
Containers -> Properrties
ในส่วนนี้เราจะเห็นรายละเอียดของ Server ที่เราสร้างขึ้นมา ในตัวอย่างนี้มี CPU 1 cores
, Memory 1.5 GiB
, Port 22
, Environment Variable SFTP_USERS
, Volume /home/sftpUser/upload
ที่ Mount ไปยัง Azure File Share
Containers -> Logs
เราสามารถตรวจสอบ Docker Log ได้ว่ามีการทำงานยังไงบ้างในตอนที่สั่งสร้าง Container
Containers -> Connect
เราสามารถ Remote เข้าไปจัดการกับภายในของ Container ของเราได้ที่เมนูนี้นะครับ สามารถใช้ได้ทั้ง bash, sh
ทดลองเชื่อมต่อด้วย File Zilla
แก้ไข Connection ที่ทำไว้ก่อนหน้านี้เฉพาะ Host โดยนำ FQDN เช่นในตัวอย่างนี้คือ blog-ponggun-sftp-aci.southeastasia.azurecontainer.io
มาวางแทน localhost
เมื่อลองเชื่อมต่อแล้วจะพบว่าสามารถเข้าไป upload files ได้ และพบว่า files ที่ upload แล้วก็ไปอยู่ใน Azure File Share เรียบร้อย
Azure Resource Manager templates (ARM templates) คืออะไร
ARM templates คือ JSON files ที่รวมคำสั่งในการสร้าง Infrastructure และ Configuration ในแต่ละ Project ของเรา เราสามารถใช้ Azure Portal ช่วยสร้าง ARM templates จาก Services ที่เราได้สร้างไว้แล้วอย่างสะดวกมากๆเลยครับ
ใครในสนเพิ่มเติม สามารถดูตัวอย่างการ Demo ได้ที่นี้นะครับ ในบทความนี้จะไม่ลงลึกการสร้าง ARM template แต่จะเป็นการนำ Template ที่มีอยู่แล้วมาใช้นะครับ ^^
ข้อดี
- ช่วยให้เราจัดการ Infrastructure ได้ในรูปแบบของ Code
(Infrastructure as code — IaC)
- เมื่ออยู่ในรูปแบบ Code ทำให้เราสามารถที่จะใช้ Git ในการทำ Source Code Control
- Automatic deployment ด้วย Code ที่มี ทำให้มั่นใจว่าจะได้ ระบบใหม่ที่มี Infrastructure และ Code ที่เหมือนเดิมเสมอ
ตัวอย่าง ARM templates (เยอะมว้ากกก)
ลดเวลาการติดตั้ง SFTP บน ACI ด้วย ARM templates
ในบทความนี้เราจะใช้ ARM template ตามบทความข้างล่างนี้นะครับ
ให้เราทำการกดที่ปุ่ม Deploy to Azure เพื่อนำ Template ไปติดตั้งบน Azure Portal ของเราครับผม ซึ่งจะมีรายละเอียดดังภาพข้างล่างนี้นะครับ
โครงสร้างของ ARM templates
เราสามารถดูรายละเอียดของ Template ได้ด้วยการกด Edit Template ดังนี้นะครับ
เมื่อกดแล้วเราจะเห็นโครงสร้างของ Template ดังนี้นะครับ (ผมขอยกตัวอย่างเฉพาะที่สำคัญๆนะครับ)
- parameters: เป็น Input ที่ให้เราสามารถเลือกกรอกได้ตอนที่จะสั่ง Apply Template ครับ ซึ่งมีหลาย Type ให้เลือก เช่นให้กรอกแบบ Free Text หรือ Dropdown
- variables: เป็นการประกาศตัวแปรเพื่อใช้ภายใน Template ครับ ซึ่งเป้นได้ทั้งค่าคงที่, input จาก parameters หรือ ค่าจาก built-in function ของ template เอง
- resources: เป็นการสั่งสร้าง Azure Resource ครับ เช่นในภาพข้างล่างนี้เราจะทำการสร้าง Storage Account ด้วย parameter และ variable ที่เรากำหนดไว้
การทำงานของ ARM template นี้
#1: รับ Input Parameters ดังนี้
Region
- Region: เลือก
Southeast Asia
เหมือนตัวอย่างที่ผ่านมา
File Share
- Storage Account Type: เลือกชนิดเพื่อสร้าง Storage Account ที่จะเอาไว้สร้าง File Share ต่ตออีกทีนึงครับ ให้เลือก
Standard_LRS
เหมือนที่เราทำไปก่อนหน้านี้ - Storage Account Prerfix: เอาไว้ช่วยเติม Prefix ของ Storage Account ที่เรากำลังจะสร้าง
- File Share Name: ชื่อ File Share ที่จะถูกสร้างภายใน Storage Account ที่เราระบุไว้ก่อนหน้านี้
Docker Container Environments
- Sftp User: ระบุชื่อ User ที่เราจะใช้เพื่อ Login เข้า SFTP
- Sftp Password: ระบุ Password
#2: สร้างตัวแปรเพื่อช่วยในการทำงานใน Template
ตัวอย่างเช่น ตัวแปร sftpContainerImage = atmoz/sftp:debian
เพื่อระบุ Docker Image สำหรับการติดตั้ง SFTP Server
#3: สร้าง Storage Account ด้วยข้อมูลจาก Input Parameter และ Variable
#4: สร้าง File Share บน Storage Account จากข้อ #3
#5: สร้าง ACI ด้วย Docker Image atmoz/sftp:debian
และ Mount Docker Volume มายัง File Share ในข้อ #4
Apply The Template
เมื่อเราเข้าใจการทำงานของ Template แล้วให้เรากดปุ่ม Discard เพื่อกลับมาที่หน้า Input Parameter, กรอกรายละเอียด, review และกด create นะครับ
เมื่อเราลองเข้าไปดู Resource Group ที่พึ่งสร้างขึ้น เราจะพบกับ Storage Account และ ACI ของเรานะครับ
เมื่อกดเข้าไปดู Storage account เราจะพบกับ Azure File Share ครับ
เมื่อกดเข้าไปดู ACI จะพบโครงสร้างคล้ายๆกับที่เราสร้างเองตามวิธีก่อนหน้านี้ครับ
บริการ File Sharing อื่นๆบน Azure
ด้วย Requirements ที่ทางลูกค้าของผมต้องการให้ใช้ SFTP เป็น File Server ทำให้ผมต้องใช้ ACI + Azure File Share เข้ามาช่วยในเรื่องนี้นะครับ
แต่ถ้าแนะนำได้ ผมอยากให้พิจารณาการใช้ Azure Blob Storage (คล้ายๆ Amazon S3) ซึ่งเป็นบริการจัดเก็บ Unstructured Data ตัวอย่างเช่น Text / PDF / Document / Image / Video File ในการจัดการ File Server มากกว่าครับ
เพราะว่าเป็นมาตราฐานที่ใช้เก็บ Files บน Azure ครับ มีทั้ง Tools ที่ช่วยให้เรา Upload/Download Files ได้สะดวกและทันสมัย รวมไปถึงยังมี SDK ที่ช่วยให้เราสามารถเขียนโปรแกรมเพื่อจัดการกับ Files บน Server ได้สะดวกมากๆครับ ประหยัดได้มากกว่าเพราะไม่ต้องเสียค่า Compute (CPU, Memory) ด้วยครับ จ่ายเฉพาะในส่วนของ Network และ Disk Space
ความเทพคือทำ Video Streaming ได้ด้วยน่ะครับเพื่อตอบโจทย์การทำงานแบบ Video-On-Demand Solution
ศึกษาเพิ่มเติม
สรุป
ในบทความนี้เราจะได้เรียนรู้ว่า ACI คืออะไร และช่วยให้การ Deploy Docker Image ที่เรามีได้อย่างรวดเร็วได้ยังไง
โดยเพิ่มขั้นตอนการใช้งานร่วมกับ Azure File Share, Azure Cloud Shell ยังไง โดยนำตัวอย่างการสร้าง SFTP ด้วย Docker Image และแนะนำ ARM templates เพื่อประหยัดเวลาในการ Deploy ระบบในครั้งถัดๆไปครับ
ผมแนะนำว่าเราควรใช ้ACI สำหรับระบบที่สามารถจะเปิดปิดการทำงานได้ในระยะเวลาที่กำหนดนะครับ เช่น การทำ Job Schedule เพื่อรันงานตามช่วงเวลา เหตุผลเพราะว่าจะสามารถประหยัดค่าใช้จ่ายได้มากครับ แต่ถ้าเลือกปิดทิ้งไว้ทั้งเดือนเลยผมมองว่า Azure App Service Plan จะตอบโจทย์มากกว่าครับ เพราะมีความยืดหยุ่นในเรื่องของราคาที่สูงกว่า ทำ Auto Scaling ง่ายด้วย
ส่วน SFTP นั้นเป็นทางเลือกสำหรับลูกค้าอีกทางนึงนะครับ แต่ถ้าเลือกได้ก็อยากให้ใช้ Azure Blob Storage จะดีกว่าเพราะมีค่าใช้จ่ายที่ถูกกว่า ไม่ต้องเสียค่า Compute (CPU, Memory) ด้วยครับ จ่ายเฉพาะในส่วนของ Network และ Disk Space และยังมี Tools ที่ช่วยจัดการ Files และ SDK ที่ช่วยให้เราเขียนโปรแกรมได้สะดวกมว้ากกก
ผมขอจบบทความนี้ไว้เพียงเท่านี้นะครับ หวังว่าจะเป็นประโยชน์กับผู้อ่านทุกท่านถ้าจำเป็นต้องสร้าง SFTP Server น้าาาา ^^
นายป้องกัน