EC2にS3をマウントする方法

| 3 min read
Author: nozomu-tanaka nozomu-tanakaの画像

FTPサーバーとして使用しているEC2がファイルを受け取った際に、S3トリガーでLambdaを動かすようにしたときのメモです。

AWS Transfer for SFTPも検討しましたが、コストの問題からEC2にS3をマウントする方式を採用しました。

以下、その手順です。

参考

#

Amazon Linux2でIAMロールを使ったs3fsの設定をやってみた

AWS Transfer Family の料金

1.IAMロールに権限を追加

#

FTPサーバーとして使用するEC2がマウントするS3のファイルを読み書きできるよう、
EC2のIAMロールにS3への読み書き権を追加しておきます。

【追加したIAMポリシー】

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::{マウントするバケット名}"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::{マウントするバケット名}/*"
]
}
]
}

2.s3fsのインストール

#

EC2にS3をマウントできるようにするため、EC2にs3fsをインストールします。

以下をEC2のコマンドラインからroot権限で実行します。(sudo - root)

# yumアップデート(不要かも)
yum -y update
# s3fsのパッケージを入れるためにライブラリを追加
amazon-linux-extras install -y epel
# s3fsインストール
yum -y install s3fs-fuse
# バージョン確認
s3fs --version

3.S3のマウント

#

以下の手順でS3をマウントします。

  • バケットのルートからのみマウント可能です
  • なぜかS3バケット作成後1日待たないとマウントできないことがありました
# S3のマウントポイントを作成
mkdir /mnt/sftp
# EC2再起動時もS3がマウントされるよう/etc/fstabに以下を追加
# umaskを指定しないとftpユーザーが読み書きできない
echo "backet1 /mnt/sftp fuse.s3fs _netdev,allow_other,iam_role=auto,umask=022 0 0" | sudo tee -a /etc/fstab
# マウント実行
mount -a
# マウント確認
df -h

以降の手順はSFTPを使用しない場合は不要です。

4.SSHの設定

#

FTPユーザーのホームディレクトリがS3のマウントポイント以下になるようにします。

参考:セキュアなSSHサーバの設定

# FTPユーザーのホームディレクトリ作成
mkdir /mnt/sftp/home
# グループ追加
groupadd -g 510 sftps3users

sftps3usersに属するユーザーのホームディレクトリがS3のマウントポイント以下になるよう/etc/ssh/sshd_configに以下を追加します。

Match Group sftps3users
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes

SSHを再起動して設定を有効化します。

systemctl restart sshd.service

5.FTPユーザー追加

#

以下の手順でFTPユーザーを追加します。

# FTPユーザー(ftpuser1)追加
useradd -g sftps3users -d /mnt/sftp/home/ftpuser1 -s /sbin/nologin ftpuser1
# homeをrootでマウントできるようにする
chown root:root /mnt/sftp/home/ftpuser1
# 受信フォルダ(recv)作成
mkdir /mnt/sftp/home/ftpuser1/recv
chown ftpuser1 /mnt/sftp/home/ftpuser1/recv
chmod 770 /mnt/sftp/home/ftpuser1/recv
# パスワード(pass1)設定
echo ftpuser1:pass1 | chpasswd

6.FTP接続確認

#

FTP接続し、recvフォルダ以下のみ書き込みできることを確認します。

sftp ftpuser1@ftp-server1
パスワード:***
豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  2. Tauri でデスクトップアプリ開発を始める (2022-07-08)
  3. Deno による Slack プラットフォーム(オープンベータ) (2022-09-27)
  4. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  5. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  6. 第1回 OpenAPI Generator を使ったコード生成 (2022-06-04)
  7. 直感が理性に大反抗!「モンティ・ホール問題」 (2022-07-04)
  8. Rust によるデスクトップアプリケーションフレームワーク Tauri (2022-03-06)
  9. 箱ひげ図で外れ値を確認する (2022-05-18)
  10. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)