1
Help us understand the problem. What are the problem?

posted at

updated at

Organization

[Cloudian #10] Python(boto3)で、オブジェクト公開のための署名付きURLを生成してみる

はじめに

Cloudianは、AWSのS3完全互換のAPIを持ったオブジェクトストレージです。
前回は、Python(boto3)で、オブジェクトのメタデータを表示してみました。

今回は、Python(boto3)で、オブジェクトをWEB公開するための、署名付きURLを生成してみようと思います。

事前署名付き URL の生成 / generate_presigned_url ()

Cloudian に格納されたオブジェクトの共有に使用できるパブリックURLを、 generate_presigned_url()を呼び出して生成することができます。

1. デフォルトの有効期間(3,600 秒)で事前署名付き URL を生成

以下の例では、generate_presigned_url()のクライアントメソッドに「get_object」 を設定し、バケット「pythonbucket3」に保存されているキー「HyperStoreInstallGuide_v-7.2.1.pdf」のオブジェクトを取得できる事前署名付きURLを生成しています。

有効期間を指定せずに URL を生成した場合、その URL の有効期間はデフォルトで 3,600 秒(1 時間)に設定されます。

test1.py
import boto3

client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com'
)


# オブジェクトWEB公開のための署名付きURLを生成
client.generate_presigned_url(
    'get_object',
    Params={
        'Bucket': 'pythonbucket3',
        'Key': 'HyperStoreInstallGuide_v-7.2.1.pdf'
    }
)
'http://s3-region1.admin-tech.tokyo/pythonbucket3/HyperStoreInstallGuide_v-7.2.1.pdf?
AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxx&Expires=xxxxxxxxxx'

この例で生成された URL を開くと、下図のように指定したオブジェクトを取得することが できます
(ブラウザで表示可能な PDF であるため、ブラウザで開いています)

3-9-1.png

2. 有効期限を 2 日間(7,200 秒)に設定して事前署名付き URL を生成

以下の例では、generate_presigned_url()の引数に 2 日間の有効期限 (ExpiresIn=7200)を設定し、事前署名付き URL を生成しています。

test1.py
import boto3

client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com'
)


# オブジェクトWEB公開のための署名付きURLを生成
client.generate_presigned_url(
    'get_object',
    Params={
        'Bucket': 'pythonbucket3',
        'Key': 'HyperStoreInstallGuide_v-7.2.1.pdf',
        },
    ExpiresIn=7200
)
'http://s3-region1.admin-tech.tokyo/pythonbucket3/HyperStoreInstallGuide_v-7.2.1.pdf?
AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxx&Expires=xxxxxxxxxx'

3. 有効期限を 2 分(120 秒)に設定して事前署名付き URL を生成

以下の例では、generate_presigned_url()の引数に非常に短時間の有効期限 (この例の場合、「ExpiresIn=120」)を設定し、事前署名付き URL を生成してその挙動 を確認しています。

有効期限 2 分の事前署名付き URL を生成

test1.py
import boto3

client = boto3.client(
    's3',
    endpoint_url='https://xxx.yyy.com'
)


# オブジェクトWEB公開のための署名付きURLを生成
client.generate_presigned_url(
    'get_object',
    Params={
        'Bucket': 'pythonbucket3',
        'Key': 'HyperStoreInstallGuide_v-7.2.1.pdf',
        },
    ExpiresIn=120
)
'http://s3-region1.admin-tech.tokyo/pythonbucket3/HyperStoreInstallGuide_v-7.2.1.pdf?AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxx&Expires=xxxxxxxxxx'

生成されたURLに、2分以内にアクセス

事前署名付き URL が指しているオブジェクトが Web ブラウザで参照できる PDF形式であるため、Webブラウザで PDFが開かれています。

3-9-1.png

生成されたURLに、2分以上経過した後にアクセス

以下のようなエラーが返されて、オブジェクトへのアクセスが拒否されます。事前署名付きURLを生成した際に「ExpiresIn=120」を指定しているため、2 分以上経過したア クセスは以下のように拒否されます。

3-9-3.png

まとめ

Python(boto3)で、オブジェクトWEB公開のための署名付きURLを生成してみました。

次回も、Pythonでオブジェクトストレージ/Cloudianをいろいろ操作していきたいと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?