😎

【gRPC】S3に直接画像アップロードしたけどgRPCで画像情報を送ることはできないの?

2022/06/28に公開

gRPCについて同様の記事を見かけなかったのでメモをしたいと思います。

今回はgRPCを使ってアプリ開発をしていたのですが、画像情報に関してはS3へ直接画像をアップロードするように指定されていたので「gRPCだと画像情報を送ることはできないのか」気になり調査をしました。

結論

gRPCで画像情報を送ることはできるようですが容量が大きすぎる場合はデフォルトの4MBの設定を変更するか、ストリーミングで送る必要があるようです。

※「スターティングgRPC」より引用

gRPCでは一度に送信できる容量はデフォルトで4MBまでとされています。設定を変更することでこの制限は増やすことができますが、もともとProtocol Buffers自体が小さなデータセットのシリアライズに特化した仕様になっていることも考えると、安易に設定を変えない方が好ましいかもしれません。

今回の画像アップロードの条件が10MB以下で制限されており、4MB以上が想定される仕様だったので画像情報に関してはS3へ直接アップロードして欲しいというサーバー側の意図があったのだと思います。

S3へ直接画像をアップロードする

今回初めてS3へ直接画像アップロードする実装をしたのでメモします。gRPCを使ってS3の署名付きURLを発行し(ここまではgRPCを使う)その後下記のようにfetchして直接画像をS3へアップロードします。

export async function pushProfilePhotoToS3(presignedUrl, uploadPhoto) {
    const myHeaders = new Headers({ 'Content-Type': 'image/*' });
    const response = await fetch(presignedUploadUrl, {
        method: 'PUT',
        headers: myHeaders,
        body: file
     });

最後に

開発を進める中でgRPCでのやりとりだったのに急に「HTTPメソッド使ってね(S3へ直接アップロードしてね)」と言われて疑問に思い今回の調査に至りましたがgRPCについて少しでも理解が深まってよかったです。また、S3に直接画像をアップロードできることも今回初めて知ったので良い経験になりました。ちょっとずつgRPCの全体像について投稿していきたいです。

参考記事

https://books.google.co.jp/books?id=KEbfDwAAQBAJ&pg=PT55&lpg=PT55&dq=gRPC+では一度に送信できる容量はデフォルトで+4MB+までとされている。&source=bl&ots=ogSIKg0W8w&sig=ACfU3U1gqJmtqLpIy8UqM5K9wkXqSHyEtA&hl=en&sa=X&ved=2ahUKEwjwssuEi8_4AhV1tlYBHVQcAYQQ6AF6BAghEAM#v=onepage&q=gRPC では一度に送信できる容量はデフォルトで 4MB までとされている。&f=false

https://fullstackdojo.medium.com/s3-upload-with-presigned-url-react-and-nodejs-b77f348d54cc

  • 署名付きURLによるファイルアップロードは以下の記事がわかりやすかったです。

https://future-architect.github.io/articles/20240705a/

Discussion