Transfer Family を使って EFS に SFTP クライアントからアクセスする

Transfer Family を使って EFS に SFTP クライアントからアクセスする

例えば、Lambda しか使わない EFS に必要なリソースを格納する際に、一々 EC2 を立ててマウントしたりするのはめんどくさいです。
Transfer Family を使えば、よくある SFTP クライアント (WinSCP や FileZilla、Cyberduck など)を使って、GUI で手軽に EFS ファイルシステム内にファイル転送などができます。

Transfer Family を使って EFS に SFTP クライアントからアクセスする際の前提

EFS を作成済みとします。
EFS の作成に関しては以下の記事をご参照ください。

また、仮背景として EFS は Lambda で利用するため、以下のような Lambda 用のアクセスポイントを作成済みと仮定します。

アクセスポイント作成 1

アクセスポイント作成 2

Transfer Family を使って EFS に SFTP クライアントからアクセスする手順

Transfer Family 用の IAM ポリシーの作成

Transfer Family のドキュメントを参考に、読み取りと書き込みアクセスポリシーを作成します。
region-id には、EFS ファイルシステムを作成したリージョン (例: ap-northeast-1) を入力します。
account-id には、EFS ファイルシステムの AWS アカウント ID を入力します。
file-system-id には、EFS ファイルシステムのファイルシステム ID (例: fs-xxxxxx) を入力します。

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

Transfer Family 用の IAM ロールの作成

先ほど作成した IAM ポリシーを適用した IAM ロールを作成します。

また、transfer.amazonaws.com を信頼関係として設定しておきます。

Copied!
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Transfer Family サーバーの作成

Transfer Family コンソールからサーバーを作成します。

今回は Transfer Family 内でユーザーを作成及び管理するので、[ID プロバイダー] は [サービスマネージド] を選択します。
Transfer Family 作成 1

[プロトコル] は [SFTP] を選択します。
Transfer Family 作成 2

[エンドポイント] は [パブリックアクセス可能] を選択します。
Transfer Family 作成 3

[ドメイン] は今回のアクセス先である [Amazon EFS] を選択します。
Transfer Family 作成 4

他の設定はデフォルトのままでいきます。
Transfer Family 作成 5

作成するとサーバー一覧で確認できます。
作成には時間がかかるので、状態がオンラインになるまで待ちましょう。
サーバー一覧

ユーザーの追加

[サーバー一覧] からサーバーを選択し、サーバーの詳細から [ユーザー追加] を行います。
なお、サーバーの詳細にあるエンドポイントは SFTP クライアントで使うため、メモしておきましょう。

サーバー詳細

[ロール] には先ほど作成した IAM ロールを選択します。
[ホームディレクトリ] には Lambda 用に作成したアクセスポイントのルートディレクトリパスと同じにします。

ユーザー追加 1

[SSH パブリックキー] に任意の SSH パブリックキーを入力します。
SSH キーの作成方法がわからない場合は、こちらの AWS ドキュメントを参考にして下さい。

ユーザー追加 2

SFTP クライアントを使って EFS へアクセス

SFTP クライアントから実際に EFS にアクセスしてみましょう。

Cyberduck の場合

[SFTP (SSH による暗号化 FTP)] を選択します。
[サーバー] には、Transfer Family サーバーのエンドポイント (例: s-xxxxxxxxxxxxxx) を入力します。
[ユーザ名] には、作成したユーザー名 (例: sample) を入力します。
[SSH Private Key] には、作成した SSH キーのプライベートキーを選択します。

cyberduck

FileZilla の場合

[プロトコル] には、[SFTP - SSH File Transfer Protocol] を選択します。
[ホスト] には、Transfer Family サーバーのエンドポイント (例: s-xxxxxxxxxxxxxx) を入力します。
[ユーザー] には、作成したユーザー名 (例: sample) を入力します。
[鍵ファイル] には、作成した SSH キーのプライベートキーを選択します。

filezilla

EC2 を使わずにホームディレクトリの作成からパーミッションや所有者、所有者グループを変更する方法

ホームディレクトリが作成されていない場合、SFTP クライアントを使って EFS へアクセスした際にエラーが発生します。
本記事ではアクセスポイント作成時に [ルートディレクトリ作成のアクセス許可] の設定により自動で作成されるの問題ありませんが、アクセスポイントを使用しない、名前通りユーザー毎にホームディレクトリを用意したいなどの場合もあるかと思います。
その場合は、EC2 を使わず SFTP で作成することもできます。

まず、ルートユーザーを作成します。
作成方法はユーザー追加時に [ユーザー ID] と [グループ ID] の両方に 0 ( ゼロ ) を入力します。

FileZilla や Cyberduck はディレクトリは作成できても、ディレクトリの所有者や所有者グループの変更はできません。
一方で、以下の Transfer Family のドキュメントに記載されている通り、EFS では mkdirchownchgrpchmod などのコマンドが使えます。
Amazon EFS ファイルシステムを作成します。 - AWS Transfer Family

以下のコマンドが Amazon EFS でサポートされています。AWS Transfer Family。
・cd
・ls/dir
・pwd
・put
・get
・rename
・chown: root (つまり uid=0 のユーザー) だけがファイルとディレクトリの所有権と権限を変更できます。
・chmod: ファイルとディレクトリの所有権と権限を変更できるのは root だけです。
・chgrp: ルートまたはファイルの所有者がファイルのグループをセカンダリグループの 1 つに変更することしかできないファイルの所有者に対してサポートされています。
・ln -s/symlink
・mkdir
・rm/delete
・rmdir
・chmtime

そのため、sftp コマンドで Transfer Family サーバー経由で EFS にアクセスして、ディレクトリの作成からパーミッションや所有者、所有者グループの変更を行います。
実際に sftp コマンドで Transfer Family サーバー経由で EFS にアクセスして sample ディレクトリを作成してみます。
[ssh_private_key] には、作成した SSH キーのプライベートキーのパス (例: ~/.ssh/transfer_key) を入力します。
[user_name] には、作成したルートユーザーのユーザー名 (例: sample) を入力します。
[endpoint] には、Transfer Family サーバーのエンドポイント (例: s-xxxxxxxxxxxxxx) を入力します。

Copied!
sftp -i ssh_private_key user_name@endpoint
sftp> ls -la
drwxr-xr-x   2       1001     1001     6144 Apr 11 15:23 lambda
sftp> mkdir sample
sftp> chmod 755 sample
sftp> chown 1001 sample
sftp> chgrp 1001 sample
sftp> ls -la
drwxr-xr-x   2       1001     1001     6144 Apr 11 15:23 lambda
drwxr-xr-x   2       1001     1001     6144 Apr 12 00:21 sample