[アップデート] AWS Transfer Family の対象ストレージに Amazon EFS が追加サポートされました

もう Transfer Family は S3 だけのものじゃない!
2021.01.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日のアップデートで AWS Transfer Family から EFS への接続が可能となりました。

AWS Transfer Family for EFS

従来、AWS Transfer Family は S3 を対象とした FTP/FTPS/SFTP が可能でしたが、今回のアップデートで EFS への FTP アクセスが可能となりました。

EFS へのアクセスは FTP/FTPS/SFTP 3 つのプロトコルで利用可能です。

パブリックからの EFS アクセス

EFS は VPC を経由して NFS マウントする共有ファイルシステムのマネージドサービスです。VPC 内の EC2 からは勿論のこと、Direct Connect や VPN を利用することでオンプレ環境からマウントすることが出来ます。

一方でパブリックな環境から EFS へ直接アクセスすることは出来ませんでしたが、AWS Transfer Family を介することでパブリックな環境からも EFS 内のファイルへのアクセスが可能になります。

また従来であれば EFS をマウントするサーバー側で FTP を実装するなどの対応が必要でしたが、FTP サーバーとしての運用・管理をマネージドサービスの AWS Transfer Family 側に任せることが出来ますね!

Windows 環境からも

EFS では Windows 環境からのマウントがサポートされていませんので、これまで Windows 環境から EFS に直接アクセスすることは出来ませんでした。

AWS Transfer Family を介することで Windows サーバーから FTP で EFS 内のファイルにアクセスが可能になります。

前提条件

  • Transfer Family サーバーと EFS は同一リージョンにある必要があります
  • EFS 側の IAM ポリシーで、Transfer Family で使用している IAM ロールへのアクセスを有効にする必要があります
  • 2021年1月6日以前に作成されたパブリックアクセスを許可するポリシーを持つ EFS ファイルシステムの場合、デフォルトでは Transfer Family を使用することが出来ません
    • AWS サポートに連絡し Transfer Family を使用してファイルシステムアクセスを有効にする必要があります
  • Transfer Family が別アカウントによって所有されている場合、クロスアカウントの設定が必要です

やってみる

事前準備

  • 今回は東京リージョンで検証しています
  • 東京リージョンに EFS を 1 つ用意しておきます
    • マウントターゲットのみを作成しています
    • ファイルシステムポリシーやアクセスポイントは設定していない状態です

AWS Transfer for SFTP

AWS Transfer Family の管理コンソールから [Create Server] をクリック。次にプロトコルの選択をします。今回は SFTP を利用します。(プロトコルごとにエンドポイント料金が発生しますので、必要最低限のみにしておきましょう)

ID プロバイダは Service managed を選択して次へ。

エンドポイントタイプはせっかくなので Publicly accessible で検証してみます。

ドメイン の選択画面で Amazon EFS が追加されていますので選択します。以降は一旦デフォルトのまま進み Create server を実行します。

SFTP ユーザーの追加

作成したエンドポイントの設定を開き、Add user をクリックします。ユーザー名、POSIX ユーザー ID/グループ ID、アクセス先の EFS およびホームディレクトリなどを設定します。区別しづらいネーミングにしてしまったのですが最初の transfer は EFS ファイルシステム名の指定で、その下の transfer はホームディレクトリとなる efs/transfer を指定しています。

ユーザーに割当てる IAM ロールは信頼ポリシーに transfer.amazonaws.com を設定し、リソースポリシーは以下のように設定しています。

Transfer Family の IAM ポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RootFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:<region>:<account-id>:file-system/<file-system-id>"
        }
    ]
}

SSH 公開鍵を設定し Add します。

EFS の追加設定

Transfer Family ユーザーのディレクトリのアクセス許可

次に EFS 側で Transfer Family からのアクセスを許可する設定を行います。

Transfer family で登録したユーザーに割り当てた POSIX ユーザーID またはグループ ID を使用して、ディレクトリへのアクセス許可を付与します。EFS をマウントしている EC2 にログインし、以下のように設定しました。グループ ID 9999 は先程作成した SFTP ユーザに設定した POSIX グループ ID です。

$ ls -l efs
合計 4
drwxr-xr-x 2 root root 6144  1月  6 23:34 transfer
$ sudo chown :9999 efs/transfer/
$ sudo chmod g+w transfer/
$ ls -l efs
合計 4
drwxrwxr-x 2 root 9999 6144  1月  6 23:34 transfer

Transfer Family で使用される IAM ロールからの EFS アクセス許可

EFS のファイルシステムポリシーで Transfer Family に設定した IAM ロールからのアクセスを許可します。今回は Grant-transfer-role-access の部分で同一アカウントの Transfer Family 用 IAM ロールからのアクセスを許可しています。

またデフォルト状態の EFS ファイルシステムポリシー(空の状態)は暗黙的にマウントターゲットを経由してファイルシステムに接続できるすべてのクライアントへのフルアクセスを許可しています。よって Grant-transfer-role-access のポリシーのみを記述すると既存の NFS マウントが暗黙的に拒否されることになりますので要注意です。

現状がデフォルトの場合は NFS-client-read-write-via-fsmt のようにマウントターゲットを経由したアクセスを許可する設定をあわせて記述する必要があります。(私はココでしばらくハマりました。。)

ファイルシステムポリシーの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Grant-transfer-role-access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account_id>:role/transfer-efs"
            },
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientMount"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-northeast-1:<account_id>:file-system/<file-system-id>"
        },
        {
            "Sid": "NFS-client-read-write-via-fsmt",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientMount"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-northeast-1:<account_id>:file-system/<file-system-id>",
            "Condition": {
                "Bool": {
                    "elasticfilesystem:AccessedViaMountTarget": "true"
                }
            }
        }
    ]
}

接続確認

設定がすべて完了しましたので、接続確認してみましょう。事前に EC2 から EFS 内に以下のファイルを作成しておきました。

$ sudo cat /mnt/efs/transfer/test
Hello! Classmethod!

FTP クライアントツールから接続してみると EFS 内のファイルが表示されています。

問題なくダウンロードできますね!

アップロードも問題ありませんね!

$ ls -l efs/transfer/
合計 8
-rw-r--r-- 1 root 9999 20  1月  6 23:34 test
-rw-rw-rw- 1 9999 9999 20  1月  7 02:15 test2

セキュリティグループ設定は必要か?

EFS のマウントターゲットにはセキュリティグループをアタッチして利用されていると思いますが、Transfer family からのアクセスはセキュリティグループを考慮する必要があるのでしょうか?

結論だけ申し上げると、試しに EFS にアタッチしているセキュリティグループのルールをすべて削除してみましたが Transfer family から問題なく接続することが可能でした。

よって Transfer Family からの接続にセキュリティグループ設定は影響しません。

検証は以上です。

さいごに

AWS Transfer Family は S3 専用の FTP サービスだと思っていましたが、まさか EFS に直接アクセスできるようになるとは思いませんでした。

パブリック環境や Windows サーバなど、これまで EFS に直接アクセスすることが出来なかった環境からファイルを連携することが可能となりましたので、アーキテクチャの幅がまたまた広がるアップデートになりそうです。

なにより FTP サーバーとしての可用性・スケールなどの管理が不要になる点が AWS Transfer Family の強みですね!

以上!大阪オフィスの丸毛(@marumo1981)でした!

参考