1. 概要
Amazon S3 Files が今月 (2026 年 4 月) GA となったので、CloudFormation と Ansible を使って構成しました。
前回の記事 - ① CloudFormation 編 で S3 Files ファイルシステムとマウントターゲットの構成ができたので、今回は Ansible を使って Amazon Linux 2023 に S3 Files をマウントして、実際にファイルの読み書きができるようにします。
またマウントした S3 Files を Docker コンテナがバインドできるように、マウントの処理が完了するまで docker サービスの起動を待機させる構成も行います。この構成は、docker 以外のサービスを待機させたい場合にも応用できます。
2. EFS クライアントのインストール
S3 Files をマウントするために必要な amazon-efs-utils v3.x を Amazon Linux 2023 にインストールします。
2.1. リポジトリの登録
Amazon Linux 2023 標準リポジトリの efs-utils は v2.4.x なので、3.x 用の yum リポジトリを追加します。
- name: Amazon efs-utils 3.x 用 yum リポジトリの登録
ansible.builtin.yum_repository:
name: efs-utils
description: Amazon efs-utils repository
baseurl: https://amazon-efs-utils.aws.com/repo/rpm/amazon/2023
enabled: true
gpgcheck: true
gpgkey: https://amazon-efs-utils.aws.com/efs-utils-armored.gpg
priority: 1
state: present
2.2. パッケージのインストール
S3 Files のマウントには botocore も必要です。botocore は pip でインストールするので、dnf で python3-pip もインストールします。
- name: S3 Files のマウントに必要な rpm パッケージのインストール
ansible.builtin.dnf:
name:
- amazon-efs-utils >= 3.0
- python3-pip
- jq
state: present
update_cache: true
- name: S3 Files のマウントに必要な pip パッケージのインストール
ansible.builtin.pip:
name:
- botocore
3. 変数定義
マウントポイントにしたい任意のディレクトリパスを指定してください。
mountpoint_path: /mnt/s3files
4. ファイルシステムのマウント
S3 Files マウントの定義を /etc/fstab に追加して、起動時の自動マウントを構成します。
4.1. ファイルシステム ID の取得
前回の記事中の「4.4. ファイルシステム ID の保存」 で Systems Manager パラメータストアに保存したファイルシステム ID を取得します。パラメータ名 my-s3files-filesystem-id は、前回 CloudFormation で値の保存に使用したパラメータ名と同じ名前を指定してください。
- name: SSM パラメータストアから S3 Files ファイルシステム ID を取得
ansible.builtin.shell: |
set -o pipefail
aws ssm get-parameter --name 'my-s3files-filesystem-id' --output json | jq -r '.Parameter.Value'
register: ssm_params_s3files_fs_id
changed_when: false
# コマンド実行結果の標準出力とステータスで成功/失敗の判定をする
failed_when: ssm_params_s3files_fs_id.stdout == "" or ssm_params_s3files_fs_id.rc != 0
この例では AWS CLI で値を取得して、標準出力が空かステータスが 0 以外の場合に失敗と判定して Playbook の実行を中断します。
取得したファイルシステム ID は、コマンドの実行結果を保存したレジスター ssm_params_s3files_fs_id の標準出力 .stdout で参照することができます。実際の ID の値は fs-0123456789abcdef0 のような文字列です。
4.2. 自動マウント設定と即時マウント
/etc/fstab に定義を追加して起動時の自動マウントを構成してマウントします。ファイルシステムタイプには nfs4 ではなく、s3files を指定します。
- name: マウントポイントのディレクトリを作成
ansible.builtin.file:
path: "{{ mountpoint_path }}"
state: directory
mode: "0755"
- name: fstab に起動時の自動マウント定義を追加して即時マウント
ansible.posix.mount:
boot: true
# ファイルシステムタイプに注意
fstype: s3files
opts: tls,_netdev
path: "{{ mountpoint_path }}"
# パラメータストアから取得したファイルシステム ID + ':/'
src: "{{ ssm_params_s3files_fs_id.stdout }}:/"
state: mounted
- Mounting S3 file systems on Amazon EC2 - Amazon Simple Storage Service
- Ansible.Posix — Ansible Community Documentation
5. Docker サービスの待機設定
マウントした S3 Files を Docker コンテナがバインドできるように、マウントの処理が完了するまで docker サービスの起動を待機させる構成も行います。この構成は、docker 以外のサービスを待機させたい場合にも応用できます。
5.1. drop-in ユニットファイルのテンプレート
docker サービスに待機設定を追加する方法として、標準のユニットファイルに追記するのではなく、drop-in ファイルで設定を追加します。
以下のテンプレートファイルを、このタスクを含むロールの templates/requiremount.conf.j2 (任意) に作成してください。
[Unit]
RequiresMountsFor={{ mountpoint_path }}
5.2. drop-in ファイルを追加
上記のテンプレートから実際の drop-in ファイルを生成して配置します。ディレクトリのパスは /etc/systemd/system/[サービス名].service.d にしてください。
- name: docker サービスの drop-in ユニットファイル用ディレクトを作成
ansible.builtin.file:
# パスは /etc/systemd/system/[サービス名].service.d
path: /etc/systemd/system/docker.service.d
state: directory
mode: "0755"
- name: docker サービスの drop-in ユニットファイルを追加
ansible.builtin.template:
dest: /etc/systemd/system/docker.service.d/requiremount.conf
mode: "0644"
# 上で作成したテンプレートファイルを指定する
src: "{{ role_path }}/templates/requiremount.conf.j2"
# 変更をハンドラに通知する
notify:
- restart docker.service
drop-in ファイルが追加または変更されたら自動的に以下のハンドラが実行されて、追加設定がサービスに反映されます。
- name: ユニットファイルをリロードして docker サービスを再起動
ansible.builtin.systemd_service:
daemon_reload: true
name: docker
enabled: true
state: restarted
# 変更されたら通知を受信する
listen:
- restart docker.service
以上で Ansible Playbook による構成は完了です。
前回の記事 - ① CloudFormation 編 と合わせると、結構なコード量になってしまいました。
6. 確認
Playbook の実行が完了した EC2 インスタンスで以下のように df コマンドを実行すると、マウントされたファイルシステムの情報が表示されます。S3 バケットの容量は 8 エクサバイトと表示されるようです。
$ df -h /mnt/s3files
Filesystem Size Used Avail Use% Mounted on
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/s3files
実際に /mnt/s3files/ にファイル作成・更新・削除などの操作をして、ローカルドライブと同様に扱えることと、ファイル操作の結果が S3 バケット内のオブジェクトに反映されることを確認してください。
7. 参考リンク
- S3 Files の提供開始 – S3 バケットがファイルシステムとしてアクセス可能に | Amazon Web Services ブログ
- Prerequisites for S3 Files - Amazon Simple Storage Service
- Mounting S3 file systems on Amazon EC2 - Amazon Simple Storage Service
- Ansible.Builtin — Ansible Community Documentation
- Ansible.Posix — Ansible Community Documentation
- 第598回 systemdユニットの設定を変える | gihyo.jp