Amazon CloudFrontの署名付きURLは、AmazonS3の署名付きURLとは動作が異なります。CloudFrontは、Amazonアカウントクレデンシャルページで設定する必要がある個別のCloudFrontキーペアに基づくRSAシグネチャを使用します。M2Cryptoライブラリを使用してPythonで時間制限付きURLを実際に生成するコードを次に示します。
CloudFrontのキーペアを作成する
これを行う唯一の方法は、AmazonのWebサイトを使用することだと思います。AWSの[アカウント]ページに移動し、[セキュリティクレデンシャル]リンクをクリックします。[キーペア]タブをクリックしてから、[新しいキーペアの作成]をクリックします。これにより、新しいキーペアが生成され、秘密キーファイル(pk-xxxxxxxxx.pem)が自動的にダウンロードされます。キーファイルを安全かつプライベートに保ちます。また、次のステップで必要になるため、Amazonの「キーペアID」を書き留めておきます。
PythonでいくつかのURLを生成する
botoバージョン2.0の時点では、署名されたCloudFrontURLの生成はサポートされていないようです。Pythonには標準ライブラリにRSA暗号化ルーチンが含まれていないため、追加のライブラリを使用する必要があります。この例ではM2Cryptoを使用しました。
非ストリーミングディストリビューションの場合、リソースとして完全なクラウドフロントURLを使用する必要がありますが、ストリーミングの場合、ビデオファイルのオブジェクト名のみを使用します。5分間しか持続しないURLを生成する完全な例については、以下のコードを参照してください。
このコードは、AmazonがCloudFrontドキュメントで提供しているPHPサンプルコードに大まかに基づいています。
from M2Crypto import EVP
import base64
import time
def aws_url_base64_encode(msg):
msg_base64 = base64.b64encode(msg)
msg_base64 = msg_base64.replace('+', '-')
msg_base64 = msg_base64.replace('=', '_')
msg_base64 = msg_base64.replace('/', '~')
return msg_base64
def sign_string(message, priv_key_string):
key = EVP.load_key_string(priv_key_string)
key.reset_context(md='sha1')
key.sign_init()
key.sign_update(message)
signature = key.sign_final()
return signature
def create_url(url, encoded_signature, key_pair_id, expires):
signed_url = "%(url)s?Expires=%(expires)s&Signature=%(encoded_signature)s&Key-Pair-Id=%(key_pair_id)s" % {
'url':url,
'expires':expires,
'encoded_signature':encoded_signature,
'key_pair_id':key_pair_id,
}
return signed_url
def get_canned_policy_url(url, priv_key_string, key_pair_id, expires):
#we manually construct this policy string to ensure formatting matches signature
canned_policy = '{"Statement":[{"Resource":"%(url)s","Condition":{"DateLessThan":{"AWS:EpochTime":%(expires)s}}}]}' % {'url':url, 'expires':expires}
#sign the non-encoded policy
signature = sign_string(canned_policy, priv_key_string)
#now base64 encode the signature (URL safe as well)
encoded_signature = aws_url_base64_encode(signature)
#combine these into a full url
signed_url = create_url(url, encoded_signature, key_pair_id, expires);
return signed_url
def encode_query_param(resource):
enc = resource
enc = enc.replace('?', '%3F')
enc = enc.replace('=', '%3D')
enc = enc.replace('&', '%26')
return enc
#Set parameters for URL
key_pair_id = "APKAIAZVIO4BQ" #from the AWS accounts CloudFront tab
priv_key_file = "cloudfront-pk.pem" #your private keypair file
# Use the FULL URL for non-streaming:
resource = "http://34254534.cloudfront.net/video.mp4"
#resource = 'video.mp4' #your resource (just object name for streaming videos)
expires = int(time.time()) + 300 #5 min
#Create the signed URL
priv_key_string = open(priv_key_file).read()
signed_url = get_canned_policy_url(resource, priv_key_string, key_pair_id, expires)
print(signed_url)
#Flash player doesn't like query params so encode them if you're using a streaming distribution
#enc_url = encode_query_param(signed_url)
#print(enc_url)
キーペアを保持しているアカウント(または、自分のアカウントの場合は「Self」)にTrustedSignersパラメーターを設定してディストリビューションを設定してください。
Pythonを使用したストリーミング用にこれを設定するための完全に機能する例については、Pythonを使用した安全なAWSCloudFrontストリーミングの開始を参照してください。