[アップデート]Mountpoint for Amazon S3 が fstab を使用して S3 バケットを自動的にマウントできるようになりました

[アップデート]Mountpoint for Amazon S3 が fstab を使用して S3 バケットを自動的にマウントできるようになりました

Clock Icon2025.05.31

はじめに

皆様こんにちは、あかいけです。

AWSでは様々なアップデートがありワクワクな日々をお過ごしのことかと思いますが、
2025年5月30日に、Mountpoint for Amazon S3 に関するアップデートが発表されました。

https://aws.amazon.com/about-aws/whats-new/2025/05/mountpoint-amazon-s3-mount-buckets-fstab/

具体的には、
Mountpoint for Amazon S3 が fstab を使用して S3 バケットを自動的にマウントできるようになったとのことです。
この記事では実際に試してみた結果をご紹介していきます。

これまでとアップデート内容

これまでのMountpoint for Amazon S3はfstabをサポートしていなかったため、
再起動した場合などにマウントが解除されてしまいました。
そのため自動マウントしたい場合はユーザー側で以下のような工夫をする必要がありました。

  • crontabでmount-s3を使って起動時にマウントする
  • systemdでmount-s3を使ってマウントするサービスを作る

またロードマップでも以前から要望があったようです。
(普通に考えて必要な機能ですよね…)

https://github.com/orgs/awslabs/projects/84

今回のアップデートにより、そのような設定をすることなくfstabを使えば自動マウントできるようになったため、ユーザー側で考えることが減りました。
素晴らしいですね!

使ってみた

それでは実際に、Mountpoint for Amazon S3 で fstab を設定して使ってみます。

1.環境構築

まずはTerraformで環境を構築します、
以下のコードはSSMセッションマネジャーから接続できるEC2、
またマウント用のS3を作成しています。

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

# Amazon Linux 2023 AMI
data "aws_ami" "amazonlinux_2023" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-2023*-kernel-6.1-x86_64"]
  }
}

data "http" "ipv4_icanhazip" {
  url = "http://ipv4.icanhazip.com/"
}

locals {
  region_code  = "ap-northeast-1"
  az           = "ap-northeast-1a"
  vpc_cidr     = "10.0.0.0/16"
  subnet_cidr  = "10.0.1.0/24"
  name_prefix  = "mountpoint-s3"
  current-ip   = chomp(data.http.ipv4_icanhazip.body)
  allowed-cidr = "${local.current-ip}/32"
}

# VPC - 東京
resource "aws_vpc" "main" {
  cidr_block = local.vpc_cidr

  tags = {
    Name = "${local.name_prefix}-vpc"
  }
}

# パブリックサブネット
resource "aws_subnet" "main" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = local.subnet_cidr
  availability_zone       = local.az
  map_public_ip_on_launch = true

  tags = {
    Name = "${local.name_prefix}-public-subnet"
  }
}

# インターネットゲートウェイ
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${local.name_prefix}-igw"
  }
}

# ルートテーブル
resource "aws_route_table" "main" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }

  tags = {
    Name = "${local.name_prefix}-rt"
  }
}

# ルートテーブルの関連付け
resource "aws_route_table_association" "main" {
  subnet_id      = aws_subnet.main.id
  route_table_id = aws_route_table.main.id
}

# SSMとCloudWatchのためのIAMロール
resource "aws_iam_role" "main" {
  name = "ssm-ec2-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      }
    ]
  })

  tags = {
    Name = "ssm-ec2-role"
  }
}

# SSMポリシーのアタッチ
resource "aws_iam_role_policy_attachment" "ssm" {
  role       = aws_iam_role.main.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

# EC2インスタンスプロファイル
resource "aws_iam_instance_profile" "main" {
  name = "ssm-ec2-instance-profile"
  role = aws_iam_role.main.name
}

# セキュリティグループ
resource "aws_security_group" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${local.name_prefix}-sg"
  }
}

# セキュリティグループ 送信ルール
resource "aws_security_group_rule" "egress" {
  security_group_id = aws_security_group.main.id
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
}

# EC2インスタンス
resource "aws_instance" "main" {
  ami                    = data.aws_ami.amazonlinux_2023.id
  instance_type          = "t3.micro"
  subnet_id              = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.main.id]
  iam_instance_profile   = aws_iam_instance_profile.main.name

  tags = {
    Name = "${local.name_prefix}-ec2"
  }
}

# マウント用S3
resource "aws_s3_bucket" "main" {
  bucket_prefix = "${local.name_prefix}-bucket"
}

# インスタンス SSM接続コマンド
output "ssm_start_session" {
  value = "aws ssm start-session --target ${aws_instance.main.id}"
}

# S3バケット名
output "s3_bucket_arn" {
  value = aws_s3_bucket.main.arn
}
$ terraform apply;

EC2への接続コマンドとS3バケットのマウントポイントは、以下で確認できます。

インスタンス情報 出力
$ terraform output;

2.Mountpoint for Amazon S3の設定

次にMountpoint for Amazon S3でfstabを使う設定をします。
設定手順は以下ドキュメントの通りです。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/mountpoint-installation.html

まずEC2に接続から、パッケージをダウンロードします。

$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm;
--2025-05-31 10:34:45--  https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.217.43.30, 52.217.234.72, 54.231.134.32, ...
Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.217.43.30|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13345104 (13M) [binary/octet-stream]
Saving to: ‘mount-s3.rpm’

mount-s3.rpm                          100%[========================================================================>]  12.73M  5.94MB/s    in 2.1s    

2025-05-31 10:34:48 (5.94 MB/s) - ‘mount-s3.rpm’ saved [13345104/13345104]

あとはインストールするだけです。

$ sudo yum install ./mount-s3.rpm;
Total                                                                                                                  1.1 MB/s |  88 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                               1/1 
  Installing       : fuse-common-3.10.4-1.amzn2023.0.2.x86_64                                                                                      1/3 
  Installing       : fuse-2.9.9-13.amzn2023.0.2.x86_64                                                                                             2/3 
  Installing       : mount-s3-1.18.0-1.x86_64                                                                                                      3/3 
  Running scriptlet: mount-s3-1.18.0-1.x86_64                                                                                                      3/3 
  Verifying        : fuse-2.9.9-13.amzn2023.0.2.x86_64                                                                                             1/3 
  Verifying        : fuse-common-3.10.4-1.amzn2023.0.2.x86_64                                                                                      2/3 
  Verifying        : mount-s3-1.18.0-1.x86_64                                                                                                      3/3 

Installed:
  fuse-2.9.9-13.amzn2023.0.2.x86_64                 fuse-common-3.10.4-1.amzn2023.0.2.x86_64                 mount-s3-1.18.0-1.x86_64                

Complete!

以下のようにバージョンが確認できれば、インストール完了です。

$ mount-s3 --version;
mount-s3 1.18.0

次にfstabの設定ですがAWSの公式ドキュメントにまだ記述がないため、
以下のGithubリポジトリのドキュメントを参照します。

https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md

まずマウント用のフォルダーを作ります。

$ sudo mkdir -p /mnt/mountpoint;

次にfstabを設定します。
以下のコマンドでfstabに設定を追加します、S3バケットのバケット名の部分は作成されたものに置き換えてください。

$ sudo sh -c 'echo "s3://mountpoint-s3-bucket20250531103302910200000001/ /mnt/mountpoint mount-s3 _netdev,nosuid,nodev,rw,allow-other,nofail" >> /etc/fstab'
$ cat /etc/fstab 

#
UUID=43d4a949-6b4f-4cd4-b65b-312d6c2d0aef     /           xfs    defaults,noatime  1   1
UUID=0163-2441        /boot/efi       vfat    defaults,noatime,uid=0,gid=0,umask=0077,shortname=winnt,x-systemd.automount 0 2
s3://mountpoint-s3-bucket20250531103302910200000001/ /mnt/mountpoint mount-s3 _netdev,nosuid,nodev,rw,allow-other,nofail

マウントしてみると、

sudo mount -a
Using 'fstab' style options as detected use of `-o` argument.
bucket mountpoint-s3-bucket20250531103302910200000001 is mounted at /mnt/mountpoint

正常にS3バケットがマウントされています。

$ ls -l /mnt/mountpoint 
total 0
-rw-r--r--. 1 root root 0 May 31 11:24 test.txt

$ df -h /mnt/mountpoint
Filesystem      Size  Used Avail Use% Mounted on
mountpoint-s3   8.0E     0  8.0E   0% /mnt/mountpoint

ファイルの作成なども問題なく実行できます。

$ touch /mnt/mountpoint/test.txt

sudo ls -l /mnt/mountpoint
total 0
drwxr-xr-x. 2 root root 0 May 31 11:20 sample
-rw-r--r--. 1 root root 0 May 31 11:24 test.txt

$ aws s3 ls s3://mountpoint-s3-bucket20250531103302910200000001/
                           PRE sample/
2025-05-31 11:35:42          0 test.txt

次に再起動後に再接続してみると、

$ sudo reboot

ちゃんとマウントされています。

$ ls -l /mnt/mountpoint 
total 0
drwxr-xr-x. 2 root root 0 May 31 11:37 sample
-rw-r--r--. 1 root root 0 May 31 11:35 test.txt

$  df -h /mnt/mountpoint
Filesystem      Size  Used Avail Use% Mounted on
mountpoint-s3   8.0E     0  8.0E   0% /mnt/mountpoint

ユーザーデータで設定してみる

以下ドキュメント上でユーザーデータを使った設定方法が記載されていたため、
こちらも試してみます。

https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md

以下はこの記事の冒頭のTerraformにユーザーデータの設定を追加してものです。

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

# Amazon Linux 2023 AMI
data "aws_ami" "amazonlinux_2023" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-2023*-kernel-6.1-x86_64"]
  }
}

data "http" "ipv4_icanhazip" {
  url = "http://ipv4.icanhazip.com/"
}

locals {
  region_code   = "ap-northeast-1"
  az            = "ap-northeast-1a"
  vpc_cidr      = "10.0.0.0/16"
  subnet_cidr   = "10.0.1.0/24"
  name_prefix   = "mountpoint-s3"
  current-ip    = chomp(data.http.ipv4_icanhazip.body)
  allowed-cidr  = "${local.current-ip}/32"
  s3_folder_key = "sample/"
  s3_mount_path = "/mnt/mountpoint"
}

# VPC - 東京
resource "aws_vpc" "main" {
  cidr_block = local.vpc_cidr

  tags = {
    Name = "${local.name_prefix}-vpc"
  }
}

# パブリックサブネット
resource "aws_subnet" "main" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = local.subnet_cidr
  availability_zone       = local.az
  map_public_ip_on_launch = true

  tags = {
    Name = "${local.name_prefix}-public-subnet"
  }
}

# インターネットゲートウェイ
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${local.name_prefix}-igw"
  }
}

# ルートテーブル
resource "aws_route_table" "main" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }

  tags = {
    Name = "${local.name_prefix}-rt"
  }
}

# ルートテーブルの関連付け
resource "aws_route_table_association" "main" {
  subnet_id      = aws_subnet.main.id
  route_table_id = aws_route_table.main.id
}

# SSMとCloudWatchのためのIAMロール
resource "aws_iam_role" "main" {
  name = "ssm-ec2-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      }
    ]
  })

  tags = {
    Name = "ssm-ec2-role"
  }
}

# SSMポリシーのアタッチ
resource "aws_iam_role_policy_attachment" "ssm" {
  role       = aws_iam_role.main.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

# S3ポリシーのアタッチ
resource "aws_iam_role_policy_attachment" "s3" {
  role       = aws_iam_role.main.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

# EC2インスタンスプロファイル
resource "aws_iam_instance_profile" "main" {
  name = "ssm-ec2-instance-profile"
  role = aws_iam_role.main.name
}

# セキュリティグループ
resource "aws_security_group" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${local.name_prefix}-sg"
  }
}

# セキュリティグループ 送信ルール
resource "aws_security_group_rule" "egress" {
  security_group_id = aws_security_group.main.id
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
}

# EC2インスタンス
resource "aws_instance" "main" {
  ami                    = data.aws_ami.amazonlinux_2023.id
  instance_type          = "t3.micro"
  subnet_id              = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.main.id]
  iam_instance_profile   = aws_iam_instance_profile.main.name
  user_data              = <<-EOF
#!/bin/bash -e

# Install Mountpoint
MP_RPM=$(mktemp --suffix=.rpm)
curl https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm > $MP_RPM

# cloud-init installs conflict with SSM agent: https://github.com/amazonlinux/amazon-linux-2023/issues/397
attempt=0
max_attempts=5
until yum install -y $MP_RPM; do
    attempt=$((attempt + 1))
    if [ $attempt -ge $max_attempts ]; then
        echo "Failed to install mount-s3 after $max_attempts attempts. Exiting."
        exit 1
    fi
    echo "yum install mount-s3 failed (attempt $attempt/$max_attempts), retrying in 3 seconds..."
    sleep 3
done

rm $MP_RPM

# Setup the fstab file and create the mount
MNT_PATH=${local.s3_mount_path}
echo "s3://${aws_s3_bucket.main.id}/ $${MNT_PATH} mount-s3 _netdev,nosuid,nodev,rw,allow-other,nofail" >> /etc/fstab
mkdir --parents $${MNT_PATH}
chmod 777 $${MNT_PATH}

# Mount all filesystems
systemctl daemon-reload
mount -a
EOF

  tags = {
    Name = "${local.name_prefix}-ec2"
  }
}

# マウント用S3
resource "aws_s3_bucket" "main" {
  bucket_prefix = "${local.name_prefix}-bucket"
  force_destroy = true
}

resource "aws_s3_object" "object" {
  bucket = aws_s3_bucket.main.bucket
  key    = local.s3_folder_key
}

# インスタンス SSM接続コマンド
output "ssm_start_session" {
  value = "aws ssm start-session --target ${aws_instance.main.id}"
}

# S3 マウントポイント
output "s3_mount_point" {
  value = "s3://${aws_s3_bucket.main.id}/"
}

ログインして確認するとちゃんとマウントできています。
楽ちんでいいですね。

$ ls -l /mnt/mountpoint 
total 0
drwxr-xr-x. 2 root root 0 May 31 11:48 sample

$ df -h /mnt/mountpoint
Filesystem      Size  Used Avail Use% Mounted on
mountpoint-s3   8.0E     0  8.0E   0% /mnt/mountpoint

さいごに

以上、Mountpoint for Amazon S3のアップデートのご紹介と、実際にfstabで設定してみた結果でした。
元々簡単な設定でEC2にS3をマウントできましたが、今回のアップデートでさらに手軽に利用できるようになったと思います。

EC2でS3を共通フォルダとして利用したい場合など、Mountpoint for Amazon S3の利用を検討してみてはいかがでしょうか。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.