【AWS】S3にPresigned URLでアップロードする方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

AWSのS3にPresigned URLでファイルをアップロードする方法を知りたい」とお考えではありませんか?

サーバーを経由せずにクライアントから直接S3へファイルをアップロードしたいと考えている方へ。

Presigned URLを使えば、IAMの認証情報をクライアントに渡さずに一時的なアップロード権限だけを発行することが可能です。

いずみ

サーバー負荷も減らせる便利な仕組みなので、サクッと解説します。

ということで、本記事ではAWSのS3にPresigned URLでファイルをアップロードする方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AWS】S3にPresigned URLでアップロードする方法

早速ですが、AWSのS3にPresigned URLでファイルをアップロードする方法を解説します。

Presigned URLとは

Presigned URLとは、S3バケットへのアクセス権限を一時的に付与した署名付きURLです。

発行したURLを知っているユーザーであれば、AWSアカウントやIAMの認証情報を持っていなくても、有効期限内に限りアップロードやダウンロードを実行できます。

画像やファイルのアップロード機能を実装する際、アプリケーションサーバーを経由させずにブラウザから直接S3へ転送できるため、サーバーの負荷や実装コストを抑えられます。

事前準備

まずは、Presigned URLを発行するための準備をします。

STEP
IAMユーザーにS3の権限を付与する

Presigned URLを発行するIAMユーザーまたはIAMロールに、対象バケットへのs3:PutObject権限を付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-bucket-name/uploads/*"
    }
  ]
}
STEP
boto3をインストールする

PythonからS3を操作するため、AWS SDKであるboto3をインストールします。

pip install boto3
いずみ

認証情報はコードに直接書かず、環境変数やIAMロールから読み込ませるのが基本です。

実装(コード付き)

準備が終わったら、実際にPresigned URLを発行して動作を確認します。

STEP
Presigned URLを発行するコードを書く
import boto3

s3_client = boto3.client("s3", region_name="ap-northeast-1")

presigned_url = s3_client.generate_presigned_url(
    ClientMethod="put_object",
    Params={
        "Bucket": "my-bucket-name",
        "Key": "uploads/sample.png",
        "ContentType": "image/png",
    },
    ExpiresIn=300,
)

print(presigned_url)

generate_presigned_urlメソッドに、対象のバケット名・キー・Content-Typeを渡すだけでURLを発行できます。

ExpiresInには有効期限を秒単位で指定し、上記コードでは300秒(5分)に設定しています。

いずみ

コード自体はたった数行なので、実装コストはかなり低いです。

STEP
発行したURLでファイルをアップロードする

発行したPresigned URLに対してPUTリクエストを送ると、ファイルをアップロードできます。

curl -X PUT "<発行されたPresigned URL>" \
  -H "Content-Type: image/png" \
  --data-binary @sample.png

リクエストヘッダーのContent-Typeは、URL発行時に指定した値と一致させる必要があります。

値が一致していないと、S3側でSignatureMismatchエラーが返ってきます。

いずみ

フロントエンドから使う場合はfetchやaxiosでPUTリクエストを送るだけなので、実装はブラウザ側でも簡単です。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

Presigned URLの有効期限はどのくらいに設定すればいいですか?

アップロード用途では数分程度の短い有効期限で十分なケースが多いです。

ダウンロード用途で共有リンクとして使う場合は、用途に合わせて数時間から数日程度に延ばすこともあります。

IAMユーザーにはどれくらいの権限を与えればいいですか?

必要最小限の権限に絞るのが基本です。

  • アップロード用途ではs3:PutObjectのみを許可する
  • 対象バケット・対象パスまでResourceで絞り込む
  • ダウンロードも必要な場合のみs3:GetObjectを追加する

ブラウザから直接S3へアップロードする場合、CORS設定は必要ですか?

必要です。

S3バケットのCORS設定で、アップロード元のオリジンと許可するメソッド(PUTなど)を登録しないと、ブラウザ側でCORSエラーが発生します。

まとめ

今回は、AWSのS3にPresigned URLでファイルをアップロードする方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • boto3のgenerate_presigned_urlを使えば、数行のコードでPresigned URLを発行できる。
  • サーバーを経由せずにクライアントから直接S3へアップロードでき、サーバー負荷を抑えられる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次