EC2インスタンスでMTUを永続化


EC2インスタンスからRedshiftへ接続するためにインスタンスタイプによってはMTUを変更する必要があります。

参考
* [クライアントでクエリがハングしたようになり、クラスターに到達しない |  AmazonWebServices](http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-drop-issues.html)
* [Amazon RedshiftとEC2のインスタンスタイプに於ける"MTU"の関係について ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/connection-issue-abour-with-between-redshift-and-ec2/)

リンク先のコマンド(ip, ifconfig)でMTUを変更できますが永続化できないため、インターフェイス設定ファイルに記述する必要がありました。

```bash
root> echo 'MTU=1500' >> /etc/sysconfig/network-scripts/ifcfg-eth0
```

しかし、EC2インスタンスの場合、インターフェイス設定ファイルに記述しても永続化できておらず、サーバを再起動するとMTUが元に戻ってしまいました。

調べたところ、AWS Developer Forumsに該当するスレッドがありました。

> Here is what should be added to the /etc/dhcp/dhclient.conf (on Ubuntu Precise LTS):
>
> \#added these two lines before the request line
> default interface-mtu 1500;
> supercede interface-mtu 1500;

[AWS Developer Forums: How to set MTU permanently on Amazon ...](https://forums.aws.amazon.com/thread.jspa?messageID=577032)

どうやらdhclientが原因みたいです。

プロセスを確認してみます。

```bash
$ ps -ef | grep [d]hclient
root       718     1  0 08:49 ?        00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
```

`-lf` オプションで指定されているリースファイルを見てみます。

```/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 3600;
  option routers 10.0.0.1;
  option dhcp-message-type 5;
  option dhcp-server-identifier 10.0.0.1;
  option domain-name-servers 10.0.0.2;
  option interface-mtu 9001;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 3 2015/04/08 14:07:19;
  rebind 3 2015/04/08 14:30:01;
  expire 3 2015/04/08 14:37:31;
}
...
```

MTU値が設定されていました。

さらに、`ifup-eth`スクリプトで実際の動作を見てみます。

```/etc/sysconfig/network-scripts/ifup-eth.
## 99行目あたり
if [ -n "${MTU}" ]; then
   ip link set dev ${DEVICE} mtu ${MTU}
fi

...(省略)...

## 162行目あたり
if [ -n "${DYNCONFIG}" -a -x /sbin/dhclient ]; then
    if [[ "${PERSISTENT_DHCLIENT}" =  [yY1]* ]]; then
       ONESHOT="";
    else
       ONESHOT="-1";
    fi;
    generate_config_file_name
    # copy any lease obtained by the initrd
    for file in /dev/.dhclient-${DEVICE}.leases /dev/.initramfs/net.${DEVICE}.lease ; do
        if [ -f "${file}" ]; then
            mv -f $file /var/lib/dhclient/dhclient-${DEVICE}.leases
            [ -x /sbin/restorecon ] && restorecon /var/lib/dhclient/dhclient-${DEVICE}.leases > /dev/null 2>&1
        fi
    done
    DHCLIENTARGS="${DHCLIENTARGS} ${DHCP_HOSTNAME:+-H $DHCP_HOSTNAME} ${ONESHOT} -q ${DHCLIENTCONF} -lf /var/lib/dhclient/dhclient-${DEVICE}.leases -pf /var/run/dhclient-${DEVICE}.pid"
    echo
    echo -n $"Determining IP information for ${DEVICE}..."
    if [[ "${PERSISTENT_DHCLIENT}" !=  [yY1]* ]] && check_link_down ${DEVICE}; then
        echo $" failed; no link present.  Check cable?"
        exit 1
    fi

    ethtool_set

    if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
                echo $" done."
                dhcpipv4="good"
    else
                echo $" failed."
                if [[ "${IPV4_FAILURE_FATAL}"  = [Yy1]* ]] ; then
                        exit 1
                fi
                if [[ "$IPV6INIT" != [yY1]* && "$DHCPV6C" != [yY1]* ]] ; then
                        exit 1
                fi
                net_log "Unable to obtain IPv4 DHCP address ${DEVICE}." warning
    fi
...
```

99行目あたりでMTUが更新されてますが、162行目あたりでdhclientが動くため、そのときにMTUが上書きされているのが原因かなと思います。

したがって、`dhclient.conf`に次のような記述をします。

```/etc/dhcp/dhclient.conf
default interface-mtu 1500;
supersede interface-mtu 1500;
```

`default interface-mtu`はAWSのDHCPサーバからMTUが設定されるので記述しなくても良いと思いますが、`supersede interface-mtu`はDHCPクライアントの値を使うように設定するため、必ず記述してください。

上記のリンク先で、`supersede`が`supercede`にスペルミスしていてそれをコピペしたので、設定が反映されてなくてハマってました(ちゃんとドキュメント読めばすぐ分かったので反省)。

すぐに設定反映させるには、`service network restart`を実行すれば良いです。

設定反映後のリースファイルを再び見てみます。

```/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option routers 10.0.0.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.0.2;
  option dhcp-server-identifier 10.0.0.1;
  option interface-mtu 1500;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 5 2015/04/10 02:43:14;
  rebind 5 2015/04/10 03:12:24;
  expire 5 2015/04/10 03:19:54;
}
...
```

MTUが1500に変更されていることがわかります。