🙄

AnsibleでAWS EFSのマウント! ヘルパーでもできるのか?やってみた

2023/06/27に公開

何がしたいのか

今回は、AnsibleでAWS EFSのマウントを定義する際に、マウントヘルパーコマンド(コマンド例:mount -t efs -o tls)のようにfstypeやoptsを指定しても問題なく動作するのか検証してみるという記事になります。「ansible aws efs mount」などで検索しても、マウントヘルパーなしの通常のマウントでの記述例しか見られなかったので記事化してみました!

マウントヘルパーとは?

AWS EFSを対象とするマウントコマンドを実行する際に、
 ・推奨されるいくつかの設定を省略し、
 ・なおかつ追加で、転送時の暗号化やサポートログの取得ができる
というものです。

以下にマウント実行例を示します(AmazonLinux2のAMIを使用しているEC2から/var/www/html をマウントしたい場合)。

EFS_ID="fs-XXXXXXXXXXXXXX"
MOUNT_TARGET=$EFS_ID":/" 

# 通常(ヘルパーなし)
sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport $MOUNT_TARGET /var/www/html

# マウントヘルパー(転送時の暗号化を有効にするためには追加で-o tls)
sudo mount -t efs $MOUNT_TARGET /var/www/html

さらなる詳細はこちら(マウントヘルパー自体についてはこの記事が一番学びになりました):
https://dev.classmethod.jp/articles/efs-mount-helper/
このマウントヘルパーを用いてAnsibleを定義してもうまくいくのかどうか、それが今回の記事の検証になります(通常の方法でのEFSマウントは割と記事があります)。

結論とPlaybookの例

早速結論ですが、マウントヘルパーでも問題なく、動作できました!
以下、Playbookの例です。

※ディレクトリ構成などは割愛。{{ }}はAnsibleの変数で、EFSのIDをうける。)

- name: install amazon-efs-utils
  yum: amazon-efs-utils
    state: present
  become: yes

- name: mount efs volume   
  mount:   
    path: "/var/www/html"  
    src: "{{ _efs_fact_id }}:/"   
    fstype: "efs" # Point1
    opts: "tls"   # Point2
    state: mounted   
  become: yes

こんな感じでfstypeのところにefs、オプションにtlsと定義しました。

本当にできているのか検証

検証1:マウントできているのか

まずマウントができているのか確認しました。

sh-4.2$ df -Ph  
Filesystem      Size  Used Avail Use% Mounted on  
devtmpfs        482M     0  482M   0% /dev  
tmpfs           492M     0  492M   0% /dev/shm  
tmpfs           492M  444K  492M   1% /run  
tmpfs           492M     0  492M   0% /sys/fs/cgroup  
/dev/xvda1      8.0G  2.1G  6.0G  26% /  
127.0.0.1:/     8.0E     0  8.0E   0% /var/www/html

マウント時に指定したパス(/var/www/hmtl)が表示されています。
また、Filesystem列がループバックアドレス(127.0.0.1)になっているのは、転送時の暗号化が有効化されているためです!
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/encryption-in-transit.html

検証2:自動マウントできているのか

次にAnsibleのMountモジュールの特徴として、EFSに限らず、Playbook上で特に指定しなければデフォルトで自動マウントの設定までやってくれるというものがあります。
そこで以下の確認もしました。

sh-4.2$ cat /etc/fstab   
# 以下、出力結果  
UUID=04b92f2f-4366-4687-868b-7c403cc59901     /           xfs    defaults,noatime  1   1  
fs-0f0827637cd9e2e19 /var/www/html efs tls 0 0

出力結果の、2行目がEFSのID、パス、ネットワークタイプなどが記載されていますね。いい感じ!

まとめ:AnsibleでEFSをマウントする際でも、マウントヘルパーを使うべし

思っていた以上にAnsibleのマウントモジュールが柔軟でした。
これでAnsibleとマウントヘルパーのメリットが最大限発揮できます。
AnsibleでEFSのマウントを定義する場合に、転送時の暗号化ができるマウントヘルパーが使えないとなれば、Ansibleで定義するのはあきらめようと思っていたので個人的には大満足です。

今回の技術のメリットとしては、
単に「Ansible × EFSマウントヘルパー」が普通に動作するよ、ということで両者それぞれのメリットが発揮されるというものになります。

ただ記事を書いておいてなんですが、検索にヒットしなかった時点で、Ansibleからマウントするということはあまりないのかなとは思います。
今回は単純にAnsibleから実行してみたかったのと、EC2の設定周りをPlaybookとしてコードで一括管理したかったという中で、情報がなかったので記事としてまとめてみました!参考になればと思います。

参考記事

○ansibleのマウントモジュールについて
https://docs.ansible.com/ansible/2.9_ja/modules/mount_module.html

○ヘルパースクリプトを使うメリット
・転送時のデータの暗号化はヘルパースクリプトしかできない
https://dev.classmethod.jp/articles/efs-mount-helper/
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mounting-fs-old.html

・サポートログの取得
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/efs-mount-helper.html

Discussion