S3はファイルの格納庫としても使え、静的Webホスティングもできる汎用性のあるサービスですが、S3にアップロード可能なオブジェクトは、いくつかの制限があります。
このドキュメントの中に以下の記述があります。
キー名は一続きの Unicode 文字で、UTF-8 にエンコードすると最大で 1,024 バイト長になります。
S3のオブジェクトに格納するキー名の長さはあまり意識したことがなかったのですが、 簡単なスクリプトをかいて調べてみました。
前提条件
- aws s3コマンド実行できるようにしておく
aws configure
などでアクセストークンやアクセスシークレットを登録しておくといいです
- S3上に検証するためのバケットを用意しておく
スクリプトを実行してみる
境界となる 1024バイト 前後のオブジェクトをアップしてみて検証します。
以下のようなスクリプトを s3_test.rb
という名前で保存して実行します。
私の環境はruby2.4ですが、rubyのバージョンに依存せず実行可能だと思います。
require 'tempfile'
bucket_name = 'バケット名' # 用意しておいたバケット名
under = 'a' * 1023 # 1,023バイト文字列
just = 'b' * 1024 # 1,024バイト文字列
over = 'c' * 1025 # 1,025バイト文字列
Tempfile.create do |f|
puts `aws s3 cp #{f.path} s3://#{bucket_name}/#{under}`
puts `aws s3 cp #{f.path} s3://#{bucket_name}/#{just}`
puts `aws s3 cp #{f.path} s3://#{bucket_name}/#{over}` # エラーになる
end
実行します。
ruby s3_test.rb
a が 1023文字のオブジェクト
と b が 1024文字のオブジェクト
はアップロードできると思います。
c が 1025文字のオブジェクト
をアップロードしようとすると以下のエラーとなります。
An error occurred (KeyTooLongError) when calling the PutObject operation: Your key is too long
ドキュメントどおり 1,024バイト長 のジャストのサイズまではアップロードできましたが、1,025バイト長はエラーとなりました。
補足) S3オブジェクトの階層も含めたフルパスのサイズで 1,024バイト の制限となります
マネジメントコンソール等のでS3のクライアントツールで見たときに以下のような階層をもったファイルの場合、
.
└── dir1/
└── dir2/
└── test.txt
S3の内部的には dir1/dir2/test.txt
というキー名で管理されます。この場合は階層のパスも含めたフルパスのサイズで制限がかかります。そのため、階層が深いファイルも注意が必要です。
まとめ
冒頭にもリンクしている以下の記事には、その他にキー名として利用しても安全な文字列の記述なども書かれていますので合わせて参考にしていただけたらと思います。
パブリッククラウドであるAWSの各サービスは機能も豊富で色々なことが実現可能ですが、 セキュリティやパフォーマンスを考慮したサービスの制限が結構あります。 サービスを使ってできることだけではなく、 利用するサービスにどのような制限があるのかを頭の片隅におきつつ利用していくことが必要ですね。