Movatterモバイル変換


[0]ホーム

URL:


developersIOproduced by Classmethod

Boto3でS3のpre-signed URLを生成する

Boto3でS3のpre-signed URLを生成する

2015.12.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS は認証付き URL を生成することで AWS のリソースを第三者が操作できるようにする仕組みがあります。

今回は、この機能を活用し

  • S3 にオブジェクトを PUT
  • S3 のオブジェクトを GET

の2パターンに対して Python SDK boto3 を使って認証付きのURL(pre-signed URL)を生成したいと思います。

Boto3 の低レイヤーのbotocoregenerate_presigned_url というメソッドがあるので、このメソッドを活用します。

S3 にオブジェクトを PUT

import boto3BUCKET = 'YOUR_BUCKET'KEY = 'YOUR_KEY's3 = boto3.client('s3')print s3.generate_presigned_url(  ClientMethod = 'put_object',  Params = {'Bucket' : BUCKET, 'Key' : KEY},  ExpiresIn = 3600,  HttpMethod = 'PUT')
引数意味
ClientMethodS3へのリクエストで利用するAPIです
ParamsClientMethodで利用する引数です
ExpiresInURLの有効期間を秒で指定します
HttpMethodS3へのリクエストで利用するHTTPメソッドです

実際に実行すると以下のような URL が生成されます。

https://YOUR_BUCKET.s3.amazonaws.com/YOUR_KEY

では、この URL を使って S3 にオブジェクトを登録してみましょう。

$ export URL=https://YOUR_BUCKET.s3.amazonaws.com/YOUR_KEY # generated pre-signed URL$ echo abcde > test.txt$ curl -D - -X PUT --upload-file test.txt $URLHTTP/1.1 100 ContinueHTTP/1.1 200 OKx-amz-id-2: 9J3B1F6kcpjEszB8w0RJCyOlJPdjWyNDHxRhiQ0bl9NmZGD64iysF/e9Wr9vDWxj4MN1KyOoIlo=x-amz-request-id: 251BCE507696A64BDate: Sat, 26 Dec 2015 07:36:39 GMTETag: "9b9af6945c95f1aa302a61acf75c9bd6"Content-Length: 0Server: AmazonS3

登録したオブジェクトを確認して見ます。

$ aws s3 cp s3://YOUR_BUCKET/YOUR_KEY -abcde

アップロードしたものと同じですね。

S3 のオブジェクトを GET

今度は pre-signed URL を使って S3 オブジェクトを GET します。

素の GET リクエストでは403 Forbidden エラーが発生します。

$ curl http://YOUR_BUCKET.s3.amazonaws.com/YOUR_KEY<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>D191003BF8C99932</RequestId><HostId>/4KatDswKFl3MTgyCUNY8MIqwYR1eI2DuKjqVfw/LtJSnnEhtP5KJ5TgnHF9XPpZRZ4xoE1r+0I=</HostId></Error>

先ほどと同じくgenerate_presigned_url で pre-signed URL を生成します。S3get_object API を使うように書き換えています。

import boto3BUCKET = 'YOUR_BUCKET'KEY = 'YOUR_KEY's3 = boto3.client('s3')print s3.generate_presigned_url(  ClientMethod = 'get_object',  Params = {'Bucket' : BUCKET, 'Key' : KEY},  ExpiresIn = 3600,  HttpMethod = 'GET')

生成された URL を使って実際にアクセスしてみましょう。

$ URL="https://YOUR_BUCKET.s3.amazonaws.com/YOUR_KEY$ curl -D - -X GET $URLHTTP/1.1 200 OKx-amz-id-2: 4O+FU7EUoRXkEBIT1tlimhVqUGgUZ1GhydBDZvKhQOcuLXywWaK2l5T3vHmFDPG36L34P63xnYs=x-amz-request-id: 694599C7F47D22ACDate: Sat, 26 Dec 2015 08:01:57 GMTLast-Modified: Sat, 26 Dec 2015 07:56:33 GMTETag: "9b9af6945c95f1aa302a61acf75c9bd6"Accept-Ranges: bytesContent-Type: binary/octet-streamContent-Length: 6Server: AmazonS3abcde

アップロードしたものと同じオブジェクトを取得出来ています。

まとめ

S3 オブジェクトを取得する pre-signed URL はよく使われますが、S3 オブジェクトを更新するときにも pre-signed URL は使えます。この機能を利用すると、モバイル端末や外部サービスなどから一時的に権限を付与し、S3 に直接アップロードさせることもできるようになります。

参考ページ

この記事をシェアする

FacebookHatena blogX

EVENTS

セミナー一覧会社説明会一覧勉強会一覧

関連記事

【アップデート】Amazon Connect Contact Lens のリアルタイムメトリクスに参照可能な値が追加されました
フニ
2025.12.17
AWS と Google Cloud を直結する AWS Interconnect - multicloud について話してきました #AWSreInvent #cmregrowth
Guri / Hajime Oguri
2025.12.17
Aurora PostgreSQL で Babelfish を有効化したクラスターを作成しても babelfish_db が作成されない時に最低限確認すべきポイント
いわさ
2025.12.17
[レポート]エージェント型ワークフローによるクラウドセキュリティの自動修復 #SEC217-S #AWSreInvent
いそま
2025.12.17

[8]ページ先頭

©2009-2025 Movatter.jp