セルフホスト型LiveAgentライセンスのオーナーは、Configuration(設定)->System(システム)->Plugins(プラグイン)からAmazon S3 File Archiveを有効化することで、ホスティングデータベースの容量を節約できます。

このプラグインは、チケットの添付ファイルが作成されてからX日後に、その添付ファイルをデータベースからAmazonストレージに移動します。これにより、データベースをスリムに保つことができます。添付ファイルはデータベース上にあるときと同様に、LiveAgentからアクセスしてダウンロードすることができますが、ホスティング/サーバーのスペースを占有しません。

プラグインを有効化して設定すると、LiveAgentはcronタスクによってバックグラウンドでデータの移動を静かに開始します。通常通りLiveAgentを使い続けることができ、あとはアプリケーションが処理を行います。

AWS S3の設定

AWS S3の設定では、ユーザーの作成、バケットの作成、およびユーザーへのバケット権限の付与が必要です。

新しいユーザーを作成する際は、User name(ユーザー名)を入力し、Access type(アクセスタイプ)としてProgrammatic access(プログラムによるアクセス)を選択するだけです。

作成ウィザードの最後に、Show(表示)をクリックしてユーザーのSecret access key(シークレットアクセスキー)をコピーします。後からコピーすることはできないため、その場合は新しいアクセスキーを作成する必要があります。

ユーザーのサマリーページでUser ARNをコピーして保存します。これは後でPolicy generator(ポリシージェネレーター)で使用します。

バケットはサーバーの場所に地理的に近いリージョンに作成してください。その他のオプションはデフォルトのままで構いません。

Permissions(権限)> Bucket Policy(バケットポリシー)でBucket ARNをコピーし、Policy generatorのリンクをクリックします。

Policy generatorで、Principal(プリンシパル)フィールドにUser ARNを入力し、Amazon Resource NameフィールドにBucket ARNと’/*‘を追加して入力します(バケットARNが「arn:aws:s3::liveagentaws」の場合、このフィールドには「arn:aws:s3::liveagentaws/*」と入力します。これはバケット内のすべてのオブジェクトにこのポリシーが適用されることを意味します)。Actions(アクション)ではGetObjectPutObjectの2項目を選択します。その他のフィールドは下の画像のように入力してください。次にAdd statement(ステートメントを追加)をクリックし、Generate policy(ポリシーを生成)をクリックします。

生成されたポリシーは小さなポップアップフォームに表示されます。そのポリシーをBucket policy(バケットポリシー)の設定セクションにコピーしてください。

プラグインの設定

Access Key(アクセスキー)とSecret Key(シークレットキー)- AmazonコンソールのServices->IAM->Usersでユーザーを作成する際に取得します。

Files Bucket Name(ファイルバケット名)- ファイルを保存するAmazonバケットの名前です。コンソールのServices->S3->Create bucketからバケットを作成する際に取得します。(ファイルをAWS S3に移動しない場合は空欄にしてください。)

Mails Bucket Name(メールバケット名)- メールを保存するAmazonバケットの名前です。コンソールのServices->S3->Create bucketからバケットを作成する際に取得します。(メールをAWS S3に移動しない場合は空欄にしてください。)

Messages Bucket Name(メッセージバケット名)- メッセージの内容を保存するAmazonバケットの名前です。コンソールのServices->S3->Create bucketからバケットを作成する際に取得します。(メッセージの内容をAWS S3に移動しない場合は空欄にしてください。)

Client version(クライアントバージョン)- 特に理由がなければlatest(最新)のままにしてください。

Region(リージョン)- バケットに選択したリージョンのコードを取得する必要があります。リージョンコードはhttps://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionで検索できます。

Time to store files locally [hours](ファイルをローカルに保存する時間〔時間単位〕)- ファイルをAmazonに移動する前に、ホスティング/サーバーのデータベースに保持しておく時間です。頻繁にアクセスしなくなると予想される時間より少し後に設定するとよいでしょう。

Min file size [bytes](最小ファイルサイズ〔バイト単位〕)- 指定したサイズより大きいファイルのみAmazonに移動されます。

デフォルトでは、Amazonは128kBごとに課金するため、この制限を131072B(128kB)より小さい値に設定して小さなファイルをAmazonストレージに移動した場合でも、128kBとして課金されます。ただし、自身のホスティング/サーバーにデータを保存するよりも大幅にコストが低くなる場合があります。

注意:チケットや添付ファイルがすでにデータベースに作成された後でこのオプションを有効にした場合、qu_g_file_contentsデータベーステーブルに対して最適化タスクを実行しないと、ハードドライブの空き容量は実際には解放されません。メッセージの内容がMySQLデータベースに存在しなくなった場合、チケットを検索する唯一の方法はelasticsearchを使用することになります(すべてのチケットはelasticsearchでインデックスされています)。elasticsearchがない場合、検索はMySQLデータベースにメッセージが残っている最新のチケットにのみ機能します。

AWS S3ストレージの使用を停止する場合は、チケットのメッセージとファイルの内容をデータベースに戻すバックグラウンドタスクのアーカイブ解除を手動で計画する必要があります。サポートが必要な場合はお問い合わせください(www.liveagent.jp)。

S3ストレージの構造

ファイルの内容

ファイルの内容は、以下のパスにシンプルなバイナリファイルとして保存されます。

{filecontents_bucket}/{database_name}/{fileid}

{fileid}は、データベーステーブルqu_g_filesfileidカラムの値と一致する32文字の英数字です。

メールメッセージ

受信したメールのソースは、以下のパスにテキストファイルとして保存されます。

{messagesources_bucket}/{database_name}/{messageid}

{messageid}は、テーブルqu_g_mail_messagesmessageidカラムの値と一致する整数型の識別子です。

チケットメッセージ

チケットメッセージは3種類の中で最も複雑です。メッセージの保存方法については複数の変更が加えられてきましたが、保存データ量が多いためこれらのストレージ形式間での変換や移行が困難であったことから、すべてのストレージ形式を処理できるよう修正されたアプリケーションのソースコードが開発されました。

最も古い形式では、チケットメッセージは以下のパスにプレーンテキストとして保存されます。

{messages_bucket}/{database_name}/conversation_{conversationid}/{message_groupid}/{messageid}

{conversationid}{message_groupid}{messageid}は、テーブルqu_la_messagesの対応するカラムの値です。

2番目の形式では、同じメッセージグループのすべてのメッセージの内容がJSONファイルにまとめて保存されます。ファイルは以下のパスに保存されます。

{messages_bucket}/{database_name}/conversation_{conversationid}/{message_groupid}.json

JSONの構造は以下の通りです。

{
  "message1id"::message1content",
  "message2id":"message2content"
}

message1idはテーブルqu_la_messagesmessageidカラムの値に対応し、message1contentはメッセージの内容です(データベースカラムqu_la_messages.messageは空に設定されています)。

現在使用されている形式は、前の形式と同様にJSONエンコードされていますが、さらにAES256暗号を使用してJSONファイル全体が暗号化されています。S3ストレージへのアクセスが万が一発生した場合でも攻撃者が解読しにくいよう、各JSONファイルはわずかに異なるキーで暗号化されています(ただし、そのような可能性は非常に低いと考えられます)。各JSONファイルのキーは、メッセージ、message_group、conversationの複数の属性と、サーバーのファイルシステムに保存された設定から生成されます。暗号化されたJSONファイルが保存されるパスも若干異なります。

{messages_bucket}/{database_name}/c_{conversationid}/{message_groupid}.encoded