Tencent CloudでCDN+COSで署名付きURLを発行してみた


こんにちは!
Tencent Cloudについて猛烈勉強中のひよっこエンジニアです。

今回は署名付きURLの発行方法について、まとめてみました!

Webサイトなどを公開するときにURLを特定のユーザだけに配信するケースがあるかと思います。(セミナー登壇後の資料など)
その際の方法をGUIで発行する方法/モジュール化して発行する方法を検証してみました!

最後には、Tencent Cloudでの特徴もまとめてみましたので参考にして頂けると嬉しいです!

構成図

今回はこのような構成となり、GUI上で発行する場合は※の設定は不要になります。

参考:https://intl.cloud.tencent.com/jp/document/product/228/35237

事前準備

まずは、対象のサイトを作成します。
別の記事で『Tencent Cloudで静的コンテンツを配置する方法』をまとめているのでこちらを参考にしていただければと思います!

こちらを実装できれば、準備完了です!

CDN設定~GUI ver~

CDNコンソールの「Access Control」をクリックし、「Authentication Configuration」より設定を行います。

設定必要な情報は以下の通りです。
※認証方法は4つあり、任意のものを選択します。

項目 備考
Authentication Key Auto-create 今回は自動発行で設定を行います。
Sigunature Paramater Name sign デフォルトのものをそのまま活用しました。
Access Path /goro.jpg 配置したCOSバケット内のパスを明記
Valid Time 100 URLの有効期限を設定します。

全ての情報を入力出来たら「Generate」をクリックします。

URLが発行され、無事ログインできました!

CDN設定~モジュール化 ver~

CDNコンソールの「Access Control」をクリックし、「Authentication Configuration」より設定を行います。


「Authentication Configuration」を「On」にし、必要な情報を入力します。
※認証方法は4つあり、任意のものを選択します。

Select a mode

項目 備考
Authentication Mode TypeA 4つの認証方法より任意のものを選択します。

Configure Parameter

項目 備考
Authentication Key Auto-create 今回は自動発行で設定を行います。
Sigunature Paramater Name sign デフォルトのものをそのまま活用しました。
Valid Time 100 URLの有効期限を設定します。
項目 備考
Authentication Scope ALL

設定が完了したら下記のようになります。

下記サンプコードが提供されていますので、下記を実行します。

#import requests
import json
import sys
import time
import hashlib
def generate_url(category, ts=None):
    print(category);
    url = '〓ドメイン〓'
    path = '/goro.jpg'
    suffix = ''
    key = 'gfSg5c8fGz'
    now = int(time.mktime(time.strptime(ts, "%Y%m%d%H%M%S")) if ts else time.time())
    sign_key = 'sign'
    time_key = 't'
    ttl_format = 100
    if category == 'A':
        ts = now
        rand_str = '123abc'
        sign = hashlib.md5('%s-%s-%s-%s-%s' % (path, ts, rand_str, 0, key)).hexdigest()
        request_url = '%s%s?%s=%s' % (url, path, sign_key, '%s-%s-%s-%s' % (ts, rand_str, 0, sign))
        print(request_url)
    elif category == 'B':
        ts = time.strftime('%Y%m%d%H%M', time.localtime(now))
        sign = hashlib.md5('%s%s%s' % (key, ts, path)).hexdigest()
        request_url = '%s/%s/%s%s%s' % (url, ts, sign, path, suffix)
        print(request_url)
    elif category == 'C':                               #Type C
        ts = hex(now)[2:]
        sign = hashlib.md5('%s%s%s' % (key, path, ts)).hexdigest()
        request_url = '%s/%s/%s%s%s' % (url, sign, ts, path, suffix)
        print(request_url)
    elif category == 'D':                               #Type D
        ts = now if ttl_format == 10 else hex(now)[2:]
        sign = hashlib.md5('%s%s%s' % (key, path, ts)).hexdigest()
        request_url = '%s%s?%s=%s&%s=%s' % (url, path, sign_key, sign, time_key, ts)
        print(request_url)
if __name__ == '__main__':
    if len(sys.argv) == 1:
        print('usage: python generate_url.py A 20200501000000')
    args = sys.argv[1:]
    generate_url(*args)

実行すると、URLが発行されます。

[root@goro-auth work]# python2 goro-auth2.py A
A
〓対象URL〓?sign=1647239459-123abc-0-30c8d4e600086b3edb5xxxxxxxxxxxxxx

無事アクセスできました!!

さいごに

今回は、認証付きURLを発行してみました。

方法としてはGUI上からも発行することができるの、楽だし、簡単だなと感じました!
AWSなどと比べても、極端に難しいこともないのでコスト的にもTencent Cloudの方が安いので、簡単なコンテンツの配置レベルであれば、Tencent Cloudでの実装もぜひ、検討してみてください!

その他にもアクセス制限ではIP制限もCDNの設定からホワイトリスト、ブラックリストと設定可能みたいです。

Tencent Cloud CDNについては、他のクラウドにはないPull型としての機能もあるみたいなので、その機能についてもまた、紹介していきたいと思います!