EC2からS3をマウントしてみる
AWSでEC2使ってS3をマウントしたいとかいう要望がったので調査がてら検証する過程で3つのマウント方法を試してみた。ついでにSambaでアクセス制御もやってみた。
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+EFSかAmazonFSxと組み合わせて使うようですね。
◆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://abillyz.com/vclbuff/studies/257
10年ぶり位にRedhat系(AmazonLinux)触りましたよ。dnfじゃなくてyumとか変わってねぇとか思いましたが、推奨はdnfなんですね。。。
しかしながらやはりUbuntuの方に慣れ親しんでいるので、やはりUbuntuがいいなぁと感じた次第です。(Amazonとかoracleとか冠されているディストリビューションはあまり好きくない。)
とりあえず、余力があれば今後はGCE+GCSパターンとAzureVM+AzureBlobのマウントパターンも同じ構成で試して見れればと思っとります。(果たして続編あるのか?
コメント