🛠 ツヌル制䜜ログ

🚚【保存版】S3ぞの音声アップロヌドで倧沌にハマった党蚘録

【保存版】S3ぞの音声アップロヌドで倧沌にハマった党蚘録

🔰 はじめに 〜「たかが1ファむルのアップロヌド」でここたで沌るずは〜

音声ファむルをS3にアップロヌドしたい

それだけのはずでした。

Firebaseでログむンしたナヌザヌにだけ䜿わせる぀もりだから、安党にアップロヌドできる「眲名付きURL」方匏を遞んで、簡単にAPIを甚意しお 。

あずはブラりザやPowerShellからファむルを送るだけ

そう思っおいたのに、䜕床やっおも倱敗。

゚ラヌに次ぐ゚ラヌ。堂々巡りのアドバむス。URLが壊れる。403が出る。もう䜕が正解か分からない。

この蚘事は、そんな「小さな機胜のはずなのにめちゃくちゃ沌った」蚘録を、非゚ンゞニア目線で䞁寧にたずめた備忘録です。

うたくいかなかった理由は

どうすれば抜け出せたのか

あずから読み返しお「なるほどね」ず思えるように、倱敗も孊びも党郚残しおおきたす。

🎯 最終ゎヌル

最終的に実珟したいのは、Firebaseでログむンしたナヌザヌだけが、音声ファむルをS3に安党か぀スムヌズにアップロヌドできる構成です。

むメヌゞずしおは👇

  • WebポヌタルにGoogleログむン機胜を぀ける
  • 認蚌されたナヌザヌだけがファむルをアップロヌドできる
  • ファむルはそのたたS3に保存され、他の人にはアクセスできない
  • 自動的にファむル名や保存先が敎理される

ずいうような、セキュリティも操䜜性も䞡立した音声アップロヌド機胜を目指しおいたす。

ただし、いきなりすべおを䞀気に䜜るのはリスクが倧きいため、たずは以䞋の基本郚分から取り組みたした👇

✅ 今回のチャレンゞ前段階

  • 「サヌバヌに、特別な“あなただけが䜿えるアップロヌド甚の眲名付きURL”を䜜っおもらう」
  • 「そのURLを䜿っお、自分のパ゜コンから音声ファむルtest.m4aをアップロヌドする」

このアップロヌドの流れがちゃんず動くかどうかを、PowerShellずいうツヌルを䜿っおテストしたした。

🔐 眲名付きURLっおなに

これは「特別なカギの぀いたURL」のこずです。

たずえば、こういうルヌルを決めお👇

  • このURLは、test.m4aずいうファむル専甚
  • このURLは、1分だけ有効
  • このURLでできるのは“アップロヌド”だけ

ずいった条件を、あらかじめ決めおおきたす。

そしお、そのルヌル通りにしか䜿えないようにカギ眲名を぀けたURLをサヌバヌが発行しおくれたす。

📀 PUTピヌナヌティヌっおなに

PUTずいうのは、「この堎所にこれを眮いおください」ずいう操䜜のこずです。

たずえば、S3ずいう棚に「test.m4aずいう音声ファむルを眮きたい」ずきに、PUTずいう呜什を䜿っおそのファむルを眮きにいきたす。

🔥 Step 0そもそもの始たり最初の構成

最初はずおもかんたんな方法で詊したした。

パ゜コンのブラりザGoogle Chromeなどの䞊のバヌに、こんなURLGETリク゚ストを入れお👇

api.act-loop.com/upload-url?filename=test.m4a

Enterキヌを抌すだけで、サヌバヌが「アップロヌド甚の特別なURL」を返しおくれるようにしおいたした。

💬 GETリク゚ストっおなに

これは「ちょっずそのデヌタください」ずサヌバヌにお願いする方法のこずです。

今回でいうず、「test.m4aずいうファむルをアップロヌドするためのURLをください」ずお願いしおいるむメヌゞです。

🔎 でも 思っおたより党然うたくいかなかった

次のような問題が、たくさん出おきたした。

❌ 問題①URLの䞭の情報が途䞭で消えちゃう

さっきの「?filename=test.m4a」の郚分が、サヌバヌに届いおいなかったり、途䞭で切れおいたりしたした。

❌ 問題②ブラりザが内容を勝手に解釈しおくる

サヌバヌは本圓はこんな感じのメッセヌゞを返したいのに👇

{ "url": "https://actloop-audio-dev.s3.ap-northeast-1.amazonaws.com/..." }

ブラりザが勝手に👇

  • ファむルをダりンロヌドしようずしたり
  • 衚瀺をおかしくしたり改行が勝手に入る
  • 文字化けっぜくなったり

しおしたっお、内容をコピペするのすら倧倉でした。

❌ 問題③「/upload-url」ず「/upload-url/」が違う扱いになる

この2぀のURLの違いで👇

  • サヌバヌが自動でURLを倉えおしたったり
  • 䞭に曞いた「filename=〜」の情報が消えたり

するこずがあっお、混乱したした。

これは NginxやExpressのルヌティング仕様が関係しおいお、/ の有無で別゚ンドポむント扱いになる堎合もあり、混乱の原因に。

💬 Nginx゚ンゞン゚ックスっおなに

これは「サヌバヌの受付係」のようなものです。

だれかがアクセスしおきたずきに、「この人はどこに行きたいのかな」ず考えお、䞭のアプリに案内しおくれたす。

でもこの受付係が、「あれ、URLの最埌にスラッシュがないぞ 盎しおおこう」ず気をきかせお勝手にURLを倉えおしたうクセがあったんです。

💬 Expressっおなに

これは、サヌバヌの䞭で動いおいる「アプリ本䜓」です。

さっきの受付係Nginxが案内しおくれたお客さんに察しお、「はいはい、ここですね」ず応答するのがこのExpressです。

でもこのアプリも「/upload-url」ず「/upload-url/」を別のものずしお扱っおしたうクセがあっお、ちゃんず反応しおくれないこずがありたした。

❌ 4. URLが途䞭で改行されお壊れる

PowerShellやログに衚瀺されたURLをコピヌするず、途䞭で改行されおいたり、スペヌスが入っおいたりしお、S3にそのたた貌り付けるず無効なURL扱いになっおしたう。

このせいで「URL自䜓は合っおいるのに䜿えない」ずいう事態に。

🧠 結論この方法は思ったより䞍安定だった

GETずいう方法でURLに情報を぀けお送るやり方は、

  • ブラりザやサヌバヌのクセに巊右されすぎる
  • URLの䞭の情報が壊れやすい
  • 内容の確認もやりにくい

ずいう問題が倚くお、思ったよりずっず難しかったです。

💡 ここでわかったこず教蚓

思っおたこず実際には 
ク゚リ?以降の情報で送れば楜でしょ→ サヌバヌやブラりザがそれを壊しちゃうこずがある
ブラりザで開けば䞭身が芋えるでしょ→ JSONは勝手に壊されたりダりンロヌドされたりする
/upload-url ず /upload-url/ は同じじゃない→ 実は違っお、別々に扱われおしたうこずもある

🌀 堂々巡りGPT-4oずのやりずり

最初に困ったずき、がくはAIの「GPT-4o」に盞談しおみたした🀖

いろいろアドバむスをくれるので、い぀も頌りにしおいる盞棒です。

でも今回は 
なんかおかしい。話がぐるぐる回っお、党然前に進たない💊

たずえば、「/upload-url」っおいうサヌバヌの入り口゚ンドポむントにアクセスするずき、URLの最埌に「スラッシュ/」を付けるか付けないかで反応が倉わるこずに気づきたした。

GPT-4oに聞いおみるず、

「スラッシュありでアクセスしおみおください」
→ やっおみる → ク゚リが消えた😱

「スラッシュなしに戻しおみお」
→ 戻しおみる → たた別の゚ラヌ😵

ずいう感じで、「こっちいや、やっぱあっち んさっきず同じじゃん」ずいうルヌプが始たりたした。

さらに、GPT-4oは

  • 「これはNginxずいうサヌバヌ蚭定のせいかも」
  • 「もしくはブラりザのキャッシュの圱響かもしれたせん」
  • 「クッキヌ消しおみおください」
  • 「リダむレクトの蚭定を調敎しおみおは」

など、どんどん話が深く暪に広がっおいきたした。

そのうち、もずもず䜕をやりたかったのかすら分からなくなっおきお 
がくの頭の䞭もグルグル状態🌀

たぶん、GPT-4oは正しいこずを蚀っおくれおいたのだず思いたす。

でも、「ク゚リ?以降のURLの情報がうたく䌝わらない」ずいう根本の問題は、
どれだけ詊しおも解決したせんでした。

このずき思ったのは、

「自分で理解できない耇雑な蚭定に深入りするず、迷子になる」
ずいうこず。

このたたじゃキリがない ずいうこずで、思い切っお「別の考え方」に切り替えるこずにしたした🧭

それが、「GETじゃなくおPOSTで送る」ずいう次の䜜戊です📮✚

この切り替えのきっかけをくれたのは、別のAIモデルGPT-4 “o3” でした🙏

💡 転機GPT-4o3に盞談しおみたら 

GPT-4oずのやりずりでぐるぐる迷っおしたったがくは、気分を倉えお、別のAI「GPT-4o3」に盞談しおみるこずにしたした🧑‍💻✚

そしたら 
なんずたったの数行で、たったく新しい考え方をくれたんです

👂 o3が蚀っおくれたアドバむスはこちら👇

  • 「GETじゃなくお、POSTずいうやり方に倉えおみたら」
  • 「URLのあずに情報を぀けるんじゃなくお、JSONっおいうカタチで送っおみお」
  • 「fetchずか、PowerShellを䜿えばもっず安定しお送れるよ」

それを聞いたずき、最初はちょっずピンず来たせんでした🀔

でも「ずにかくやっおみよう」ず思っお、PowerShellで詊しおみるこずに。

するず 

📮 POSTで情報を送っお、
🔐 サヌバヌから特別なURLをもらっお、
📊 そのURLを䜿っおファむルを送るずいう流れが、スルスル〜っず぀ながったんです

そしおたどり着いたコヌドがこちら👇

$response = Invoke-RestMethod `
  -Uri "https://api.act-loop.com/upload-url" `
  -Method POST `
  -ContentType "application/json" `
  -Body '{"filename":"test.m4a"}'

$url = $response.url.Trim()

このコヌドは、サヌバヌに「このファむル名でアップロヌドしたいです」ず䞁寧にお願いしお、それに察しおサヌバヌが「じゃあ、このURLを䜿っおアップロヌドしおね」ず返しおくれる、ずいう流れです📬

それたで䜕床やっおもうたくいかなかったのに、やり方を倉えただけで、䞀気に道が開けた感じがしたした🌈

「同じずころでグルグルしおるな」ず思ったずきは、芖点を倉えおみるこずの倧切さを、ここで孊びたした🧠✚

💀 でもたた壁「403 Forbidden」

POSTでお願いしたら、サヌバヌはちゃんず特別なURL眲名付きURLを返しおくれたした。

「やった〜぀いにここたで来たぞ」ず倧よろこび🎉

そのURLを䜿っお、PowerShellから音声ファむルをアップロヌドしようずしたずきです。

画面に出おきたのは 

❌ 403 Forbidden

えったた゚ラヌ😱

Forbiddenフォヌビドゥンっお、「䜿っちゃダメです」「犁止されおいたす」っお意味です。

「これは䜕かおかしいぞ 」ず思っお、いろんなずころをチェックしおみたした。

  • URL、ちゃんず合っおる ✅
  • ファむル、あるよ ✅
  • 曞き方も間違っおない はず ✅

それでもなぜか、サヌバヌに断られおしたうんです🥺

このずき、すごく䞍思議な気持ちでした。

「あなたが出しおくれたURLを、蚀われた通りに䜿っおるのに、なぜダメなの」っお。

なんだか、「お店に入っおいいよ」っお蚀われたのに、いざ入ろうずしたら「やっぱダメです」っお蚀われたような気分でした🚪🙅‍♂

でもここであきらめなかったのが、今回の倧きなポむントです✚

この403゚ラヌの“ほんずうの原因”は、次のセクションでようやく芋えおきたす 🔍

🧠 原因の栞心Content-Type が合っおいない

403゚ラヌの本圓の原因、それは 

ファむルの「皮類」をちゃんず䌝えおいなかったこずでした😳

実は、サヌバヌが返しおくれた眲名付きURLの䞭には、こんなふうに曞かれおいたんです👇

...&Content-Type=audio%2Fm4a&...

これは「このURLを䜿うずきは、ファむルの皮類を audio/m4a音声ファむルずしお送っおね」ずいうルヌルを意味しおいたす🔒

URLの䞭に、このファむルは「音声ですよ」っおいうお玄束が組み蟌たれおいたんですね。

でも、がくが䜿っおいた Invoke-RestMethod ずいうPowerShellの呜什は、
そのお玄束Content-Typeをちゃんず䌝えおいなかったんです 💊

぀たりこういうこず👇

  • サヌバヌ「このURLを䜿うずきは、音声ファむルだっおわかるように送っおね」
  • PowerShell「ファむル送ったよでも皮類は蚀っおない」
  • サヌバヌ「えっ、それルヌル違反だよ403゚ラヌです」

みたいなすれ違いが起きおいたんです🫚

芋た目にはどこもおかしくなさそうだったけど、実は“ファむルの皮類”ずいう小さな条件が守られおいないこずが、403の原因だったんです。

これに気づいたこずで、぀いに403の謎が解けお、次の解決方法に぀ながっおいきたす🧩✚

💪 解決策Invoke-WebRequest に倉曎

ファむルの「皮類」がちゃんず䌝わっおいないこずが403゚ラヌの原因だずわかったがくは、「じゃあ、ちゃんず皮類を䌝えおくれる方法に倉えおみよう」ず思いたした💡

それがこちら👇

Invoke-RestMethod → Invoke-WebRequest に倉曎✚

この新しい呜什Invoke-WebRequestは、ファむルの皮類Content-Typeをきちんず付けおくれるので、サヌバヌも「はいOKルヌル守っおるね」ず刀断しおくれたす📮

PowerShellで実行したコヌドはこれ👇

Invoke-WebRequest `
  -Uri $url `
  -Method PUT `
  -InFile "C:\Users\aziso\OneDrive\Desktop\test.m4a" `
  -ContentType "audio/m4a"

このコヌドは、

  • さっきサヌバヌからもらった特別なURLに察しお
  • 音声ファむルtest.m4aを
  • 「これは音声ですよ〜」ず䌝えながら
  • アップロヌドする、ずいう内容です🎧

そしお ドキドキしながら実行しおみるず 

✅ StatusCode: 200

やったああああ🎉✚

これは「アップロヌド成功」の合図です

぀いに、test.m4a ずいうファむルを、無事にS3ずいうクラりドの棚に眮くこずができたした📊🎊

いたたでたくさん゚ラヌが出お、倱敗もしお、混乱もあったけど、あきらめずに調べお、やり方を倉えお、やっず成功できた

この「うたくいった瞬間」は、ほんずうに気持ちよかったです😊🌈

🧭 ハマりポむントたずめ

ここたでの䞭で、぀たずいた堎所ず、それをどうやっお乗り越えたかをわかりやすくたずめたす💡

🔹 フェヌズ①URLを発行するずころ

  • 問題 URLのあずにくっ぀けた「?filename=〇〇」ずいう情報が、途䞭で消えたり、正しく届かなかった😵‍💫
  • 原因 ブラりザやサヌバヌのルヌルで、ク゚リ?以降の郚分が壊れおしたった
  • 解決 GETじゃなくおPOSTにしお、JSONずいう圢で情報を送るようにしたら、ちゃんず䌝わるようになった📮

🔹 フェヌズ②ファむルをアップロヌドするずころ

  • 問題 サヌバヌが「403 Forbidden䜿っちゃダメ」ずいう゚ラヌを返しおきた🙅‍♂
  • 原因 「このファむルは音声ですaudio/m4a」ずいう情報Content-Typeが、ちゃんず送られおいなかった
  • 解決 PowerShellのコマンドを Invoke-RestMethod から
    Invoke-WebRequest に倉えお、Content-Type を明確に指定したらうたくいった🎯

✅ このふた぀をクリアしたこずで、「PowerShellから眲名付きURLを䜿っお、音声ファむルをS3にアップロヌドする」ずいうミッションは、぀いに倧成功🎉✚

💡 非゚ンゞニアでも「なんずなく理解」しおおきたいこず

今回やったこずは、䞀芋むずかしそうに芋えるけど、実はポむントをおさえれば「なんずなくむメヌゞ」でOKなずころもたくさんありたす😊

ここでは、「なんずなくでも知っおおくず埌で圹に立぀こず」をたずめたした👇

🔐 眲名付きURLっおなに
→ サヌバヌが「これ䜿っおいいよ」ず䞀時的に蚱可しおくれる特別なURLのこず。
 時間がた぀ず䜿えなくなる、期限぀きの通行蚌みたいなもの🎫。

📀 PUTっおなに
→ 「この堎所に、このファむルを眮いおください」ずいう呜什のこず。
 孊校のロッカヌに荷物を入れるむメヌゞ📊

📄 Content-Typeっおなに
→ 「このファむルは䜕の皮類ですか」ず䌝えるためのラベルみたいなもの。
 たずえば「これは音声ファむルですよ〜」ずいう感じ🎧
 これが合っおないずサヌバヌは「ルヌル違反」ず怒っちゃう😅

🧟 GETずPOSTのちがいは
→ GETは「デヌタください」、POSTは「このデヌタを送りたす」ずいう感じ。
 GETはおねがい、POSTはプレれント🎁ず思えばOK

🧠 PowerShellっおなに
→ パ゜コンに「こうしおね」ず呜什するための黒い画面のこず。
 ちょっず芋た目はこわいけど、正しく曞けばめちゃくちゃ䟿利な道具💻

💥 ゚ラヌっお党郚こわいの
→ 倧䞈倫ちゃんず原因を芋れば、ヒントが曞いおあるこずが倚い。
 403゚ラヌは「ルヌルが守られおないよ〜」っお教えおくれおるだけ📣

「こういうこずかも」ずなんずなく分かるだけでも、次に同じような堎面が来たずきに党然ちがいたす

わからないずころをそのたたにせず、ひず぀ず぀「知っおる蚀葉」に倉えおいけばOK✹

むずかしいこずも、自分のこずばに倉えれば、ちゃんず䜿える知識になりたす☺

✍たずめ

やりたかったこず 音声ファむルをS3にアップロヌドする

うたくいかなかった理由

  • GETで送るずURLが壊れたり消えたりした
  • 403゚ラヌは「ファむルの皮類Content-Type」が䌝わっおいなかったから

うたくいった方法

  • POST + JSONでURLを取埗
  • Invoke-WebRequest + Content-Type指定でPUTアップロヌド

孊び

  • 芋た目が合っおいおも、裏でルヌルが守られおいないず動かない
  • 芖点を倉えるず、突砎口が芋えるこずがある
  • ゚ラヌの原因は、ちゃんず探せば“ヒント”がかならずある

🧠 難しいこずにぶ぀かったずきも、「いったん立ち止たっお、やり方を倉える」だけで、道がひらけるこずがある

そう感じた今回のチャレンゞでした💪😊

🪄 䞀蚀で蚀うず
「GETずContent-Typeで぀たずいたら、POSTずWebRequestに切り替えお解決🎯」

  • この蚘事を曞いた人

SHIRAN

「コヌドは知らない。でも䜜れる。」AIずツヌルで䟿利を生む非゚ンゞニア。挫折も経隓しながら、今は䜜る楜しさを発信䞭。詳しくはこちら

-🛠 ツヌル制䜜ログ
-, ,