Node.js書籍『AWSによるサーバーレスアーキテクチャ』(翔泳社)を読み進めているときにS3のファイルアップロード関連でつまづいたところが多々あったので、気をつけるべきところとして手順と一緒にまとめます。JavaScript一択ではありますが、ブラウザの場合は生のJavaScriptで記述することも可能です。APIで扱った時のメモです。(書籍に従って生JSでゴリゴリ書きましたけど、潔くSDKを使えばこういったところで躓かなかったのではと思わずにはいられない。)www.shoeisha.co.jpやること署名付きURLを発行する。バケットのアクセス権限を設定する。API経由でリクエストを投げる。署名バージョン4でリクエストするファイル名(オブジェクトのキー)、バケット名、有効期限を使って署名付きのURLを発行します。このとき、署名バージョン4でリクエストします。V4以外は受け付けません。明示的に指定した方がいいかも。Gatewayで実装すると扱いやすい。4https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/sig-v4-authenticating-requests.html以下、コード例。getSignedUrl};オペレーション名を一緒に付与することオペレーションを指定するときは、putObjectとキャメルケースで指定すること。PutObjectと先頭大文字で指定するとエラーで弾かれる。公式ドキュメントには上記は明記されていないが、Sampleにはちゃっかりキャメルケースで指定されている。ここで返却される署名付きURLは仮想ホスト形式で返されます。http://{bucket-name}.s3.amazonaws.comhttp://{bucket-name}.s3-aws-region.amazonaws.comバケットのアクセス権限を設定するバケットポリシーまずはパブリックアクセス権限が付いていたら外します。今回は署名付きURLでダウンロード/アップロードを行うため、リクエストの度にリクエスト者に権限が付与される仕組みにするためです。バケットポリシーを開いてドキュメントを削除する。バケット一覧で該当のバケットに"非公開"と記載されていればOK。常に最小限の権限を付与することが推奨されているため、不用意にパブリックアクセスを許可することは回避した方が良いです。CORS設定AWSとは別ドメインからアクセスすることになるので、どこから/どんなオペレーションが許可されるかバケットに設定する必要があります。CORSの設定から以下のように設定を追加します。</CORSRule></CORSConfiguration>あと地味なTipsとしては、1行目の<?xml...の記載は設定のエディタに書かなくても勝手に追加されます。API経由でリクエストを投げるPUTリクエストで投げる。オブジェクトの新規作成をするんだからPOSTリクエストじゃね?と直感的に思いつきますが、PUTリクエストで投げます。Deniedと403が寂しく返ってくるだけです。思い返してみれば、オペレーション名はPutObjectだもんね。同一キーのオブジェクトに対しては上書きもできることから、POSTメソッドではなくPUTメソッドのリクエストにしているのではと推測します。multipart/form-dataでデータをバックエンドに送信しますが、S3へのアップロードに関しては単一ファイルの場合はmultipartリクエストを行うのは間違いです。ファイル本体のContent-Typeを指定しましょう。video/mp4といった具合です。ファイルをS3バケットにアップロードする。MP4の動画を添付したと想定。S3バケットにアップロード実行。});}実はこれもちゃっかり公式ドキュメントに記載されています。日本語版にはないですけどね。以下のExample2にJPEG画像の例が参考になります。https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/RESTObjectPUT.html?shortFooter=true#RESTObjectPUT-responses-examplesブラウザに含めるJSファイルのサイズを気にしてSDKを入れられない場合などに参考にしていただければと思います。Botを少しリファクタリングした時の話。今年の年末エントリーです。月別アーカイブはてなブログをはじめよう!accelerkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。