つれづれブログ

ただ思いのままに書き綴る

IT

AWS EC2とS3を連携させる

投稿日:2018年5月25日 更新日:

EBS上にある静的ファイルをS3に退避したい

AWSでEC2インスタンスを運用している場合に、こんなことで困ったことはありませんか?

  • EBS上に置いているファイルを別のインスタンスでも参照したい
  • EC2インスタンスを停止してもファイルだけ残しておきたい
  • EBS上の容量を節約したい

ログや計算結果データ、バックアップなどの静的データであればS3に移行することで、これらの問題を解決できます。

 

awsコマンドによるS3連携

EC2インスタンスにAmazon Linuxを採用している場合、デフォルトでawsコマンドがインストールされているので、簡単にEC2とS3を連携させることができます。

詳しくは、「AWS command Line interface での高レベルのS3コマンドの使用」を参照

ただし、この方法には以下の2つの制約があります。

  • AWS CLIがインストールされていること

  • 通常のファイルシステムとして扱うことができない

特に二つ目の 通常のファイルシステムとして扱えないということは、アプリケーションからファイル操作できないということになります。

もし通常のファイル操作と同様にS3を扱いたいのであれば次に紹介する方法が有効でしょう。

 

s3fs によるS3連携

s3fsを使えば、S3をファイルシステムとしてEC2にマウントできるので、通常のファイル操作がそのまま実現できます。

AWS CLIがインストールできない環境や、EC2インスタンスで走らせているアプリケーションからファイルアクセスする場合は有効です。

s3fsのセットアップについては、これらのサイトを参考にさせていただいています。

EC2インスタンスにS3をマウントして使用する(IAM Role ver)

EC2インスタンスにS3をマウントする

 

s3fsをインストールする

以下の手順でインストールを進めていきましょう。


 

EC2インスタントは作成済み。 Amzon Linux AMI x86_64 HVM

マウントするS3バケットを作成する。

s3fsをEC2インスタンスにインストールする。

$ sudo yum -y update
$ sudo yum install -y libxml2-devel libcurl-devel fuse fuse-devel openssl-devel gcc-c++ automake git
$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

 

EC2からS3へアクセスするための設定をする

S3にアクセスするためのIAMロールを作成する。

EC2インスタンスにロールを割り当てる。

s3fsのマウントポイントをEC2インスタンスに作成する。

例えばこんな感じ。

$ sudo mkdir /mnt/s3fs

最後にEC2のコンソールからマウント実行する。

$ sudo /usr/local/bin/s3fs ec2-site-backup /mnt/s3fs -o rw,allow_other,uid=500,gid=500,default_acl=public-read,iam_role=(IAMで設定したS3アクセスのためのロール名)

ここまでで設定完了。

 

マウント状態を確認する。

成功していれば、コマンドラインから通常のファイルシステムと同様に参照できるはず。

$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 488M 56K 488M 1% /dev
tmpfs 497M 0 497M 0% /dev/shm
/dev/xvda1 16G 6.3G 9.3G 41% /
s3fs 256T 0 256T 0% /mnt/s3fs

 

マウントが成功したらマウント時のコマンドを次のファイルに書き込んでおく。

書き込み先のファイル→  /etc/rc.local

書き込む内容↓

/usr/local/bin/s3fs ec2-site-backup /mnt/s3fs -o rw,allow_other,uid=500,gid=500,default_acl=public-read,iam_role=(IAMで設定したS3アクセスのためのロール名)

これで、EC2インスタンスの再起動時に自動でS3バケットがマウントポイントにマウントされる。

 

うまくいかないときは

まずは、次のような間違いがないか確認。

  • マウント時に指定したロール名が誤っている。
  • マウント時に指定したバケット名が誤っている。
  • 対象のEC2インスタンスにロールの割り当てができていない。

それでもマウントに失敗したらシステムのメッセージログを参照してみよう。

$ sudo tail /var/log/messages

マウント時のエラーメッセージが記録されているので、それを手がかりにトラブルシュートしていく。

 

-IT
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

WordPress と S3の連携でハマった

WordPress サーバーへのアクセス対策をCDNで 運用しているWordPressサーバーへのアクセスが増えてきたので そろそろ負荷対策を考えなければ!ということでCDNの導入を検討しました。 A …