Salt StackでAWSにNFSをたててみる
目的
Amazon EFSのようなファイルシステムがほしいけど、TokyoリージョンにないのでNFSをたててみる
この記事でやること
Salt Stackを使ってNFSサーバとクライアントをたてる。データをNFSサーバにコピーしてクライアントからみられるか確認する。
Requirment
AWS EC2にSalt Stackがインストールされており、使用できる状態であること。インストール手順は、前回の記事を参照してください。
Salt StackでAWSをマネージメントしたい - ken0-1nのブログ
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'
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/