1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon S3 Files を IaC で構成して S3 と EFS のいいとこ取りをする ② Ansible 編【完結】

1
Posted at

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

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. 参考リンク

7.1. 関連記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?