ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

AWSのLambdaへのリクエストがCORSエラーかと思ったらサイズが大きすぎたお話

time 2020/10/20

今回はAWS絡みのお話です。
AWSのLambda (API Gateway) へのリクエストがエラーになるため、いつも通りCORSかと思ったら違った…という内容。

結論から言うと「リクエストペイロードが大きすぎたので小さくした」です。
CORSは関係なかったので、CORS絡みで閲覧された方はごめんなさい。

きっかけ

先日公開したゲーム「ぱくぱくアザラシ」のTwitter投稿機能で、WebGL (JavaScript) からAWSのLambdaへリクエストを投げるのですが、「共同開発した方のノートPCでのみ動かない」という問題が起きました。
開発者ツールのConsoleにはCORSでよく見かけるエラーメッセージが。

そしてエラーになったリクエストのレスポンスヘッダを確認すると、Access-Control-Allow-Originがなかったのです。

↓うまくいったリクエスト

↓うまくいかなかったリクエスト

なのでずっとCORS絡みを疑っていたのですが、よく見るとプリフライトリクエストは成功しています。
そちらはAccess-Control-Allow-Origin*を指定しているため、ワイルドカードで弾かれているわけでもなさそうでした。現にレスポンスヘッダにもちゃんと記載されていますね。

で、POST側のレスポンスヘッダをよく見ると、statusが413とあります。

これについてぐぐったら「ほほー…」となり、「単にリクエストがでかすぎるだけ?」と気が付きました。

解決した方法

単純にリクエストペイロードを小さくするしかないですね。
リクエストしているデータはツイート用の画像 (と文字列少々) ですが、エラーになったリクエストは合計で8.1MBもありました。

ここからはUnityなお話になりますが、キャプチャしたスクリーンショットのデータが大きすぎるのが問題だったようです。
キャプチャはTexture2DのReadPixels()で行っていますが、Screen.widthScreen.heightを使って取得しているため、ディスプレイによってはとても大きいサイズになってしまいます。「一部の環境でのみ起きる」はこれが原因でした。
なのでリクエスト前に横幅がある程度大きければリサイズするようにしました。

Texture2Dのリサイズってどうやるの?

Texture2DにはResize()メソッドがありますが、これだと画像の色がなくなってしまいます。
なのでこちらで紹介されていたTextureScaleクラスを使用しました。
http://wiki.unity3d.com/index.php/TextureScale

で、縮小したデータなら問題なくリクエストが通ったので、一件落着となりました。

あとがき

そんなわけで、いつものCORSエラーかと思いきやサイズが大きかったなお話でした。
Consoleのエラー的にもレスポンスヘッダ的にもCORSだと考えていたので、解決までに時間が掛かってしまいました。
ので備忘も兼ねて書いておきます。

down

コメントする