👌

自前でEC2にSFTPサーバーを構築してS3に転送する

2024/06/24に公開

AWSと外部システムと連携して定期的にファイルを転送しなければならない要件が出てきて調べてみるとAWS Transfer Familyというのがありました。
これを使えばフルマネージドでSFTP, FTPS, FTP を導入することができるようです。
ただデータのアップロードとダウンロードの転送量の料金に加え、エンドポイントが有効になっている時間あたり「$0.3/時間」が発生するので、これだけでも月に$216発生してしまうようです。(高い...)
($0.3 x 24時間 x 30日 = $216)

ファイルの転送は1日数回だけなので、それにこの金額はコスパが悪いのでEC2でSFTPサーバーを構築してファイル転送してみようと思います。

環境
  • Amazon linux 2023
  • m3.micro

1. EC2インスタンスのセットアップ

AWSマネジメントコンソールからEC2インスタンスを作成します。セキュリティグループではポート22(SSH)を開放しましょう。

2. SSHでEC2インスタンスに接続

まずはインスタンスにSSH接続します。

ssh -i "your-key-pair.pem" ec2-user@your-ec2-public-ip

3. SFTPユーザーの設定

SFTP専用のユーザーアカウントを作成します。

sudo useradd sftpuser
sudo passwd sftpuser

4. ディレクトリと権限の設定

SFTPユーザーのホームディレクトリを設定し、適切な権限を設定します。

sudo mkdir -p /home/sftpuser/upload
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
sudo chown sftpuser:sftpuser /home/sftpuser/upload

5. SSH設定の変更

SSHサーバーの設定ファイルを編集します。

sudo vi /etc/ssh/sshd_config

以下の設定を追加または変更します

#Subsystem sftp /usr/libexec/openssh/sftp-server # コメントアウト
Subsystem sftp internal-sftp # chroot 構成の場合はこちら

# SFTPアクセスのユーザー制限
Match User sftpuser # 特定のユーザーに対する設定
ChrootDirectory /home/sftpuser # ルートディレクトリ
ForceCommand internal-sftp # ログインした際に強制的にSFTPサーバーを使用するようにする
AllowTcpForwarding no # TCP転送を無効
X11Forwarding no # X11転送を無効

設定を適用するためにSSHサービスを再起動します。

sudo systemctl restart sshd

6. 鍵認証の設定

クライアントマシンで鍵ペアを生成します。

ssh-keygen -t rsa -b 2048 -f ~/.ssh/your_custom_key_name

公開鍵をコピー

cat ~/.ssh/your_custom_key_name # 出力された公開鍵をコピーします。

EC2にログインして権限を設定します。

sudo mkdir -p /home/sftpuser/.ssh
sudo chmod 700 /home/sftpuser/.ssh

クライアントマシンで出力した公開鍵をauthorized_keysに貼り付けます。

sudo vi /home/sftpuser/.ssh/authorized_keys # 公開鍵を貼り付ける

権限変更

sudo chmod 600 /home/sftpuser/.ssh/authorized_keys
sudo chown -R sftpuser:sftpuser /home/sftpuser/.ssh

7.Mountpoint for Amazon S3を利用してS3にマウント

外部システムから転送してきたファイルはEC2内ではなくS3にアップロードしたいです。
ファイル転送時にAWS CLIやAWS SDKを利用してS3にアップロードすることも可能ですが、下記の記事で紹介されているMountpoint for Amazon S3を利用すればS3バケットをローカルファイルシステムとしてマウントできるということなのでこれを利用します。
https://zenn.dev/junnuj/articles/797775c057ce2e
https://github.com/awslabs/mountpoint-s3

S3バケットの作成

最初にマウント元となるS3バケットを作成します。

IAM ロールの設定

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

Mountpoint for Amazon S3をインストール

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

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

ここからはSFTPユーザでログインして作業していきましょう。

su sftpuser
cd ~/

マウントします。

mount-s3 [バケット名] /home/sftpuser/upload

8.FTPクライアントツールで接続確認

FTPクライアントツールから接続します。今回はFileZillaを利用します。
サイトマネージャーの新しいサイトから接続情報を入力します。

接続情報
  • プロトコル: SFTP
  • ホスト: EC2インスタンスのIPアドレス
  • ポート: 22
  • ログオン タイプ: 鍵ファイル
  • ユーザー: sftpuser
  • 鍵ファイル: ローカルで作成した秘密鍵

これでSFTP通信でファイル転送する準備が整いました。
あとはuploadディレクトリに転送したいファイルをアップロードすればマウント元のS3バケットにファイルがアップロードされます!

これなら、かかるコストはEC2の料金のみなのでAWS Transfer Familyと比べてかなりコストを削減できますね!

Discussion