私が歌川です

@utgwkk が書いている

aws-sdk-go S3 PutObject MaxMessageLengthExceededエラー 何

tl;dr

PutObject のオプションの Bucket フィールドに空文字列を渡していませんか? 環境変数経由で設定する値がうまく渡っていない、などありませんか? もう一度点検してみましょう。

この記事はこれでおしまいです。検索しても全く情報が出てこなくてしばらく悩んでいたけど、しょうもない感じだった。以下はおまけです。

起こっていたこと

aws-sdk-goでS3にファイルをアップロードするクライアントを書いた。手元では動いたので開発環境にデプロイして動かしてみたらなんかエラーが出る。

operation error S3: PutObject, https response error StatusCode: 400, RequestID: (snip), HostID: (snip), api error MaxMessageLengthExceeded: Your request was too big.

MaxMessageLengthExceededと出ているけど、ファイルをアップロードするのになんか制限に引っかかったか? でもS3にそんなシビアな制限ないのでは?? と思って首をかしげていた。あんまり凝ったことはしてないS3クライアントの実装だし、サンプルコードと見比べても変なところはなさそうに見える。

世の中には1x1.pngという非常にいい画像ファイルがあるのでこれをアップロードしてみると、エラーメッセージが変わった。何???

operation error S3: PutObject, https response error StatusCode: 400, RequestID: (snip), HostID: (snip), api error MalformedXML: The XML you provided was not well-formed or did not validate against our published schema

この時点では全く心当たりがなくて*1、いろいろ試行錯誤してもよく分からない。情報が足りていないので、APIコールのログを吐くようにしてデプロイし直す。

解決編

手元と開発環境でのAPIコールのログが取れたので見比べる。よく見るとリクエストの発行先がおかしい。バケット名が入ってなくない??

  • 手元: /bucket-name/hoge.png?x-id=PutObject
  • 開発環境: /hoge.png?x-id=PutObject

ここまで見たところ全てが分かった。環境変数のセットを忘れてるじゃん……。

ということで、環境変数を入れて再度デプロイしたら直った。

必須の引数 (バケット名) にうっかり空文字列を渡してもAPIコール前にはエラーにならず、変なエンドポイントを叩いた結果見慣れないエラーが返ってくる、というのが難しいポイントだった。気をつけてください。APIクライアントのコンストラクタで必須な引数が空文字列だったらエラーを返す、みたいなことをするともうちょっとよかったのだろう。

*1:ここ伏線です

手を動かして初めて腑に落ちる側

「腑に落ちる」という概念がそもそもそういうものなのかは分からないけど。

ドキュメントや教科書を読んでも、それだけで頭の中で理論を組み合わせて議論するのがどうしても苦手で、手を動かすことによって初めて理解を得るタイプである。座学だけではどうにもならなくて実践がセットじゃないと定着しない。そういうものなのかもしれない。

うっすら興味があるぐらいでは学びを得られていない感じがしていて、必要になって学び、いろいろ実験することで理解が得られる。いくらかは経験という形で他の人に教えることもできるだろうけど、その域に達しているものはまだまだ少ない。

検討をするときに、ドキュメントや制約などを読んだ上での考察だけだと何も分からないまま突き進んでいるような気がしてしまう。実験をして初めて方針への自信が持てるようになる。けどこれはそういうものなのかもしれない。

書き起こしてみると当たり前のことしか言ってないような気がするけど、これは当たり前のことなのか? どうですか。

YAPC::Hiroshima 2024に参加した #yapcjapan

参加しました。前日祭や懇親会・アフターイベント・YAYAPCも含めて全て出席していました。

yapcjapan.org

どの発表もおもしろく、全てについて詳細に取り上げるには紙面 (紙じゃなくない??) が足りないので、ピックアップ形式にさせていただきます。

とほほのWWW入門

キーノートが本当によかったです。ちょうど生まれたぐらいの頃*1からずっとインターネットで発信を続けられていて、まさにアウトプットの祖といえるでしょう。好きだから継続しているという話だったけど、しかしあの情熱は「好き」だけでは説明がつかないのでは??

若者にじゃんじゃん来てほしい

よく言ってるのですが、YAPCは学生支援制度が整っていて、学生でも交通宿泊費を気にせずに参加できるようになっているんですよね*2。YAPC::Japan運営ブログの方にも、学生支援制度を活用してくれ!! という趣旨のブログ記事を寄稿させていただいたことがあります*3

学生支援制度で参加された学生の方 (名前を思い出せず恐縮です) とも少しお話ししたのですが、YAPCは名前にPerlを冠するカンファレンスだけど、Perlは実は書いたことなくても気軽に参加できます。「Perlコミュニティのカンファレンス」ぐらいに思ってもらうのがちょうどよさそう。今回は応募多数で抽選になったようですが*4、学生支援制度で参加された方にはぜひこの制度のことを知り合いにも広めてもらいたいですね。あとはYAPCの参加記を書いてほしい!!

学生の頃から、身の回りに id:Pasta-Kid:nna774 のような人がいたのでYAPCの学生支援制度に素早くリーチできていたけど、そうじゃない学生の方はどうやってこの制度を知ったのか、誰かこっそり教えてください。

廊下とか懇親会とか

廊下や懇親会で、久しぶりに会う人・初めましての人・インターネットでは見たことがあるという人といろいろ会話できてよかったです。オンラインカンファレンスの懇親会会場で発話するのってめちゃくちゃ緊張感があると思っていて、懇親会でおもしろそうな話をしている人のところにフラッと寄ってみたり、とほほさんに話しかけにいったり、実装の議論をしたりなど、これはオフラインじゃないと現状ここまでやるのは無理だよな〜と思っている次第です。

しかし毎日遅くまで飲んでいたので満身創痍!! こういう暮らしがいつまでできるかな??

熱量を浴びる

他のカンファレンスでもそうなんですが、YAPCに行くと、世の中にはまだまだ知らない世界があって問題が解かれているのだ、人々が日々取り組んでいるのだ、ということを実感できますね。自分も誰かの学びになるような発表をできるようにありたいです。

フィードバック

名札の裏にスタンプラリーの台紙があるのを気にせずにスタンプラリーを回っていたら、白いパーカー*5にスタンプの色が付いてしまった!! 来年以降はこちらの件についてご対応を検討いただけますと幸いです。

ところで、こういった要望みたいなのをお伝えする公式のフォームとかあるんですかね?

全てに感謝

運営スタップの皆様、当日お話しできた方、出張として交通宿泊費補助を出してくれた株式会社はてな*6様に森羅万象に感謝を申し上げます。来年のYAPCで会いましょう。

布団買った

www.nitori-net.jp

マットレスがヘタってきているので買い替えるか、ぐらいのモチベーションでレンタカーを出してもらってニトリまで行った結果、敷布団が新しくなったのであった。寝具3点セットの敷布団と比べると安定感が違う。大学に来てからずっと同じものを使っていたのだから、買い替えたらただちに質が上がるわけである。

あと枕も買った。

www.nitori-net.jp

寝具への投資は生活のかなりの部分に効いてくるのだろうと思う。パソコンを触らない日もあるだろうし、スマホを触る時間も日によっては変わるだろうけど、普通に暮らしていたら寝ない日というのは存在しない。ここまで生活に効いてくるmy new gearもなかなかない。

でかい店は、それ単体で遊園地のように振る舞う。