サーバー上のファイル管理を、S3管理に変更しました

エキサイトのエンジニア岩藤です。

今年エキサイトは脱オンプレサーバーという事で、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に既存ファイルを反映 > プログラムの反映順に行いました。

これで、例えサーバーを作り直してもファイルが消えるような事がなくなりました。

一時ファイルならいいと思いますが、永続的な管理をサーバー上でやるのは危ないので可能なら切替お勧めします。