EC2からS3をマウントしてみる

 AWSでEC2使ってS3をマウントしたいとかいう要望がったので調査がてら検証する過程で3つのマウント方法を試してみた。ついでにSambaでアクセス制御もやってみた。

MountPoint for S3

goofys

s3fs

MountPointの方は新規と削除しかできないのでファイルサーバ的な用途ではやや厳しく、ログファイルを新規書込みするケースのみにしか使えなさそうで、goofysとs3fsを比較すると新規作成の場合はs3fsだと作成済ファイル表示までに時間がかかってgoofysの方はすぐに作成済ファイルが表示された。ローカルからのコピーだといずれも体感差はない感じ。

AmazonLinux2023の場合MountPointとs3fsはEC2にIAMロールアタッチで使えたもののgoofysではcredentialsを登録してあげないと動かない。UbuntuではいずれもIAMロールアタッチで対応できた。なのでAmazonLinuxでEC2にIAMロールアタッチでsamba使ってS3をマウントするという要件だと今のところs3fsしかないかなという感じでした。

コマンドラインからSamba叩くのは嫌だとか言う人もいるだろうからWebmin試してみました。rootユーザにパスワード設定しないといけないのでそこだけ注意ですかね。ひとまずお手軽にSambaユーザ追加できました。

次やる機会があるのかわかりませんが、ひとまずShellスクリプトにして再利用できるようにしときました。けどAmazonの推奨パターンは、こういうケースだとEC2+EFSAmazonFSxと組み合わせて使うようですね。


◆Shell本体

#!/bin/sh
ACCESS_KEY_ID=AKIXXXXXXXXX
ACCOUNT_ACCESS_KEY_ID=XXXXXXXX
ACCOUNT_REGION_ID=ap-northeast-1
ACCOUNT_OUTPUT=json
S3_BUCKET_MP_PUBLIC=test-mountpoint-samba
S3_BUCKET_S3FS=test-s3fs-samba
S3_BUCKET_GFYS=test-goofys-samba
MOUNT_DIR_MPS3=/mnt/test-mountpoint-s3
MOUNT_DIR_S3FS=/mnt/test-s3fs
MOUNT_DIR_GFYS=/mnt/test-goofys
IAM_ROLE=Your-IAM-Role
URL=https://s3-ap-northeast-1.amazonaws.com
WORKGROUP=WORKGROUP
PUBLIC_DIR=public
PUBLIC_SHARE_MPS3=share_mountpoint
PUBLIC_SHARE_S3FS=share_s3fs
PUBLIC_SHARE_GFYS=share_goofys
CONTENTS_DIR=contents
CONTENTS_SHARE_MPS3=contents_mountpoint
CONTENTS_SHARE_S3FS=contents_s3fs
CONTENTS_SHARE_GFYS=contents_goofys
ADMIN_GRP=administrator_group
CONTENTS_MGR_GRP=contents_manager_group
VIEWER_GRP=viewer_group
ADMIN_USER=smb_systemadmin
CONTENTS_MGR=smb_contentsadmin
VIEW_USER=smb_viewuser
ADMIN_PASSWORD=password
CNT_PASSWORD=password
VIEW_PASSWORD=password


#
# 1.credentialsの設定
#
sudo mkdir -p /root/.aws
sudo tee /root/.aws/credentials <<_EOF_
[default]
aws_access_key_id = ${ACCESS_KEY_ID}
aws_secret_access_key = ${ACCOUNT_ACCESS_KEY_ID}
_EOF_

sudo tee /root/.aws/config <<_EOF_
[default]
region = ${ACCOUNT_REGION_ID}
output = ${ACCOUNT_OUTPUT}
_EOF_


#
# 2.Mountpoint for Amazon S3のインストール
#
sudo mkdir ${MOUNT_DIR_MPS3}
sudo wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
sudo yum install ./mount-s3.rpm -y
sudo tee /lib/systemd/system/mount-s3.service <<_EOF_
[Unit]
Description=Mountpoint for Amazon S3 mount
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=mount-s3 --allow-delete --allow-other --dir-mode 0777 ${S3_BUCKET_MP_PUBLIC} ${MOUNT_DIR_MPS3}
ExecStop=/usr/bin/fusermount -u /mnt

[Install]
WantedBy=default.target
_EOF_

sudo chmod 755 /lib/systemd/system/mount-s3.service
sudo systemctl start mount-s3.service
sudo systemctl enable mount-s3.service
rm  -Rf mount-s3.rpm


#
# 3.S3fsインストール
#
sudo mkdir ${MOUNT_DIR_S3FS}
sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel -y
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd  s3fs-fuse
./autogen.sh 
./configure --prefix=/usr --with-openssl
make
sudo make install
echo "/usr/bin/s3fs#${S3_BUCKET_S3FS} ${MOUNT_DIR_S3FS} fuse _netdev,iam_role=${IAM_ROLE},url=${URL},allow_other 0 0" | sudo tee -a /etc/fstab
rm -Rf s3fs-fuse/
#sudo /usr/bin/s3fs ${S3_BUCKET_S3FS} ${MOUNT_DIR_S3FS} -o iam_role=${IAM_ROLE},url=${URL},allow_other
sudo mount -a


#
# 4.goofysインストール
#
sudo mkdir ${MOUNT_DIR_GFYS}
sudo dnf install -y golang fuse
GOOFYS_VERSION=$(curl -s https://api.github.com/repos/kahing/goofys/releases/latest | grep tag_name | cut -d '"' -f 4)
sudo wget https://github.com/kahing/goofys/releases/download/v0.24.0/goofys -P /usr/local/bin/
sudo chmod 755 /usr/local/bin/goofys
echo "/usr/local/bin/goofys#${S3_BUCKET_GFYS} ${MOUNT_DIR_GFYS} fuse _netdev,allow_other,--dir-mode=0777,--file-mode=0666 0 0" | sudo tee -a /etc/fstab
#sudo goofys s3test-goofys-samba /mnt/test-goofys/
sudo mount -a


#
# 5.Sambaインストール
#
sudo dnf -y upgrade
sudo dnf -y install samba
sudo systemctl start smb.service
sudo systemctl enable smb.service
sudo systemctl start nmb
sudo systemctl enable nmb

# Samba設定ファイル準備
mkdir -p ${MOUNT_DIR_MPS3}/${PUBLIC_DIR}/
mkdir -p ${MOUNT_DIR_MPS3}/${CONTENTS_DIR}/
sudo chmod -R 777 ${MOUNT_DIR_MPS3}/
mkdir -p ${MOUNT_DIR_S3FS}/${PUBLIC_DIR}/
mkdir -p ${MOUNT_DIR_S3FS}/${CONTENTS_DIR}/
sudo chmod -R 777 ${MOUNT_DIR_S3FS}/
mkdir -p ${MOUNT_DIR_GFYS}/${PUBLIC_DIR}/
mkdir -p ${MOUNT_DIR_GFYS}/${CONTENTS_DIR}/
sudo chmod -R 777 ${MOUNT_DIR_GFYS}/
sudo chmod -R 777 /mnt/test-mountpoint-s3

sudo cp -r /etc/samba/smb.conf /etc/samba/smb.conf.org
sudo tee /etc/samba/smb.conf <<_EOF_
[global]
   workgroup = ${WORKGROUP}
   server string = SAMBA SERVER Version %v
   netbios name = samba_fs
   security = user
   passdb backend = tdbsam
   dos charset = CP932
   unix charset = UTF-8
   wins support = yes
   load printers = no
   disable spoolss = yes
   log level = 2
   log file = /var/log/samba/log.audit
   vfs objects = full_audit
   full_audit:prefix = %u|%I|%m|%S
   full_audit:success = all
   full_audit:failure = all
   full_audit:facility = LOCAL5
   full_audit:priority = ALERT
   panic action = /usr/share/samba/panic-action %d
   max log size = 1024
[${PUBLIC_SHARE_MPS3}]
   path = ${MOUNT_DIR_MPS3}/${PUBLIC_DIR}
   public = yes
   writable = yes
   force create mode = 0666
   force directory mode = 0777
   browseable = yes
[${PUBLIC_SHARE_S3FS}]
   path = ${MOUNT_DIR_S3FS}/${PUBLIC_DIR}
   public = yes
   writable = yes
   force create mode = 0666
   force directory mode = 0777
   browseable = yes
[${PUBLIC_SHARE_GFYS}]
   path = ${MOUNT_DIR_GFYS}/${PUBLIC_DIR}
   public = yes
   writable = yes
   force create mode = 0666
   force directory mode = 0777
   browseable = yes
[${CONTENTS_SHARE_MPS3}]
   comment = Viewer Share
   path = ${MOUNT_DIR_MPS3}/${CONTENTS_DIR}
   browseable = yes
   read only = yes
   guest ok = no
   valid users = @${ADMIN_GRP} @${CONTENTS_MGR_GRP} @${VIEWER_GRP}
   write list = @${ADMIN_GRP} @${CONTENTS_MGR_GRP}
   force group = ${CONTENTS_MGR_GRP}
   create mask = 0660
   directory mask = 0770
[${CONTENTS_SHARE_S3FS}]
   comment = Viewer Share
   path = ${MOUNT_DIR_S3FS}/${CONTENTS_DIR}
   browseable = yes
   read only = yes
   guest ok = no
   valid users = @${ADMIN_GRP} @${CONTENTS_MGR_GRP} @${VIEWER_GRP}
   write list = @${ADMIN_GRP} @${CONTENTS_MGR_GRP}
   force group = ${CONTENTS_MGR_GRP}
   create mask = 0660
   directory mask = 0770
[${CONTENTS_SHARE_GFYS}]
   comment = Viewer Share
   path = ${MOUNT_DIR_GFYS}/${CONTENTS_DIR}
   browseable = yes
   read only = yes
   guest ok = no
   valid users = @${ADMIN_GRP} @${CONTENTS_MGR_GRP} @${VIEWER_GRP}
   write list = @${ADMIN_GRP} @${CONTENTS_MGR_GRP}
   force group = ${CONTENTS_MGR_GRP}
   create mask = 0660
   directory mask = 0770
_EOF_
sudo systemctl restart smb.service
sudo systemctl restart nmb


#
# 6.Webmin
#
curl -o setup-repos.sh https://raw.githubusercontent.com/webmin/webmin/master/setup-repos.sh
sudo sh setup-repos.sh
sudo dnf -y install webmin
rm setup-repos.sh


#
# 7.Group追加・ユーザ追加
#
sudo groupadd ${ADMIN_GRP}
sudo groupadd ${CONTENTS_MGR_GRP}
sudo groupadd ${VIEWER_GRP}

sudo useradd -g ${ADMIN_GRP} -r -s /sbin/nologin ${ADMIN_USER}
sudo useradd -g ${CONTENTS_MGR_GRP} -r -s /sbin/nologin ${CONTENTS_MGR}
sudo useradd -g ${VIEWER_GRP} -r -s /sbin/nologin ${VIEW_USER}

echo -e "${ADMIN_PASSWORD}\n${ADMIN_PASSWORD}" | sudo smbpasswd -a ${ADMIN_USER}
echo -e "${CNT_PASSWORD}\n${CNT_PASSWORD}" | sudo smbpasswd -a ${CONTENTS_MGR}
echo -e "${VIEW_PASSWORD}\n${VIEW_PASSWORD}" | sudo smbpasswd -a ${VIEW_USER}

◆参照サイト

・Amazon Linux2023

https://qiita.com/Todate/items/bb7e04cd9d5e1b06b942

https://www.freekb.net/Article?id=4927

https://sig9.org/blog/2023/10/23/

https://note.com/hiroyu0510/n/n02e530fd609d

https://qiita.com/t-kigi/items/f30c9e20195225119004

https://qiita.com/u-bayashi/items/d5f85b461f4731e5a7a2


・Samba監査ログ関連

https://blog.treedown.net/entry/2019/08/09/010000

https://wiki.samba.org/index.php/Samba_Features_added/changed

http://wiki.samba.gr.jp/mediawiki/images/f/fe/070630osc2007do.pdf

https://note.com/sakuzo_books/n/n2521c6cbd08b


・Webmin

https://webmin.com/download/

https://abillyz.com/vclbuff/studies/257


10年ぶり位にRedhat系(AmazonLinux)触りましたよ。dnfじゃなくてyumとか変わってねぇとか思いましたが、推奨はdnfなんですね。。。

しかしながらやはりUbuntuの方に慣れ親しんでいるので、やはりUbuntuがいいなぁと感じた次第です。(Amazonとかoracleとか冠されているディストリビューションはあまり好きくない。)

とりあえず、余力があれば今後はGCE+GCSパターンとAzureVM+AzureBlobのマウントパターンも同じ構成で試して見れればと思っとります。(果たして続編あるのか?

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)