s3fsでマウントできるバケットをIAMロールで制御します。
ロールの作成。
IAMの画面でRolesを選択し「Create New Role」。
ロールの名前を付けます。ここでは「role-test-bucket」とします。
Role Type は「Amazon EC2」を選択します。
テンプレートの中から「Amazone S3 Full Access」を選択します。
内容が表示されます。選択した通り、S3へのフルアクセスですが、ひとまずこのポリシーで続けます。 (後で編集します)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }
概要が表示されますます。問題がなければ「Create Role」。
次にEC2インスタンスを起動します。
インスタンスの詳細で「IAM role」を設定します。先ほど作成したロールがプルダウンで表示されます。
起動したEC2インスタンスでs3fsのインストールと設定を行います。
必要なパッケージをインストールします。
$ sudo yum install automake gcc-c++ fuse fuse-devel libcurl-devel libxml2-devel openssl-devel
s3fsをインストール。現時点の最新版は 1.77 でした。
$ wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.77.tar.gz $ tar -xzf v1.77.tar.gz $ cd s3fs-fuse-1.77/ $ ./autogen.sh $ ./configure $ make $ sudo make install
マウントするS3バケットを作成します。名前は「role-test-bucket」とします。
作成したS3バケットをマウントします。オプションに iam_role=”ロール名” を加えます。
$ sudo mkdir /mnt/s3fs-test $ sudo /usr/local/bin/s3fs role-test-bucket /mnt/s3fs-test/ -o rw,allow_other,iam_role="role-test-bucket"
確認。(実際はファイルやディレクトリの作成削除も確認したほうが良いでしょう)
$ ls /mnt/s3fs-test $ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 1.2G 6.5G 16% / devtmpfs 282M 12K 282M 1% /dev tmpfs 297M 0 297M 0% /dev/shm s3fs 256T 0 256T 0% /mnt/s3fs-test
確認が出来たら、ひとまずマウント解除。
$ sudo umount /mnt/s3fs-test
ポリシーを編集します。
設定したロールを選びPermissionsタブの「Manage Policy」を開きます。
「role-test-bucket」だけにアクセスできるように編集します。 <バケット名> だけだとマウントはできてもファイルやディレクトリのアクセスがうまくいきません。(ポリシーの名前も変更するべきかもしれませんが割愛)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::role-test-bucket", "arn:aws:s3:::role-test-bucket/*" ] } ] }
EC2インスタンスでマウントと確認。
$ sudo /usr/local/bin/s3fs role-test-bucket /mnt/s3fs-test/ -o rw,allow_other,iam_role="role-test-bucket" $ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 1.2G 6.5G 16% / devtmpfs 282M 12K 282M 1% /dev tmpfs 297M 0 297M 0% /dev/shm s3fs 256T 0 256T 0% /mnt/s3fs-test
他のバケットへのアクセスはどうなるでしょうか?「role-test-bucket-1」というバケットを作ってマウントしてみます。
$ sudo mkdir /mnt/s3fs-test-1 $ sudo /usr/local/bin/s3fs role-test-bucket-1 /mnt/s3fs-test-1/ -o rw,allow_other,iam_role="role-test-bucket" $ df -h df: ‘/mnt/s3fs-test-1’: Transport endpoint is not connected Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 1.2G 6.5G 16% / devtmpfs 282M 12K 282M 1% /dev tmpfs 297M 0 297M 0% /dev/shm s3fs 256T 0 256T 0% /mnt/s3fs-test
接続できません。
一旦、マウントを解除します。
$ sudo umount /mnt/s3fs-test-1
先ほど編集したポリシーに「role-test-bucket-1」用の設定を加えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::role-test-bucket", "arn:aws:s3:::role-test-bucket/*", "arn:aws:s3:::role-test-bucket-1", "arn:aws:s3:::role-test-bucket-1/*" ] } ] }
もう一度マウントと確認。
$ sudo /usr/local/bin/s3fs role-test-bucket-1 /mnt/s3fs-test-1/ -o rw,allow_other,iam_role="role-test-bucket" $ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 1.2G 6.5G 16% / devtmpfs 282M 12K 282M 1% /dev tmpfs 297M 0 297M 0% /dev/shm s3fs 256T 0 256T 0% /mnt/s3fs-test s3fs 256T 0 256T 0% /mnt/s3fs-test-1
うまくいったようです。