本日も乙

ただの自己満足な備忘録。

S3デフォルト暗号化によるパフォーマンスを検証してみた

最近までセキュリティ向上プロジェクトとして、AWSのストレージ暗号化をすすめてきました。S3バケットの暗号化を行う必要があり、デフォルト暗号化を有効化しています。 このデフォルト暗号化により、アップロード時の暗号化を指定しなくてもS3バケットにファイルを置くと自動的に暗号化されるようになります。

暗号化で最も気になる一つがパフォーマンスです。
暗号化処理は重い処理なので、パフォーマンスが落ちることをAWSの人も言っています。

ではデフォルト暗号化を有効にすることでどのぐらい影響するのかを調べてみました。

実行環境

  • EC2(m4.xlarge)
    • ネットワーク帯域が十分にあり、EC2インスタンスによる性能の差がでないようにします
  • S3 VPC Endpoint設定済
    • EC2からS3までのネットワークによる差が極力出ないようにします
  • S3バケット
    • test-not-encrytion ・・・ 暗号化なし
    • test-encrytption ・・・ デフォルト暗号化(SSE-S3)

デフォルト暗号化には、Amazon S3側で管理された暗号化キーによるサーバサイドの暗号化(SSE-S3) とKMSによるサーバサイドの暗号化(SSE-KMS)、ユーザ側で管理された暗号化キーによるサーバサイドの暗号化(SSE-C)があります。

今回はSSE-S3を採用しているのは以下の理由からです。

  • SSE-KMSだとKMSの1秒あたりのAPIリクエスト制限に達する可能性がある。とくに頻繁にGetObject/PutObjectするような機構があると辛くなりそう
  • 自前で暗号化キーを管理しなくない(そこまでのセキュリティを求められていない)

ベンチマークスクリプト

https://gist.github.com/mirakui/481210 をフォークして改良しました。

https://gist.github.com/ohsawa0515/02d96fb7c1d4fac33a14d1080d567438

aws-sdk v2を使うようにしたのと、リージョン、S3バケット、ファイルサイズを引数で渡せるようにしました。 100MBのファイルを生成し、Upload(PutObject)、Download(GetObjcet)、Exists(HeadObject)、Delete(DeleteObject)をそれぞれ10回試行しました。

ベンチマーク結果

Upload(PutObject)

s3-put-object.png

サイズ 暗号化なし(sec) 暗号化あり(sec)
10KB 0.060677 0.069339
20KB 0.072767 0.068752
50KB 0.094733 0.084935
1MB 0.131984 0.146831
10MB 0.433136 0.578771
100MB 2.388148 3.651379

10MBを超えてくると差が顕著になる。

Download(GetObject)

s3-get-object.png

サイズ 暗号化なし(sec) 暗号化あり(sec)
10KB 0.00034 0.000332
20KB 0.00034 0.000337
50KB 0.000352 0.000357
1MB 0.00035 0.00036
10MB 0.000358 0.000353
100MB 0.000368 0.000364

ファイルサイズに比例しているが、暗号化あり・なしとの差はほとんどない。

FIle Exists(HeadObject)

s3-head-object.png

サイズ 暗号化なし(sec) 暗号化あり(sec)
10KB 0.010222 0.010703
20KB 0.011572 0.013499
50KB 0.011167 0.013441
1MB 0.012346 0.013179
10MB 0.010698 0.012747
100MB 0.011086 0.011909

暗号化ありの方が遅くなっているが、 0.001秒台のレベルなのでレスポンスにシビアでなければあまり問題にならない。

Delete(DeleteObject)

s3-delete-object.png

サイズ 暗号化なし(sec) 暗号化あり(sec)
10KB 0.018001 0.018032
20KB 0.015107 0.015239
50KB 0.014782 0.01662
1MB 0.014203 0.014763
10MB 0.017183 0.017289
100MB 0.028445 0.015385

暗号化あり・なしでほとんど差が見られない。

結論

サイズが大きいファイルをS3にアップロードする場合にパフォーマンスに影響がでる可能性が高いことがわかりました。
Head, Get, Deleteはファイルサイズや暗号化あり・なしにかかわらずパフォーマンスにほとんど差が出ないことがわかりました。
S3デフォルト暗号化を設定する際は大きいファイルサイズ(100MB以上)をアップロードするかどうかを調べて影響が無いことを確認されると良いと思います。