NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

Azure Blob Storage が SFTP サポートしたので触ってみた

こんにちわ。社長室の安部です。
この記事は NEXTSCAPE Advent Calendar 2021 6日目 です。
qiita.com

最近 Azure Blob が SFTP をサポートしたと聞いたので、ちょっと触ってみました。
実際に触ってみて気になったところや所感などを書いています。
本機能は現時点ではプレビュー段階であるため、あくまで執筆時点の内容になります。

  • 目次
    • 概要や使い方について
    • Azure Blob SFTP を作成する上で注意する点
    • FTPクライアントで Blob 操作してみた印象
    • Blob の機能と組み合わせた SFTP 運用を考える

概要や使い方について

Azure Blob SFTP の概要や使い方については MS ドキュメントに記載されています。
制限事項や既知の問題もドキュメント化されているので、詳しく知りたい場合は下記ドキュメントをご確認ください。
おおよその概要を知るにはこれらのドキュメントを軽く読む程度で十分かと思います。

Azure Blob Storage でのセキュア ファイル転送プロトコル (SFTP) サポート (プレビュー) | Microsoft Docs

SFTP プロトコル (プレビュー) を使用して Azure Blob Storage に接続する | Microsoft Docs

Azure Blob Storage での SFTP (プレビュー) に関する既知の問題 | Microsoft Docs

Azure Blob SFTP を作成する上で注意する点

前述の MS ドキュメントをあらかじめ理解しておけば基本的に躓くことはないです。
そうなると本記事に書くことが無くなってしまうのですが、「よく読まずにまず触ってみる人」(=自分)は以下の点だけ押さえればひとまず触れるようになると思います。

  • プレビュー機能の有効化
  • 対応しているリージョンを選択する
  • Data Lake Storage(階層型名前空間)を有効にする
  • SKU は LRS or ZRS にする
  • ホームディレクトリとコンテナ名を一致させる

プレビュー機能の有効化

現時点では Azure Blob の SFTP 機能は既定のままだと使用できません。
サブスクリプションのプレビュー機能から当機能を有効化する操作が必要です。
手順は MS ドキュメントに画面付きの説明がありますのでそちらをご参照ください。
Az CLI でも有効化することは可能です。

$ az feature register -n AllowSFTP --namespace Microsoft.Storage

備考:プレビュー機能利用のためのフォームについて

当プレビュー機能の利用するにあたり フォーム からアンケートに回答するよう記載されていますが、現時点では上記のプレビュー機能有効化操作のみで利用できました。(有効化されるまで数分かかりましたが)
利用するシナリオや、性能要件など具体的なイメージをお持ちな方は良かったら回答しておくと今後の改善に反映されるかもです。

対応しているリージョンを選択する

現時点では日本リージョンはサポートされていません。
この中からリージョンを選択しましょう。

Data Lake Storage(階層型名前空間)を有効にする

Blob SFTP は Data Lake Storage に付属する機能という位置づけになるそうです。
Azure Portal で作成するとき階層型名前空間を有効にしないと Blob SFTP の選択欄が有効にならないので、おのずと分かるとは思います。

f:id:ns_jabe:20211205152438p:plain
階層型名前空間を有効にするとSFTP機能を有効に出来る

SKU は LRS or ZRS にする

既知の問題 にも明記されていますが、geo 冗長系の SKU はサポートされていません。
非サポートの SKU を選択して Storage Account を作成しようとすると検証時にエラーになります。
エラーメッセージが分かりにくいのでこのエラーに遭遇した場合は SKU を見直してみてください。

{
    "code": "InvalidRequestPropertyValue",
    "target": "{ストレージアカウント名}",
    "message": "値 'True' はプロパティ isSftpEnabled には指定できません。"
}

ホームディレクトリにはコンテナ名を設定する

Blob SFTP が有効化された Storage Account を作成したら SFTP ローカルユーザを作成します。
作成するローカルユーザにコンテナへのアクセス権限設定とホームディレクトリを設定するところがあり、このホームディレクトリの設定次第で SFTP クライアントからの接続のしかたが少し変わるので躓きやすい点です。

Blob SFTP におけるホームディレクトリは Blob のコンテナに相当するみたいなので、ホームディレクトリにはコンテナ名を設定しておけば良さそうです。

f:id:ns_jabe:20211205151759p:plain
ホームディレクトリとコンテナ名を一致させる

ホームディレクトリ未設定の場合は SFTP クライアントから接続時にディレクトリ指定が必要になります。
接続したいディレクトリ名(コンテナ名)を下記のように指定します。

sftp {ストレージアカウント名}.{コンテナ名}.{ローカルユーザ名}@{ストレージアカウント名}.blob.core.windows.net

SFTP 接続時に Home Directory is not accessible. というエラーが返ってきた場合は、ホームディレクトリ周辺の設定を見直しましょう。

FTPクライアントで Blob 操作してみた印象

WinSCP で操作してみましたが、SFTP 接続が出来てしまえば特に問題なくやり取りが出来ました。
ですが、Azure Storage Explorer(azcopy) と比較してみると性能面で少し差が感じるケースがありました。

大量アップロード時は Azure Storage Explorer(azcopy) のが早い

手操作で数ファイルをアップロードする分には特に問題なかったですが、軽量サイズのファイルを大量アップロードした際は結構(数分)時間がかかりました。一方で同作業を Azure Storage Explorer で行うと数秒で完了しました。
性能面の評価をきちんを試したわけではないですが、それなりの差を体感できてしまったので実際のユースケースで耐えられるかは事前に検証をした方が良いです。
どちらかというと FTP クライアント側のチューニングが必要というお話になります。パフォーマンスの改善方法は下記の MS ドキュメントにも記載されています。

SFTP アップロードと Azure Storage Explorer アップロードした Blob プロパティの比較

同じファイルを SFTP とAzure Storage Explorer アップロードしたファイルで何か違いがあるのか、Blob プロパティを比較してみました。 png 形式の画像ファイルでの比較結果です。creationTime,lastModified,etag は除外した上で下記の差分項目がありました。

項目 SFTP Azure Storage Explorer
contentMd5 null 9qvB/Uhpc/ITy/uq6WZ7FA==
contentType null image/png

contentMd5 はファイルの整合性を確かめる際に使用する場合があり、特に SFTP を使用したファイル連携時ではきちんとファイルを受け渡しが出来たかを MD5 ハッシュ値で比較したい場面があるのでこれが無いと地味に困りそうです。
contentType も null だとその Blob ファイルを参照するアプリが期待通りの挙動をしないことに繋がるので、地味に気になるところです。
致命的ではないものの、この辺りもいつか対応してもらえると嬉しいなと思います。

Blob の機能と組み合わせた SFTP 運用を考える

Blob SFTP を実際に使用する際は、単に SFTP サーバ代わりとして使うだけではなく Blob 特有の機能も合わせて活用するケースも考えていきたいです。
現時点ではプレビュー段階なのである程度機能的制限があるのは当然ですが、個人的に気になった範囲で Blob 特有の機能との活用を確認してみました。
結果的にいうと現時点で試した機能のほとんどが SFTP との併用が難しい状況でした。。。

  • ライフサイクル管理⇒😃使えた
  • 静的サイトを SFTP で操作する⇒😅現時点ではできなかった
  • geo レプリケーションを使用した冗長化構成⇒😅現時点ではできなかった
  • SFTP 経由でアップロードされたファイルの検知⇒😅現時点ではできなかった

ライフサイクル管理⇒😃使えた

FTP サーバにファイルをアップロード+放置しっぱなしにしておくとディスクが限界を迎えてしまうので、定期的にファイルを削除するようなライフサイクル管理の仕組みを考える必要があります。
FTP サーバ代わりに Blob を使用した時点でディスク容量を気にする必要は無くなりますが、ストレージコスト管理等の観点から Blob のライフサイクル管理は利用すべき機能の1つです。
試したところ SFTP 経由でアップロードしたファイルも通常の Blob と同じくライフサイクル管理で処理されました。

静的サイトを SFTP で操作する⇒😅現時点ではできなかった

コンテンツ制作者側の運用に合わせて Azure Blob の静的サイト内のコンテンツを普段使いの FTP クライアント経由で管理したい、というケースはあると思います。
これまでであれば Azure Storage Explorer の利用を案内するしかなかったところが今後は FTP クライアントで静的サイトが出来るようになったのかなと思いきや、現時点では出来ませんでした。
SFTP ローカルユーザへの権限設定で静的サイトのコンテナ($web コンテナ)を選択することが出来なかったためです。

  • $web コンテナにSFTPローカルユーザの権限を付与した際のエラーメッセージ
ローカル ユーザー 'localuser01' を更新できませんでした。エラー: 値 '$web' はプロパティ permissionScope.resourceName には指定できません。

診断ログコンテナ($log)などの特別なコンテナは Azure 側で管理されているコンテナというお話を聞いたことがあるので、今後もこのまま痒いところに手が届かない系のお話になるかもしれません。

geo レプリケーションを使用した冗長化構成⇒😅現時点ではできなかった

よくあるリージョン障害等でサーバがダウンした/サーバが壊れたときを想定したお話です。
SFTP はシステム間とのファイル連携で使われることが多いと思うので、ここが単一障害点になるのはリスクです。
一方で Blob には RA-GRS やオブジェクトレプリケーション機能を使ってリージョン間でのレプリケーションが簡単に構築できます。
レプリケーション機能とBlob SFTP 機能が併用出来ればと思ったのですが、既知の問題にもあるように gep 冗長の SKU が現時点サポートしていない関係で現時点では出来ませんでした。
今後の改善に期待です。

SFTP 経由でアップロードされたファイルの検知⇒😅現時点ではできなかった

SFTP でファイルがアップロードされたことを検知して通知したり、即時的に他システムと連動する仕掛けを自動化したい場面があると思います。
つまり Blob アップロードイベントをトリガーにして Fucntion Apps や Logic Apps と連動できるかを試してみたのですが、期待通りの動きは出来ませんでした。
EventGrid を使用して Blob.Create イベントでトリガーされる Logic Apps を用意してみたのですが、SFTP 経由でのファイルアップロードではトリガーされませんでした。
また、Storage 診断ログを見ても PutBlob 操作ログも記録されなかったので、現時点では SFTP 経由での Blob 操作イベントは Azure として認識できない模様です。これは意外でした。
Azure 正規の入り口(Azure Resource API)をすり抜けて直接サーバにファイルを配置しているようなイメージでしょうか。
ログに記録されないということはトレーサビリティ的にも担保できないことにもつながるので、セキュリティ的にも気になる挙動です。
イベント検知はともかく操作ログには残るように対応してほしいところです。

備考:イベント検知以外でのトリガーパターンの検討

現時点ではイベント検知は難しそうなので他の手段を思いつく範囲で書き出してみましたがどれもちょっと微妙な感じです。
基本的には EventGrid の対応に期待したいと思っているので今回は未検証です。
今後必要性が出てきた際には改めて確認してみたいと思います。

  • Function Apps の Blob トリガー
  • Logic Apps の FTP コネクタのトリガー
  • Log Analytics カスタムクエリアラート
  • Blob Count のメトリクスアラート

所感、まとめ

Azure 環境にとても簡単に SFTP サーバのようなものを立てられるようになり、また一つ VM を使う機会を回避出来ると思うとありがたいアップデートだと思います。(なぜ今になって Azure が FTP 対応し始めたのかがモヤっとしていますが)
これまでは AWS(S3 + Transfer Famlity)と比較して Azure Blob は FTP に対応してない印象が強かったですが、これからは Azure Blob も SFTP には対応してるっぽいですよって言えるようになります。
とは言え、まだプレビュー段階ということもあり Azure Blob 特有の機能に対応していないものが現状まだ多く今後どこまで改善されていくのか気になるところです。

ただ、今後 GA したとしても Azure Blob 特有の機能が使えなかったり Azure の認証基盤を活かせない等デメリットが残る可能性も考えられるため SFTP を使用せずこれまで通り API/SDK 経由でやり取りする形が望ましいことには変わりないです。
特別な理由が無い限りは引き続き Azure の機能を活用したアーキテクチャを第一に考えていきたいです。