autofsでs3fsを利用する



s3fsが便利なのでよく利用していますが、
大量のファイルをコピー/移動するとs3fsプロセスのメモリ使用量が増えてしまいます。
s3fsをremountしたら良いのですが、その度にコマンド叩くのは面倒なのでautofsで管理することにしました。

s3fsはcloudpackさんの[s3fs-cloudpack](https://github.com/memorycraft/s3fs-cloudpack
) を利用しています。

### 1. cookbook作成
```cookbook
$ knife cookbook create autofs
$ knife cookbook create s3fs-cloudpack
```

#### 2. autofsのcookbook定義
```autofs/recipe/default/default.rb
package "autofs"

template "/etc/auto.misc" do
  source "auto.misc.erb"
  owner "root"
  group "root"
  mode  "0644"
  notifies :restart, "service[autofs]", :immediately
end

service "autofs" do
  action :enable
end
```

```autofs/template/default/auto.misc.erb
<%= node["s3fs_mountpoint"] %>  -fstype=fuse,allow_other,url=<%= node["s3fs_url"] %>  :s3fs#<%= node["s3fs_bucketname"] %>
```

```autofs/attribute/default.rb
node.set["s3fs_mountpoint"] = "s3fs"
node.set["s3fs_url"] = "https://s3.amazonaws.com"
node.set["s3fs_bucketname"] = "hogebucket"
```

#### 3. s3fs-cloudpackのcookbook定義

色々デフォルト。
scriptリソースは改良の余地あり。

```s3fs-cloudpack/recipes/default.rb
s3fs_requirepkg = ["libcurl-devel","libxml2-devel","libgcrypt-devel","openssl-devel"]
s3fs_requirepkg.each do |p|
  package "#{p}" do
    action :install
  end
end

if ! File.exists?("/usr/local/bin/s3fs")
  template "/etc/ld.so.conf.d/local-lib.conf" do
    source "local-lib.conf.erb"
  end

  script "s3fs-install" do
    interpreter "bash"
    user "root"
    cwd "/tmp"
    code <<-EOF
      wget http://downloads.sourceforge.net/project/fuse/fuse-2.X/2.9.2/fuse-2.9.2.tar.gz
      tar zxf fuse-2.9.2.tar.gz
      cd fuse-2.9.2
      ./configure && make && make install
      export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
      git clone https://github.com/memorycraft/s3fs-cloudpack.git
      cd s3fs-cloudpack
      ldconfig
      ./configure && make && make install
    EOF
  end
end

template "/etc/passwd-s3fs" do
  source "passwd-s3fs.erb"
  owner "root"
  group "root"
  mode  "0600"
end

```

attributeでaccess_keyとsecret_keyを設定していますが、
databagを利用したほうがよいですね

```s3fs-cloudpack/attributes/default.rb
node.set["access_key"] = "AAAAAAAAAAAAAAAA"
node.set["secret_key"] = "BBBBBBBBBBBBBBBBBBBBBBB"
```

``` s3fs-cloudpack/templates/default/local-lib.conf.erb
/usr/local/lib
```


``` s3fs-cloudpack/templates/default/passwd-s3fs.erb
<%= node.chef_environment["access_key"] %>:<%= node.chef_environment["secret_key"] %>
```

#### 4. provision

一先ずVagrantで動作確認しました


```実行
$ vagrant provision
※参考：Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos"
  config.vm.customize do |v|
        v.memory_size = 256
  end

  config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = ["<自分のcookbook-directory>"]
  chef.add_recipe "s3fs-cloudpack"
  chef.add_recipe "autofs"
  end

end
```

#### 5. 確認

```確認
※s3fsマウント中
# ps aux|grep s3fs
root      9845  0.0  1.6 326188 10132 ?      Ssl  22:05   0:00 s3fs <bucketName> /misc/<mountPoint> -o rw,allow_other,url=https://s3.amazonaws.com,dev,suid
※デフォルトだと10分アイドルタイムが発生するとマウント解除される
# ps aux|grep s3fs
root      9882  0.0  0.1 103232   868 pts/0    S+   22:16   0:00 grep s3fs
※再アクセス
# df /misc/<mountPoint>
# ps aux|grep s3fs
root      9890  0.0  0.3 247296  2412 ?        Ssl  22:17   0:00 s3fs <bucketName> /misc/<mountPoint> -o rw,allow_other,url=https://s3.amazonaws.com,dev,suid

```