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


## はじめに
[Cloudian](https://cloudian.com/jp/)は、AWSのS3完全互換のAPIを持ったオブジェクトストレージです。
[前回](https://qiita.com/yamahiro/items/3c364a603037a2d8d9a5)は、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 時間)に設定されます。


```python: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'
    }
)
```

```bash
'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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962155/0382c4a2-4581-d7c6-55af-007447222d8e.png "3-9-1.png")



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


```python: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
)
```

```bash
'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 を生成
```python: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
)
```

```bash
'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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962155/ee9be35e-9958-4280-7eae-c49fb1c2d1e8.png "3-9-1.png")


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

![3-9-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962155/bc315ab8-96ca-383e-3593-6f452848b80d.png "3-9-3.png")



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

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