こんにちは!技術4課のイーゴリです。
本件の記事では、Amazon S3をEC2インスタンスにマウントする方法をご紹介させて頂きます。
マウントの方法は色々ありますが、本件の記事では、有料のソフトウェアを使わずに、無料のソフトウェアだけで行う方法をご紹介致します。
なお、本件記事のユースケースと注意点を記載しましたので、是非最後まで読んでください。
- 使用についての注意点
- IAMロールの設定(事前準備)
- AWS EC2 WindowsインスタンスにAmazon S3をマウントする方法
- AWS EC2 LinuxインスタンスにAmazon S3をマウントする方法
- 考えられるユースケース
使用についての注意点
① S3のマウントはAWS非推奨なので、マウントしたことで起きる事象については自己責任となりますので、ご注意ください。下記のAWS Black Belt Online Seminarの資料をご参考ください。
質問. S3をEC2にマウントした時よりは、EFSの方が早いですか?
回答. s3fsなどのツールを利用してS3をマウントすることは安定性やコストの観点から非推奨としています。共有ファイルシステムが必要であればEFSの利用をご検討ください。
②OS上でS3バケット内のオブジェクトを編集する時に下記の動作が行われているため、トラフィック量にご注意ください。
- オブジェクトが完全にダウンロードされます。
- サーバー(ローカル)で変更されます。
- S3バケットにアップロードされます。
IAMロールの設定(事前準備)
事前にプライベートS3バケットを作成しました。
S3バケットの中身は下記の画面の通りです。
EC2用のIAMロールを作成する
[AmazonS3FullAccess]のIAMロールの権限が強すぎるため、対象のS3バケット用のIAMロールを作成します。
[サービス]>[IAM]>[ロール]>[ロールを作成]をクリックします。
[EC2]を選択した上、[次へ]をクリックします。
「JSON」タブをクリックし、下記のポリシーを貼り付けた上、[次のステップ]をクリックします。
ポリシー内容
{ "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:::バケット名/*" ] } ] }
次の画面で[次のステップ]をクリックします。
[ポリシーの確認]画面で、[名前]欄に適切な名前を入力した上、[ポリシーの作成]をクリックします。
ロール画面で更新ボタンをクリックし、先程作成したポリシーを選択した上、[次へ]をクリックします。
[ロール名]で適切な名前を入力し、[ロールを作成]をクリックします。
EC2にIAMロールを付与する
[サービス]>[EC2]>対象インスタンスを選択し、[アクション]ボタンか右ボタンのどちらかをクリックし、[セキュリティ]→[IAM ロールを変更]をクリックします。
[IAM ロールを変更]の画面で、先程作成したIAMロールを選択した上、[保存]をクリックします。
AWS EC2 WindowsインスタンスにAmazon S3をマウントする方法
Windowsサーバーの場合、RCloneを使用します。
Rcloneのインストール
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.exeをC:\S3に移動します。
Rcloneの設定
PowerShellで下記のコマンドを実行します。
PS C:\Users\Administrator> cd C:\S3\ PS C:\S3> .\rclone.exe config
コンフィグがないため、「n」を入力し、「Enter」をクリックします。
この記事ではNameで「test」を入力し、「Enter」をクリックします。
下記の画面で、Amazon S3を選択したいため、一覧から「4」を入力し、「Enter」をクリックします。
4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, SeaweedFS, and Tencent COS \ "s3"
上記の画面が表示されるので、「1」を入力し、「Enter」をクリックします。
1 / Amazon Web Services (AWS) S3 \ "AWS"
次はOption env_auth.を設定します。
AWSのベストプラクティスはIAMロールを使用することなので、「2」(true)を入力し、「Enter」をクリックします。
2 / Get AWS credentials from the environment (env vars or IAM). \ "true"
access_key_id>【Enter】をクリックします。 secret_access_key>【Enter】をクリックします。
次の画面でリージョンを選択します。
今回の記事では、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"
今回の記事では、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」をクリックします。
下記の画面でS3にオブジェクトをアップロードした後で、どのストレージクラスに移動されるかの設定となります。 今回の記事では、「Default」で良いので、「1」(Default)を入力し、「Enter」をクリックします。
次の画面で、「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>
Rcloneが正常に動いているか確認するために、下記のコマンドを実施します。
例: .\rclone.exe ls <コンフィグ名>:<バケット名>
PS C:\S3> .\rclone.exe ls test:test-s3-bucket-123456 5 1.txt 5 2 PS C:\S3>
WinFSPのインストール
Windows OS上でS3バケットがローカルディスクとしてまだ表示されていないので、WinFSPをインストールします。
WinFSPをダウンロードします。
S3バケットのマウント
下記のコマンドを実施します。
コマンド例
<Rcloneまでのパス>\rclone.exe mount <コンフィグ名>:<バケット名> <ドライブレター>: --vfs-cache-mode full
今回の記事では、下記のコマンドとなります。
C:\\S3\rclone.exe mount test:test-s3-bucket-123456 X: --vfs-cache-mode full
下記のようにS3バケットが表示されるようになりました。
中身も見られます。
上記の設定だと、サーバーを再起動すると、自動的にマウントされないため、下記の設定を行います。
Windows起動時に自動的にS3バケットをマウントする(任意)
「s3-sync.cmd」(他の名前でも問題ない)のファイルを作成し、マウントのコマンドを入力します。
[s3-sync.cmd]を[C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp]に移動します。
完了です!
上記のマウントのデメリットとしてはサーバーを起動する時に下記の画面が表示されます。
下記の窓を閉じるとS3バケットがアンマウントされてしまいますので、窓を閉じたい場合、[X]を押すのではなく、[–]をクリックしないといけないため、ちょっと不便かもしれません。
起動時にCMDの画面が表示されないように、下記の対策方法がありますが、未検証です。
- PowerShellの「-WindowStyle Hidden」の仕組み(Powershellコマンドをタスクスケジューラに入れる)
- バッチファイル(.bat)を最小化した状態で起動する
- VBSというスクリプト言語を使用し、コマンドプロンプト画面に表示せずに実行
動作確認 (Windows Server)
試しにWindows ServerのEC2を再起動します。
PS C:\Users\Administrator> Restart-Computer -Force
サーバーを再起動してもS3バケットがOS上で表示されるようになります。
オブジェクトの書き込み・読み込み
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>
AWS EC2 LinuxインスタンスにAmazon S3をマウントする方法
S3用のディレクトリを作成します。
$ mkdir s3
s3fs-fuseのインストール
GitHubのドキュメンテーションは下記となります。
上記の手順の通り、適切な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 ~]$
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サービスを使ったほうがいいです。
以上、御一読ありがとうございました。
本田 イーゴリ (記事一覧)
カスタマーサクセス部
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE
趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽