【Windows Server / Linux】Amazon S3をEC2インスタンスにマウントする方法

記事タイトルとURLをコピーする

こんにちは!技術4課のイーゴリです。

本件の記事では、Amazon S3をEC2インスタンスにマウントする方法をご紹介させて頂きます。

マウントの方法は色々ありますが、本件の記事では、有料のソフトウェアを使わずに、無料のソフトウェアだけで行う方法をご紹介致します。

なお、本件記事のユースケースと注意点を記載しましたので、是非最後まで読んでください。

f:id:swx-korotkov:20220317140328p:plain

使用についての注意点

① S3のマウントはAWS非推奨なので、マウントしたことで起きる事象については自己責任となりますので、ご注意ください。下記のAWS Black Belt Online Seminarの資料をご参考ください。

質問. S3をEC2にマウントした時よりは、EFSの方が早いですか?

回答. s3fsなどのツールを利用してS3をマウントすることは安定性やコストの観点から非推奨としています。共有ファイルシステムが必要であればEFSの利用をご検討ください。

aws.amazon.com

②OS上でS3バケット内のオブジェクトを編集する時に下記の動作が行われているため、トラフィック量にご注意ください。

  1. オブジェクトが完全にダウンロードされます。
  2. サーバー(ローカル)で変更されます。
  3. S3バケットにアップロードされます。

IAMロールの設定(事前準備)

事前にプライベートS3バケットを作成しました。

S3バケットの中身は下記の画面の通りです。

f:id:swx-korotkov:20220314191050p:plain

EC2用のIAMロールを作成する

[AmazonS3FullAccess]のIAMロールの権限が強すぎるため、対象のS3バケット用のIAMロールを作成します。

[サービス]>[IAM]>[ロール]>[ロールを作成]をクリックします。

f:id:swx-korotkov:20220314175355p:plain

[EC2]を選択した上、[次へ]をクリックします。

f:id:swx-korotkov:20220314175414p:plain

「JSON」タブをクリックし、下記のポリシーを貼り付けた上、[次のステップ]をクリックします。

f:id:swx-korotkov:20220314180015p:plain

ポリシー内容

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}

次の画面で[次のステップ]をクリックします。

[ポリシーの確認]画面で、[名前]欄に適切な名前を入力した上、[ポリシーの作成]をクリックします。

f:id:swx-korotkov:20220314180553p:plain

ロール画面で更新ボタンをクリックし、先程作成したポリシーを選択した上、[次へ]をクリックします。

f:id:swx-korotkov:20220314181941p:plain f:id:swx-korotkov:20220314182037p:plain

[ロール名]で適切な名前を入力し、[ロールを作成]をクリックします。

f:id:swx-korotkov:20220314182336p:plain f:id:swx-korotkov:20220314182429p:plain

EC2にIAMロールを付与する

[サービス]>[EC2]>対象インスタンスを選択し、[アクション]ボタンか右ボタンのどちらかをクリックし、[セキュリティ]→[IAM ロールを変更]をクリックします。

f:id:swx-korotkov:20220314182855p:plain

[IAM ロールを変更]の画面で、先程作成したIAMロールを選択した上、[保存]をクリックします。

f:id:swx-korotkov:20220314182652p:plain

AWS EC2 WindowsインスタンスにAmazon S3をマウントする方法

Windowsサーバーの場合、RCloneを使用します。

Rcloneのインストール

github.com

Disk Cで「S3」のフォルダを作成します。

PS C:\Users\Administrator> mkdir C:\S3


    ディレクトリ: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2022/03/14     17:05                S3

適切なRcloneのバージョンをダウンロードし、ダウンロードされたZIPを解凍します。

rclone.org

f:id:swx-korotkov:20220314171535p:plain

rclone.exeをC:\S3に移動します。

Rcloneの設定

PowerShellで下記のコマンドを実行します。

PS C:\Users\Administrator> cd C:\S3\
PS C:\S3> .\rclone.exe config

f:id:swx-korotkov:20220314172149p:plain

コンフィグがないため、「n」を入力し、「Enter」をクリックします。

この記事ではNameで「test」を入力し、「Enter」をクリックします。

下記の画面で、Amazon S3を選択したいため、一覧から「4」を入力し、「Enter」をクリックします。

f:id:swx-korotkov:20220314173438p:plain

 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, SeaweedFS, and Tencent COS
   \ "s3"

f:id:swx-korotkov:20220314173726p:plain

上記の画面が表示されるので、「1」を入力し、「Enter」をクリックします。

 1 / Amazon Web Services (AWS) S3
   \ "AWS"

次はOption env_auth.を設定します。

AWSのベストプラクティスはIAMロールを使用することなので、「2」(true)を入力し、「Enter」をクリックします。

f:id:swx-korotkov:20220314174153p:plain

 2 / Get AWS credentials from the environment (env vars or IAM).
   \ "true"
access_key_id>【Enter】をクリックします。

secret_access_key>【Enter】をクリックします。

次の画面でリージョンを選択します。

f:id:swx-korotkov:20220314184310p:plain

今回の記事では、S3が東京リージョンにあるため、「14」を入力し、「Enter」をクリックします。

region> 14【Enter】をクリックします。
endpoint>【Enter】をクリックします。

なぜかまた同じ14(東京リージョン)を選ばないといけないため、同じく「14」を入力し、実施します。

location_constraint> 14【Enter】をクリックします。

今回の記事では、「Default」で良いので、「1」を入力し、「Enter」をクリックします。

   / Owner gets FULL_CONTROL.
 1 | No one else has access rights (default).
   \ "private"

f:id:swx-korotkov:20220314185143p:plain

今回の記事では、S3の暗号化がないため、次の画面で「1」(暗号化なし)を入力し、「Enter」をクリックします。

Option server_side_encryption.
The server-side encryption algorithm used when storing this object in S3.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value.
 1 / None
   \ ""
 2 / AES256
   \ "AES256"
 3 / aws:kms
   \ "aws:kms"
server_side_encryption> 1 【Enter】をクリックします。

次の画面で同じく「1」(暗号化なし)を入力し、「Enter」をクリックします。

f:id:swx-korotkov:20220314185623p:plain

下記の画面でS3にオブジェクトをアップロードした後で、どのストレージクラスに移動されるかの設定となります。 今回の記事では、「Default」で良いので、「1」(Default)を入力し、「Enter」をクリックします。

f:id:swx-korotkov:20220314185849p:plain

次の画面で、「n」を入力し、「Enter」をクリックします。

Edit advanced config?
y) Yes
n) No (default)
y/n> n【Enter】をクリックします。

次の画面で、確認情報が表示されますので、確認した上、「y」を入力します。

--------------------
[test]
type = s3
provider = AWS
env_auth = true
region = ap-northeast-1
location_constraint = ap-northeast-1
acl = private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y【Enter】をクリックします。

次の画面で、「q」を入力します。

Current remotes:

Name                 Type
====                 ====
test                 s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
PS C:\S3>

f:id:swx-korotkov:20220314190436p:plain

Rcloneが正常に動いているか確認するために、下記のコマンドを実施します。

例:
.\rclone.exe ls <コンフィグ名>:<バケット名>
PS C:\S3> .\rclone.exe ls test:test-s3-bucket-123456
        5 1.txt
        5 2
PS C:\S3>

f:id:swx-korotkov:20220314190910p:plain

WinFSPのインストール

Windows OS上でS3バケットがローカルディスクとしてまだ表示されていないので、WinFSPをインストールします。

WinFSPをダウンロードします。

f:id:swx-korotkov:20220315111742p:plain

winfsp.dev

S3バケットのマウント

下記のコマンドを実施します。

コマンド例

 <Rcloneまでのパス>\rclone.exe mount <コンフィグ名>:<バケット名> <ドライブレター>: --vfs-cache-mode full

今回の記事では、下記のコマンドとなります。

 C:\\S3\rclone.exe mount test:test-s3-bucket-123456 X: --vfs-cache-mode full

f:id:swx-korotkov:20220315114011p:plain

下記のようにS3バケットが表示されるようになりました。

f:id:swx-korotkov:20220315114442p:plain

中身も見られます。

f:id:swx-korotkov:20220315114506p:plain

f:id:swx-korotkov:20220315114522p:plain

上記の設定だと、サーバーを再起動すると、自動的にマウントされないため、下記の設定を行います。

f:id:swx-korotkov:20220315120031p:plain

Windows起動時に自動的にS3バケットをマウントする(任意)

「s3-sync.cmd」(他の名前でも問題ない)のファイルを作成し、マウントのコマンドを入力します。

f:id:swx-korotkov:20220315121117p:plain

[s3-sync.cmd]を[C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp]に移動します。

完了です!

上記のマウントのデメリットとしてはサーバーを起動する時に下記の画面が表示されます。

f:id:swx-korotkov:20220315121700p:plain

f:id:swx-korotkov:20220315114442p:plain

下記の窓を閉じるとS3バケットがアンマウントされてしまいますので、窓を閉じたい場合、[X]を押すのではなく、[–]をクリックしないといけないため、ちょっと不便かもしれません。

f:id:swx-korotkov:20220315121700p:plain

起動時にCMDの画面が表示されないように、下記の対策方法がありますが、未検証です。

  • PowerShellの「-WindowStyle Hidden」の仕組み(Powershellコマンドをタスクスケジューラに入れる)
  • バッチファイル(.bat)を最小化した状態で起動する
  • VBSというスクリプト言語を使用し、コマンドプロンプト画面に表示せずに実行

動作確認 (Windows Server)

試しにWindows ServerのEC2を再起動します。

PS C:\Users\Administrator> Restart-Computer -Force

サーバーを再起動してもS3バケットがOS上で表示されるようになります。

f:id:swx-korotkov:20220315114442p:plain

オブジェクトの書き込み・読み込み

PS C:\Users\Administrator> New-Item -Path X:\ -Name "testfile1.txt" -ItemType "file" -Value "TEST111"


    ディレクトリ: X:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------       2022/03/16     17:28              7 testfile1.txt


PS C:\Users\Administrator>

f:id:swx-korotkov:20220316173502p:plain

AWS EC2 LinuxインスタンスにAmazon S3をマウントする方法

S3用のディレクトリを作成します。

$ mkdir s3

s3fs-fuseのインストール

GitHubのドキュメンテーションは下記となります。

github.com

上記の手順の通り、適切なLinux版を選びます。今回の記事では、Amazon Linux 2のため、下記のコマンドを実行します。

$ sudo amazon-linux-extras install epel -y
$ sudo yum install s3fs-fuse -y

補足: インストール途中で何回か「y」を押さないといけないため、上記のコマンドに「-y」を追加しました。

S3バケットのマウント

マウントのコマンドの例

s3fs -o iam_role=auto -o endpoint=<AWSリージョン> -o url="https://s3-<AWSリージョン>.amazonaws.com" <S3バケット名> <対象ディレクトリ>

今回の記事では、下記のコマンドを実行します。

$ s3fs -o iam_role=auto -o endpoint=ap-northeast-1 -o url="https://s3-ap-northeast-1.amazonaws.com" test-s3-bucket-123456 /home/ec2-user/s3

S3ディレクトリの中身を読み込んでみますと、S3バケットのオブジェクトが見られるようになりました。

$ ll s3
total 1
-rw-r----- 1 ec2-user ec2-user 5 Mar 14 05:52 1.txt
-rw-r----- 1 ec2-user ec2-user 5 Mar 14 05:52 2 

df -hコマンドでS3バケットの容量が見られます。S3バケットの容量が16 エクサバイト(16 000 ペタバイト)になっていますね。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        462M     0  462M   0% /dev
tmpfs           471M     0  471M   0% /dev/shm
tmpfs           471M  460K  470M   1% /run
tmpfs           471M     0  471M   0% /sys/fs/cgroup
/dev/nvme0n1p1  8.0G  1.6G  6.5G  20% /
tmpfs            95M     0   95M   0% /run/user/1000
tmpfs            95M     0   95M   0% /run/user/0
s3fs             16E     0   16E   0% /home/ec2-user/s3

Linux起動時に自動的にS3バケットをマウントする(任意)

fstabで下記の設定を行います。

$ vi /etc/fstab

例:

s3fs#<S3バケット名> <対象ディレクトリ> fuse allow_other,nonempty,use_path_request_style,iam_role=auto,url=https://s3-<AWSリージョン>.amazonaws.com,endpoint=<AWSリージョン> 0 0

今回の記事では、下記のコマンドを実行します。

s3fs#test-s3-bucket-123456 /home/ec2-user/s3 fuse allow_other,nonempty,use_path_request_style,iam_role=auto,url=https://s3-ap-northeast-1.amazonaws.com,endpoint=ap-northeast-1 0 0

動作確認 (Amazon Linux 2)

試しにAmazon Linux 2のEC2を再起動します。

$ sudo reboot now
[ec2-user@ip-10-123-10-56 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        462M     0  462M   0% /dev
tmpfs           471M     0  471M   0% /dev/shm
tmpfs           471M  440K  470M   1% /run
tmpfs           471M     0  471M   0% /sys/fs/cgroup
/dev/nvme0n1p1  8.0G  1.6G  6.5G  20% /
s3fs             16E     0   16E   0% /home/ec2-user/s3
tmpfs            95M     0   95M   0% /run/user/1000
[ec2-user@ip-10-123-10-56 ~]$ ll s3
total 1
-rw-r----- 1 root root 5 Mar 14 05:52 1.txt
-rw-r----- 1 root root 5 Mar 14 05:52 2
[ec2-user@ip-10-123-10-56 ~]$ 

f:id:swx-korotkov:20220316170939p:plain

S3バケット内のオブジェクトも読み込みや書き込みなどができます。

オブジェクトの読み込み確認

[ec2-user@ip-10-123-10-56 ~]$ sudo cat s3/1.txt 
TEXT1
[ec2-user@ip-10-123-10-56 ~]$ sudo cat s3/2
TEXT2
[ec2-user@ip-10-123-10-56 ~]$ 

オブジェクトの書き込み確認

[ec2-user@ip-10-123-10-56 ~]$ sudo touch s3/3
[ec2-user@ip-10-123-10-56 ~]$ ll s3
total 2
-rw-r----- 1 root root 5 Mar 14 05:52 1.txt
-rw-r----- 1 root root 5 Mar 14 05:52 2
-rw-r--r-- 1 root root 0 Mar 16 08:13 3
[ec2-user@ip-10-123-10-56 ~]$ 

考えられるユースケース

  • ファイル(ログなど)をサーバーからS3にアップロードする処理
  • ファイル(ログなど)をS3からサーバーにダウンロードする処理

大きなファイルを変更する処理のために、他のAWSサービスを使ったほうがいいです。

以上、御一読ありがとうございました。

イーゴリ (記事一覧)

クラウドインテグレーション部・技術4課・エンジニア

特にTerraform(自動化)、ネットワーク系、VDI、Windows Serverに興味があります

日本国内旅行・ドライブが好きです