アプリケーションから S3 へのアップロード速度が非常に遅いことに対処しています。Elastic Beanstalk 上の単一の Docker 環境で実行されている Rails アプリケーションと、ユーザーが作成したファイルを格納する特定のバケットがあります。どちらも同じリージョンとアベイラビリティ ゾーンにあります。アップロードされるファイルは非常に小さい (< 1kb) テキスト ファイルで、アップロードに平均 40 秒かかります。私がデータセンターの外に移動することさえしていないことを考えると、これはばかげているように思えます。ファイルの読み取りは、ファイルの移動と削除と同様にほぼ瞬時に行われます。さらに、転送時間の基本量は 40 秒のようです。10 バイトのドキュメントと 29 KB のドキュメントをアップロードしてテストしましたが、どちらも同じ時間がかかりました。
ruby aws-sdk を使用して、次のようなアップロードを実行しています。
file = Tempfile.new(file_name)
file.write(@content)
key = "resources/#{file_name}"
s3 = Aws::S3::Resource.new(region: ENV["AWS_REGION"])
obj = s3.bucket(bucket_name).object(key)
logger.info "** Uploading file #{file_name} to S3"
logger.info " - File size is #{file.size} bytes"
start_time = Time.now.to_i
obj.upload_file(file)
end_time = Time.now.to_i
seconds = end_time - start_time
elapse = Time.at(seconds).utc.strftime("%H:%M:%S")
logger.info "** File upload took #{elapse} to complete"
次のような出力が表示されます。
** Uploading file untitled-NUB3eAURYspbpdaBqu.md to S3
- File size is 23 bytes
** File upload took 00:00:41 to complete
SO、aws フォーラムなどに関する他の何百もの投稿を読んだ後、この問題に関する私の研究能力を使い果たしました。これをどのように改善できるかについての洞察は大歓迎です。
更新:Tempfile
ファイルパス文字列ではなくオブジェクトを使用していたことを追加しました。以前のコード例からは明確ではありませんでした。