Salt StackでAWSにNFSをたててみる

目的

Amazon EFSのようなファイルシステムがほしいけど、TokyoリージョンにないのでNFSをたててみる

 

この記事でやること

Salt Stackを使ってNFSサーバとクライアントをたてる。データをNFSサーバにコピーしてクライアントからみられるか確認する。

 

Requirment

AWS EC2にSalt Stackがインストールされており、使用できる状態であること。インストール手順は、前回の記事を参照してください。

Salt StackでAWSをマネージメントしたい - ken0-1nのブログ

 

NFSサーバとなるインスタンスの作成

Salt Stackのマスターがインストールされている、AWS EC2インスタンスにログインし、下記の定義を/etc/salt/cloud.profilesに追加する。

# providerは、AWSキーペアとかセキュリティーグループが定義されているファイルを参照してる。(前回の記事を参照)
# NFSクライアントが参照するファイルを置きたいのでVolumeSizeは大きめ(100GB)
base_ec2_nfs:
    provider: my-ec2-southeast-private-ips
    image: ami-835b4efa
    size: m4.xlarge
    ssh_username: ubuntu
    block_device_mappings:
    - DeviceName: /dev/sda1
      Ebs.VolumeSize: 100
      Ebs.VolumeType: gp2

# インスタンスの作成
salt-cloud -p base_ec2_nfs ami.nfs_server

 

NFSサーバの設定

1. サーバ設定を行う.shファイルを作成&実行

# mount_server.sh

#!/bin/bash
set -xv

apt-get -y install awscli
apt-get -y install nfs-kernel-server
mkdir -p /mnt/data
echo "/mnt *(rw,fsid=0,no_subtree_check,sync)" >> /etc/exports
echo "/mnt/data *(rw,nohide,insecure,no_subtree_check,sync)" >> /etc/exports
# デーモンの数を変えたい。数値の置換の方が良かったかな?
mv /etc/default/nfs-kernel-server /etc/default/nfs-kernel-server.bk
echo "RPCNFSDCOUNT=32" > /etc/default/nfs-kernel-server
cat /etc/default/nfs-kernel-server.bk | awk 'NR>=3' >> /etc/default/nfs-kernel-server
# 設定の反映
systemctl restart nfs-config
#サーバ起動
service nfs-kernel-server restart
# サーバーにファイルをコピー
salt-cp ami.nfs_server ./mount_server.sh ~/.

# 実行
salt 'ami.nfs_server' cmd.run 'bash /root/./mount_server.sh'

2.マウントポイントにデータをコピーする.shファイルを作成&実行

# data_copy_server.sh

#!/bin/bash
set -xv
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxx
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=us-west-2
aws s3 cp --recursive s3://kchiba-test-bucket/data/database /mnt/data
# サーバーにファイルをコピー
salt-cp ami.nfs_server ./data_copy_server.sh ~/.

# 実行
salt 'ami.nfs_server' cmd.run 'bash /root/./data_copy_server.sh'

# 戻り値 ファイルのコピーは成功しているのに、正常終了にならない。バグかなー。
ami.nfs_server:
 VALUE_TRIMMED

# 仕方ないのでsshでami.nfs_serverにログインしてdata_copy_server.shを実行した。 
→正常終了した。

# nfs serverのrestert
salt 'ami.nfs_server' cmd.run 'service nfs-kernel-server restart'

 

NFSクライアントとなるインスタンスの作成&実行

Salt Stackのマスターがインストールされている、AWS EC2インスタンスにログインし、下記の定義を/etc/salt/cloud.profilesに追加する。

base_ec2_client:
    provider: my-ec2-southeast-private-ips
    image: ami-835b4efa
    size: m4.large
    ssh_username: ubuntu

# インスタンスの作成
salt-cloud -P -p base_ec2_client ami.nfs_client1 ami.nfs_client2 ami.nfs_client3 ami.nfs_client4

 

 NFSクライアントの設定

1. fstabを編集。大きいファイルサイズのデータを扱いたいのでオプションを変更

LABEL=cloudimg-rootfs   /        ext4   defaults,discard,rsize=1048576,wsize=1048576    0 0
# クライアントにファイルをコピー
salt-cp 'ami.nfs_mini*' fstab /etc/fstab

2. マウントコマンドが記載された.shファイルを作成 # mount_server.sh

#!/bin/bash
set -xv

nfs_server=$1
apt-get -y install nfs-common
mkdir -p /mnt
# 編集したfstabを読み込む
systemctl daemon-reload
mount -v -t nfs4 ${nfs_server}:/ /mnt
# クライアントにファイルをコピー
salt-cp 'ami.nfs_client*' mount_client.sh ~/.

# サーバ側のホスト名を調べる
salt 'ami.nfs_server' cmd.run 'hostname'
ami.nfs_server:
ip-172-31-xx-xx

# ホスト名に引数を入れて実行
salt 'ami.nfs_client*' cmd.run 'bash /root/./mount_client.sh ip-172-31-xx-xx'

# マウントされたファイルがみえるか確認
salt 'ami.nfs_client*' cmd.run 'ls /mnt/data'

 

使ってみて感想

salt cmd.runでVALUE_TRIMMEDがreturnされて原因がわからない(17/11/20)。そこそこメモリの大きいインスタンスを立てているはずだがうまくいかない。

 

 参考

https://siguniang.wordpress.com/2015/08/09/setup-nfsv4-on-ubuntu-1404/

http://uramocha02.blogspot.jp/2017/02/etcfstab.html

https://docs.saltstack.com/en/latest/ref/cli/salt-cp.html