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 用のアクセスポイントを作成済みと仮定します。
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
) を入力します。
{
"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
を信頼関係として設定しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Transfer Family サーバーの作成
Transfer Family コンソールからサーバーを作成します。
今回は Transfer Family 内でユーザーを作成及び管理するので、[ID プロバイダー] は [サービスマネージド] を選択します。
[プロトコル] は [SFTP] を選択します。
[エンドポイント] は [パブリックアクセス可能] を選択します。
[ドメイン] は今回のアクセス先である [Amazon EFS] を選択します。
他の設定はデフォルトのままでいきます。
作成するとサーバー一覧で確認できます。
作成には時間がかかるので、状態がオンラインになるまで待ちましょう。
ユーザーの追加
[サーバー一覧] からサーバーを選択し、サーバーの詳細から [ユーザー追加] を行います。
なお、サーバーの詳細にあるエンドポイントは SFTP クライアントで使うため、メモしておきましょう。
[ロール] には先ほど作成した IAM ロールを選択します。
[ホームディレクトリ] には Lambda 用に作成したアクセスポイントのルートディレクトリパスと同じにします。
[SSH パブリックキー] に任意の SSH パブリックキーを入力します。
SSH キーの作成方法がわからない場合は、こちらの AWS ドキュメントを参考にして下さい。
SFTP クライアントを使って EFS へアクセス
SFTP クライアントから実際に EFS にアクセスしてみましょう。
Cyberduck の場合
[SFTP (SSH による暗号化 FTP)] を選択します。
[サーバー] には、Transfer Family サーバーのエンドポイント (例: s-xxxxxxxxxxxxxx
) を入力します。
[ユーザ名] には、作成したユーザー名 (例: sample
) を入力します。
[SSH Private Key] には、作成した SSH キーのプライベートキーを選択します。
FileZilla の場合
[プロトコル] には、[SFTP - SSH File Transfer Protocol] を選択します。
[ホスト] には、Transfer Family サーバーのエンドポイント (例: s-xxxxxxxxxxxxxx
) を入力します。
[ユーザー] には、作成したユーザー名 (例: sample
) を入力します。
[鍵ファイル] には、作成した SSH キーのプライベートキーを選択します。
EC2 を使わずにホームディレクトリの作成からパーミッションや所有者、所有者グループを変更する方法
ホームディレクトリが作成されていない場合、SFTP クライアントを使って EFS へアクセスした際にエラーが発生します。
本記事ではアクセスポイント作成時に [ルートディレクトリ作成のアクセス許可] の設定により自動で作成されるの問題ありませんが、アクセスポイントを使用しない、名前通りユーザー毎にホームディレクトリを用意したいなどの場合もあるかと思います。
その場合は、EC2 を使わず SFTP で作成することもできます。
まず、ルートユーザーを作成します。
作成方法はユーザー追加時に [ユーザー ID] と [グループ ID] の両方に 0
( ゼロ ) を入力します。
FileZilla や Cyberduck はディレクトリは作成できても、ディレクトリの所有者や所有者グループの変更はできません。
一方で、以下の Transfer Family のドキュメントに記載されている通り、EFS では mkdir
や chown
、chgrp
、chmod
などのコマンドが使えます。
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
) を入力します。
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
個人開発したサービス