【AWS Transfer Family】論理ディレクトリを使ったバケットエイリアス設定

Amazon Web Services,AWS Transfer Family

こんにちは。プラットフォーム技術部の松永です。

AWSには「Transfer Family」という、Amazon S3やAmazon Elastic File System(EFS)とのファイル転送を行うサービスがあります。このTransfer Familyは論理ディレクトリと呼ばれるサーバーディレクトリ構造を簡素化できる機能を持っており、S3バケットやEFSに対してエイリアスを設定できます。

例えば、利用ユーザーにS3やEFS上の複雑なディレクトリ構造の実体を意識させることなく、ユーザー毎に分かりやすい構造で必要なものだけを提供するといった使い方ができます。

この記事では、Transfer Familyの論理ディレクトリ機能を活用したエイリアスの設定方法とその活用例を紹介します。

AWS Transfer Familyとは

AWS Transfer Familyは、安全なファイル転送プロトコル(SFTP、FTPS、FTP、AS2)を使用して、AWS内外にファイルを転送するためのマネージドサービスです。

クラウド上にファイル転送サーバーが用意され、S3バケットやEFSと直接連携してデータを格納できるため、ストレージを意識せず、簡単にファイルを管理できます。このサービスでは、ファイル転送機能に加え、以下のような管理機能もサポートされています。

  • ユーザー認証(LDAPやカスタムIDプロバイダーの統合など)
  • データのセキュリティ管理(プロトコルごとの暗号化対応)
  • アクセス制御(仮想ディレクトリやパーミッションの設定など)
  • 論理ディレクトリ(ディレクトリ構造の簡素化

論理ディレクトリとは

論理ディレクトリはサーバーディレクトリ構造を簡素化する機能です。

Transfer FamilyでSFTP、FTP、FTPSプロトコルを利用する際に、ユーザーごとにカスタムのディレクトリ構造を設定できるようになります。

論理ディレクトリの主な用途は以下のとおりです。

  • ストレージのエイリアス(別名)設定
    論理ディレクトリはユーザーごとに設定でき、特定のストレージ(S3バケットまたはEFS)や、その配下のパスに対して任意の名前(エイリアス)を付与できます。ユーザーからは、このエイリアスでストレージが表示され、操作
    可能になります。
  • アクセス制限とセキュリティ
    論理ディレクトリを設定したユーザーのホームディレクトリ配下には、割り当てられたS3バケットやEFSのみが表示され、他のディレクトリにはアクセスできません。

例えば、あるユーザーには「Transfer/dir1」というS3バケットのパスに対して「Family」というエイリアスを設定すると、ユーザーにはホームディレクトリに「Family」という名前のストレージだけが表示されるようになり、他のS3バケットは表示されず、アクセスもできません。

論理ディレクトリの使用例

エイリアス設定によりできること

エイリアス設定を使うことでユーザーに対して、実際のストレージ名やパスを隠すようなことができます。また、S3バケット名は通常ユニークでなければなりませんが、エイリアス設定であれば、別のS3バケットに対して同じ名前を割り当ててアクセスさせるといった使い方もできます。

活用例

  • 冗長構成(DR)時
    リージョン間でレプリケーション設定をしている複数のS3バケットが存在する場合、エイリアスにより同じ名前でアクセスできるため、ユーザーはメインとサブのS3バケットの違いを意識せずにアクセスが可能です。
  • データ移行時
    データ移行の際、旧バケットにアクセスすると、新バケットを参照するようにエイリアスを設定することで、ユーザーがどのバケットにデータが格納されているかを意識せずに操作できます。

このようにエイリアス設定を使うことで、接続先となるホスト名の違いなどを除けば、利用者からは一貫したファイルシステムの操作が可能となり、DR構成や移行中のシステムでも柔軟に対応できます。

論理ディレクトリ の動作確認

今回はTransfer FamilyをSFTPサーバーとして利用し、ユーザーに対する論理ディレクトリ設定の有無で、SFTPサーバーにアクセスした際の動作の違いを確認します。

次の構成のようにS3バケットとSFTPユーザーをそれぞれ2つずつ用意し、片方のSFTPユーザーには論理ディレクトリを設定します。

見せたいS3バケットに対して、もう一方のバケット名をエイリアスとして設定してみます。

構成

S3バケット

  • ark-original
    ├ori1
    └ori2
  • ark-logical
    ├logi1
    └logi2

SFTPユーザー

  • original-user:論理ディレクトリ設定なし
  • logical-user:論理ディレクトリ設定あり。ark-logicalバケットに対し、エイリアス:ark-original を設定
構成

設定手順

前提

論理ディレクトリはマネジメントコンソールからだと設定できません。※2024年11月時点

今回は通常のSFTPユーザー作成から含めて、CloudShell上でAWS CLIを利用して作成していきます。また、以下リソースについての構築は済んでいるものとして、SFTPユーザー作成から手順を紹介します。

  • Transfer Family(SFTPサーバー)
  • S3バケット
  • CloudShellユーザー向けのIAM権限(SFTPユーザー作成権限)
  • SFTPユーザー用のIAMロール
  • キーペア ※今回はCloudShell上に用意

通常(論理ディレクトリ設定なし)SFTPユーザーの作成

以下のコマンド書式で通常のSFTPユーザーを作成します。

aws transfer create-user \
    --server-id <server-id> \
    --user-name <username> \
    --role <IAM-role-arn> \
    --ssh-public-key-body file://<public-key path>

作成に成功すると、UserNameとServerIdがJSON形式で返ってきます。

$ aws transfer create-user \
>     --region ap-northeast-1 \
>     --server-id s-xxxxxxxxxxxxxxxxxxx \
>     --user-name test-user \
>     --role arn:aws:iam::123456789012:role/original-user-role \
>     --ssh-public-key-body file://original-user-key.pub
{
    "UserName": "original-user",
    "ServerId": "s-xxxxxxxxxxxxxxxxxxx"
}

論理ディレクトリ設定ありSFTPユーザーの作成

論理ディレクトリ設定を行う場合は、CLIコマンドに以下のオプションを使います。

  • home-directory-type:「LOGICAL」を指定
  • home-directory-mappings:"Entry"に設定するエイリアスを、"Target"に設定対象となるバケット(もしくはバケットのパス)を指定

以下のコマンド書式で論理ディレクトリ設定ありのSFTPユーザーを作成します。

aws transfer create-user \
    --server-id <server-id> \
    --user-name <username> \
    --role <IAM-role-arn>  \
    --home-directory-type LOGICAL \
    --home-directory-mappings "[{\"Entry\":\"/<bucket-alias>\", \"Target\":\"/<target-bucket>\"}, \
                               {\"Entry\":\"/<bucket-alias>\", \"Target\":\"/<target-bucket>\"}]"
    --ssh-public-key-body file://<public-key path>
$ aws transfer create-user \
>     --region ap-northeast-1 \
>     --server-id s-xxxxxxxxxxxxxxxxxxx \
>     --user-name logical-user \
>     --role arn:aws:iam::123456789012:role/logical-user-role \
>     --home-directory-type LOGICAL \
>     --home-directory-mappings "[{\"Entry\":\"/ark-original\", \"Target\":\"/ark-logical\"}]" \
>     --ssh-public-key-body file://logical-user-key.pub
{
    "UserName": "logical-user",
    "ServerId": "s-xxxxxxxxxxxxxxxxxxx"
}

マネジメントコンソール上ではホームディレクトリが「制限付き」となり、詳細を表示すると論理ディレクトリの設定内容が記載されています。

ホームディレクトリが「制限付き」となる
ホームディレクトリの詳細

なお、論理ディレクトリは既存のSFTPユーザーに対して、設定することも可能です。この場合において、「aws transfer update-user」コマンドで、論理ディレクトリに関するオプションを指定します。

aws transfer update-user \
    --server-id <server-id> \
    --user-name <username> \
    --home-directory-type LOGICAL \
    --home-directory-mappings  "[{\"Entry\":\"/<bucket-alias>\", \"Target\":\"/<target-bucket>\"}, \
                               {\"Entry\":\"/<bucket-alias>\", \"Target\":\"/<target-bucket>\"}]"

動作確認

以下の動作について論理ディレクトリ設定あり、なしのSFTPユーザーで挙動を確認します。

  • ホームディレクトリの見え方
  • S3バケット「ark-original」へ移動した際の中身の見え方

original-user(論理ディレクトリ設定なし)での確認

ホームディレクトリ表示

$ sftp -i original-user-key original-user@xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx.
sftp> pwd
Remote working directory: /
sftp> 
sftp> ls -l
drwxr--r--   1        -        -        0 Jan  1  1970 ark-logical
drwxr--r--   1        -        -        0 Jan  1  1970 ark-original

「ark-original」ディレクトリの中身表示

sftp> cd ark-original
sftp> ls -l
drwxr--r--   1        -        -        0 Jan  1  1970 ori1
drwxr--r--   1        -        -        0 Jan  1  1970 ori2

ホームディレクトリ配下にはすべてのS3バケットが表示され、「ark-original」ディレクトリの中身も通常通り表示されています。

logical-user(論理ディレクトリ設定あり)での確認

ホームディレクトリ表示

$ sftp -i logical-user-key logical-user@xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx.
sftp> pwd
Remote working directory: /
sftp>
sftp> ls -l
drwxr--r--   1        -        -        0 Jan  1  1970 ark-original

「ark-original」ディレクトリの中身表示

sftp> cd ark-original
sftp> ls -l
drwxr--r--   1        -        -        0 Jan  1  1970 logi1
drwxr--r--   1        -        -        0 Jan  1  1970 logi2

ホームディレクトリ配下には、論理ディレクトリで設定したバケットのみが表示されています。

「ark-original」ディレクトリの中身は「ark-logical」バケットの内容が表示されており、表示名がエイリアスに置き換わっていることが確認できます。

注意点

論理ディレクトリ設定を行う際には以下の点に注意が必要です。

  • バケットごとの設定
    エイリアスを使用する場合、アクセスする各S3バケットに対して個別に論理ディレクトリ設定を行う必要があります。今回は一つのバケットに対してのみ設定しましたが、多くのバケットにアクセスする構成では設定に手間がかかる場合があります。
  • ユーザー単位の設定
    論理ディレクトリはユーザーごとに設定するため、複数ユーザーを管理する環境ではユーザーごとにエイリアスを設定する必要があります。
  • ホームディレクトリの制約
    論理ディレクトリを設定する場合、Transfer Familyのユーザー設定にある「ホームディレクトリ」(HomeDirectoryパラメータ)は指定できません。論理ディレクトリ設定時は、専用のパス構成を使用します。

まとめ

エイリアス設定によって、異なるS3バケットやディレクトリでも同一の論理ディレクトリ名でアクセスできるようになり、利用者はアクセス先の違いを意識することなく、一貫したファイルシステムに接続できるようになります。特にDR構成や移行フェーズでは、この機能によりユーザーが従来と同じ名称のディレクトリでアクセスできることで、運用への影響を最小限に抑えられます。

Transfer Familyへアクセスする際のコマンド(ユーザー名やホスト名)まで含めてアクセス先の違いを完全に隠すためには、複数のTransfer Familyを用意し、それぞれに同じユーザーを作成する必要があります。その上で、DNSを使って接続先を制御し、意図的にアクセス先を切り替えるなどの工夫が求められます。

AWS Transfer Familyの機能を使いこなすことで、柔軟なファイルアクセス管理が実現できるため、ぜひ活用してみてください。

  • Zabbix Enterprise Appliance
  • 低コスト・短納期で提供するまるごとおまかせZabbix