エキサイトのエンジニア岩藤です。
今年エキサイトは脱オンプレサーバーという事で、awsにほぼ全サービスを移行しました。 私も担当の帳票サービス、占いサービスを移行しています。
その際そのままシスステムを移行するのではなく、一部よくない部分の作り替えを行いました。 そのうちの一つが、サーバー上のファイル管理という仕組みです。
今回はこのサーバー上のファイル管理がどう良くないかと、どう変更したかを記述します。
サーバー上のファイル管理とは
そのままで、サーバーにファイルおいてる事です。
$path = "/var/file/data.txt"; //←このファイルがサーバー上にある $line = file_get_contents($path); $result = unserialize($line);
サーバー上でファイル管理するデメリット
色々あるんですが
サーバーが消えたらファイルが消える
これに尽きると思います。
移行した帳票システムでは、数年分の帳票ファイルがサーバー上にのみ置かれていました。 消えていたら何年もの帳票を作り直す必要があり、面倒な事になっていたと思います
サーバー上ファイル管理を止めるには
- S3に移行
- DB管理に変更
うちのチームでは上記の2択で対応し、基本DB管理(API化)にして時間や仕組みの都合上で難しいところはS3を選択しました。
S3管理にするのは簡単なので、帳票システムで変更した時の流れを例として記載します。
仕組みをどう変更したか
- 元処理:帳票PDFをサーバー上に出力する
変更後:帳票PDFをサーバー上に出力。その後、サーバー上の帳票PDFをS3に配置する
元処理:サーバー上のPDFを表示する
- 変更後:S3にある帳票PDFをサーバー上に配置。その後、サーバー上の帳票PDFを表示する
※ファイル管理置き場を、作業用ディレクトリに変更しただけ。
実際にやった事
S3バケットを作成
xxxx-pdf-files
S3バケットに権限を追加
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowVPCAccess", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::xxxx-pdf-files/*", "arn:aws:s3:::xxxx-pdf-files" ], "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-xxxxxxxx” } } } ] }
※パブリックアクセスはすべて ブロック
プログラムを変更
S3にファイルを配置
$bucket = ‘xxx-pdf-files’; system(“aws s3 cp {$filePath}/{$fileName} s3://{$bucket}/{$mediaType}/{$month}/“);
S3からファイルを取得
$bucket = ‘xxx-pdf-files’; system(“aws s3 cp s3://{$bucket}/{$mediaType}/{$month}/{$code}.pdf /var/excite/xxxx/pdf/{$mediaType}/{$month}/“);
現状サーバー上にあるファイルを全てS3にアップ
aws s3 cp pdf/ s3://xxx-pdf-files/ --recursive
※リリースは、サービスを一時停止 > S3に既存ファイルを反映 > プログラムの反映順に行いました。
これで、例えサーバーを作り直してもファイルが消えるような事がなくなりました。
一時ファイルならいいと思いますが、永続的な管理をサーバー上でやるのは危ないので可能なら切替お勧めします。