最近までセキュリティ向上プロジェクトとして、AWSのストレージ暗号化をすすめてきました。S3バケットの暗号化を行う必要があり、デフォルト暗号化を有効化しています。 このデフォルト暗号化により、アップロード時の暗号化を指定しなくてもS3バケットにファイルを置くと自動的に暗号化されるようになります。
- S3 バケットの Amazon S3 デフォルト暗号化 - Amazon Simple Storage Service
- Amazon S3がファイル格納時のデフォルト暗号化に対応しました | Developers.IO
暗号化で最も気になる一つがパフォーマンスです。
暗号化処理は重い処理なので、パフォーマンスが落ちることを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)
サイズ | 暗号化なし(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)
サイズ | 暗号化なし(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)
サイズ | 暗号化なし(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)
サイズ | 暗号化なし(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以上)をアップロードするかどうかを調べて影響が無いことを確認されると良いと思います。