🧺

【AWS】Amazon S3にSFTPでアクセスしたい(Mountpoint for Amazon S3)

2023/09/18に公開

はじめに

S3バケットへのSFTP接続をする手段として、「AWS Transfer for SFTP」が用意されていますが、若干料金が高いです。なるべくコストを抑えつつ実現する方法を模索していたところ、「Mountpoint for Amazon S3」が使えそうだったので、検証してみます。

AWS Transfer for SFTP とは

SFTP、FTPS、FTP プロトコルを使用して、Amazon S3 および Amazon EFSに直接ファイル転送できます。AWSのマネージドサービスのため、サーバ管理は不要、可用性とパフォーマンスについても申し分ないでしょう。
コストが許すならこちらを使いたいところですが、個人的には安くない料金です。
https://aws.amazon.com/jp/aws-transfer-family/pricing/?nc=sn&loc=3
2023年9月時点の料金で月額を試算すると以下のようになります。
  0.30 USD × 24 時間 × 30 日 × 147 円 = 31,752 円
さらにデータ転送(アップロード、ダウンロードともに)GBあたり 0.04USD かかるため、実際にはもう少し料金上乗せになります。

Mountpoint for Amazon S3 とは

S3バケットをローカルファイルシステムとしてマウントするためのファイルクライアントです。オープンソースですが、awslabsが開発しているため安心感があります。自力でSFTPサーバを立て、S3バケットをマウントすることで、料金を節約できそうです。
今回はこれを使用させていただきます。
https://github.com/awslabs/mountpoint-s3

概要

今回検証する環境は以下の通りです。

  • EC2でSFTPサーバを準備します。
  • Mountpoint for Amazon S3をインストールし、S3バケットをマウントします。
  • クライアントからSFTPでアクセスし、ファイルがアップロードできることを確認します。

作ってみた

前提として以下のセットアップは済ませている状態とします。

  • AWSアカウントの作成、権限設定など
  • S3バケットの作成
  • VPCエンドポイント作成(VPC内からS3にアクセスできるようになっていること)
  • セキュリティグループ設定(クライアントからSSH接続可能になっていること)

EC2を起動

今回AMIは Amazon Linux 2023 、アーキテクチャは 64 ビット (Arm) を選択しました。
インスタンスタイプは t4g.small を選択しました。

IAM ロールの設定

EC2にS3を使用する権限を与えます。
EC2の「アクション」 > 「セキュリティ」 > 「IAMロールを変更」からIAMロールを変更します。
ここでは許可ポリシーに「AmazonS3FullAccess」を設定した、IAMロールを設定しました。

SFTPサーバの設定

ここからはEC2にログインして作業します。

SFTPユーザ作成

以下のコマンドでSFTP接続用ユーザを作成します。

sudo useradd sftpuser
sudo passwd sftpuser

SFTP接続設定

以下のコマンドでsshd_configを編集します。

sudo vi /etc/ssh/sshd_config

ファイルの一番下に以下の記述を追加し、パスワード認証を許可する設定を行います。

Match User sftpuser
  PasswordAuthentication yes

sshdを再起動します。

sudo systemctl restart sshd

Mountpoint for Amazon S3をインストール

GithubのGetting startedを参考にインストールします。
https://github.com/awslabs/mountpoint-s3
今回はarm64を選択したため、コマンドもarm64を使用します。

wget https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.rpm
sudo yum install -y ./mount-s3.rpm

S3バケットをマウントする

ここからはSFTPユーザでログインして作業します。
ユーザディレクトリに移動しておきます。

su sftpuser
cd

マウント用ディレクトリを作成し、マウントします。

mkdir mountdir
mount-s3 [バケット名] mountdir

以上で設定は完了です。

SFTPで接続確認

WinSCPで接続してみます。
転送プロトコルにSFTPを選択します。
ホスト名にパブリック DNS名を入力し、ユーザ名、パスワードを入力します。

接続できれば、SFTP設定は問題ありません。

バケットをマウントしたディレクトリmountdir内にファイルをコピーしてみます。

S3バケットの中を確認してみると

コピーできていますね。

まとめ

Mountpoint for Amazon S3を使用して、S3をマウントしたSFTPサーバを構築できました。少しでも節約したい方の参考になれば幸いです。

参考:SFTPユーザをSFTP接続のみに限定する場合は、sshd_configを以下のようにすることで可能です。

Match User sftpuser
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  PasswordAuthentication yes

Discussion