Calm Hill My Random Thoughts

Mount S3 Bucket with s3fs

EC2 ပေါ်မှာ Run နေရတာ ပြဿနာတခုက Storage ပါ။ အလွယ်ဆုံးနဲ့ စိတ်အချရဆုံးက EBS ဖြစ်ပေမယ့် စျေးကြီးတဲ့အတွက် Storage အများကြီးလိုတဲ့အခါတော့ မပေးနိုင်တဲ့အတွက် S3 ပေါ်မှာပဲထားရတယ် S3 က Web ကနေလည်း တိုက်ရိုက် Access လုပ်လို့ ရတဲ့အတွက် Archive မဟုတ်လည်း အသုံးတည့်ပါတယ်။ EC2 ကနေ S3 ပေါ်ကိုတင်ချင်ရင် ကိုယ်သုံးတဲ့ Application အပေါ်မူတည်ပြီးတော့ API တွေနဲ့တင်လို့ရတယ် ဒါပေမယ့်အဲဒါအတွက် အချိန်ပေးပြီးတော့ ခဏခဏ Implement လုပ်နေရတယ်။ S3 ကို EBS လို Mount လုပ်လို့ရရင် အတော်ကို အဆင်ပြေမယ် ရှာရင်းဖွေရင်းနဲ့ s3fs စမ်းကြည့်တယ် အရင်ကသုံးဖူးတယ် Directory တွေမရတာနဲ့ မသုံးဖြစ်ရာကနေ အခုတော့ရပြီဆိုတော့ ပြန်စမ်းကြည့်ဖြစ်တယ်။

s3fs က Build လုပ်ပြီးသားမရှိပါဘူး ကိုယ်တိုင်ပဲ Build လုပ်ရလိမ့်မယ် အဲဒီတော့ Build မလုပ်ခင်မှာ Dependency တွေကို အရင်ဆုံးအနေနဲ့ Install လုပ်ဖို့လိုမယ်။ Ubuntu Server ပေါ်မှာ Build လုပ်တဲ့အတွက် အောက်မှာတော့ သက်ဆိုင်တဲ့ Package တွေကိုပြထားတယ် တခြား Distro သုံးရင်တော့ သက်ဆိုင်ရာ Distro အလိုက် အဲဒီ့ Package တွေကိုအရင်ဆုံး Install လုပ်ရမယ်။ ပြီးရင်တော့ s3fs ရဲ့ Repository ကနေပြီးတော့ Latest Release ကို Download လုပ်ပြီး Build လုပ်ရမယ် s3fs က သေးသေးလေးပါ Build လုပ်တာခဏလေးပါပဲ။ prefix ကို /usr နဲ့လုပ်ထားတဲ့အတွက် Install ကတော့ /usr/bin အောက်မှလုပ်သွားတယ် အဲဒီ့မှာမလုပ်ချင်ရင်လည်း Build လုပ်လိုက်ရင် s3fs ဆိုပြီးတော့ binary file တခုထွက်လာတယ် အဲဒီ့ File တခုကိုပဲ Install လုပ်ချင်တဲ့နေရာကို ကူးထည့်လည်းရတယ်။

Dependency

sudo apt-get install build-essential libfuse-dev fuse-utils libcurl4-openssl-dev libxml2-dev mime-support

Build and Install

wget https://s3fs.googlecode.com/files/s3fs-1.73.tar.gz
tar xzf s3fs-1.73.tar.gz
cd s3fs-1.73
./configure --prefix=/usr
make
sudo make install

Installation Path

/usr/bin/s3fs

Build လုပ်ပြီးရင်တော့ တကယ်ကသုံးလို့ရပြီ s3fs command ကိုသုံးပြီးတော့ S3 Bucket တွေကို Local Filesystem မှာ Mount လုပ်လို့ရပါတယ် AccessKey နဲ့ SecretKey တော့ထည့်ပေးဖို့လိုလိမ့်မယ်။ allow_other Option ကိုထည့်ပေးလိုက်ရင် Mount လုပ်ထားတဲ့ Folder ကို တခြား User တွေပါ သုံးလို့ရပါတယ် ကိုယ့်တယောက်ထဲ အတွက်ဆိုရင်တာ့ အဲဒီ့ Option ကိုဖြုတ်ဖို့လိုမယ်။

Mounting

sudo s3fs bucketname -o accessKeyId=[AccessKey] -o secretAccessKey=[SecretKey] -o allow_other -o use_cache=/tmp /mnt/bucketname

Manual Mount လုပ်ထားတာက ကိုယ်သုံးချင်တဲ့ Bucket ကို အရေးပေါ်သုံးတဲ့အခါပဲ အသုံးဝင်ပေမယ့် အများအားဖြင့်က System Startup မှာကတည်းက သုံးချင်တဲ့ Bucket တွေကို Mount လုပ်ထားဖို့ လိုအပ်တဲ့လူက ပိုများမယ်ထင်တယ် အဲဒါဆိုရင်ရင်တော့ s3fs အတွက် AccessKey နဲ့ SecretKey တွေကို Configuration file မှာရေးထားဖို့လိုမယ်။ s3fs က /etc/passwd-s3fs ကို configuration file အနေနဲ့သိပါတယ်။ Amazon Access Key တွေဟာ အရေးကြီးပါတယ် Login Account ရဲ့ Access Key ကိုတော့ လုံးဝမသုံးသင့်ပါဘူး။ IAM မှာ S3 အတွက်ပဲသီးသန့် Permission ပေးပြီးတော့ Access Key ကို Generate လုပ်ထားလို့ရတယ်။ ပြီးတော့ passwd-s3fs ရဲ့ permission ကိုလည်း Owner ကလွဲရင် ကျန်တဲ့လူကို Access မပေးဖို့လိုလိမ့်မယ်။ Startup မှာ Mount အတွက်ကတော့ /etc/fstab မှာ Mount လုပ်ချင်တဲ့ Bucket တွေကို ထည့်ပေးရင် System Startup မှာအမြဲတမ်း Mount လုပ်ပေးနေမှာပါ။

Configuration

sudo mkdir /mnt/s3/bucketname
echo "[AccessKey]:[SecretKey]" | sudo tee -a /etc/passwd-s3fs
sudo chmod 400 /etc/passwd-s3fs

Mounting at system startup

echo "s3fs#bucketname   /mnt/bucketname fuse    allow_other,use_cache=/tmp,url=https://s3.amazonaws.com 0   0" | sudo tee -a /etc/fstab

s3fs ရဲ့ Manual မှာကျန်နေခဲ့တာက Unmount ဘယ်လိုပြန်လုပ်မယ် မပါလာဘူး s3fs က FUSE သုံးထားတာ အဲဒါကြောင့် fusermount နဲ့ unmount လုပ်လို့ရတယ်။ S3 Bucket တွေကို Local filesystem မှာ Mount လုပ်လို့ရတာ အတော်ကိုအဆင်ပြေတယ် S3 ပေါ်ကို Upload လုပ်ဖို့ သီးသန့်မရေးရတော့သလို အိမ်သုံးဆိုရင်လည်း S3 ပေါ်ကို Backup လုပ်ချင်တာမျိုးတွေမှာ အဆင်အပြေဆုံးပဲ Filesystem မှာပဲ Bucket ကို Mount လုပ်ထားပြီး Local Directory ထဲကိုပဲ Backup လုပ်နေရုံနဲ့ s3fs က S3 ပေါ်ကို Upload လုပ်ပေးနေမှ ကူးထည့်တာတော့ Upload လုပ်တာဖြစ်လို့ကြာတယ် ဒါကတော့ Local Filesystem မဟုတ်တာ သိနေတဲ့အတွက် လက်ခံနိုင်ပါတယ် s3fs သုံးတာနဲ့ API တခုခုနဲ့ Upload လုပ်တာ Performance ဘယ်လောက်ကွာခြားလဲတော့ စမ်းမကြည့်ဖြစ်သေးဘူး အားတဲ့အခါတော့ စမ်းကြည့်ရဦးမယ်။

Unmount

sudo fusermount -u /mnt/bucketname

References: [1] s3fs https://code.google.com/p/s3fs [2] Installation Notes https://code.google.com/p/s3fs/wiki/InstallationNotes