s3fsでマウントできるバケットをIAMロールで制御します。

ロールの作成。

IAMの画面でRolesを選択し「Create New Role」create new role

 

 

 

 

 

 

 

 

 

 

ロールの名前を付けます。ここでは「role-test-bucket」とします。config

 

 

 

 

 

 

Role Type は「Amazon EC2」を選択します。role type

 

 

 

 

 

 

 

 

 

 

テンプレートの中から「Amazone S3 Full Access」を選択します。permissions

 

 

 

 

 

 

 

 

 

 

 

 

内容が表示されます。選択した通り、S3へのフルアクセスですが、ひとまずこのポリシーで続けます。s3 full access (後で編集します)

 

 

 

 

 

 

 

 

 

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

 

概要が表示されますます。問題がなければ「Create Role」。create

 

 

 

 

 

 

 

 

新しいロールが出来ました。new role

 

 

 

 

 

 

 

 

 

 

次にEC2インスタンスを起動します。
インスタンスの詳細で「IAM role」を設定します。先ほど作成したロールがプルダウンで表示されます。IAM role

 

 

 

 

 

 

 

 

 

 

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」を開きます。manage policy

 

 

 

 

 

 

 

 

 

 

「role-test-bucket」だけにアクセスできるように編集します。 <バケット名> だけだとマウントはできてもファイルやディレクトリのアクセスがうまくいきません。(ポリシーの名前も変更するべきかもしれませんが割愛)new policy

 

 

 

 

 

 

 

 

 

 

{
  "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

うまくいったようです。