AWSのCloudFrontには署名付きURLという機能があります。
署名つきのURLを生成して、署名があるユーザーだけのアクセスが可能となります。
こちらを使って「有効期限付き」のWebアクセスの設定を行ってみます。
尚、CloudFrontを使わずにS3のみで大丈夫な場合は以下の記事で実施できます。
CloudFrontの設定
S3をオリジンとして参照するよう設定します。
S3はWebでの利用が可能なように「プロパティ」タブでは「静的ウェブサイトホスティング」を有効にします。
S3のバケットポリシーはCloudFrontの設定時に自動で上書いてしまいます。
また後に「ビヘイビア」の項目を編集してビューワーのアクセスを証明書付きのものに設定する必要があります。
こちら実施後にCloudFrontのキーペアの取得が必要になります。
AWS管理コンソールの右上のアカウント名のメニューをクリックし「セキュリティ認証情報」をクリックします。
こちらの「CloudFront」キーペアの項目を開き、「新しいキーペアの作成」を行い「プライベートキーファイル」「パブリックキーファイル」両方ダウンロードしましょう。
(利用するのは「プライベートキーファイル」のみです)
また、画面にある「アクセスキー ID」を控えておきます。
pythonを使って署名付きURLの発行
今回はpythonのboto3を使って署名付きURLの発行を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
from datetime import datetime, timedelta from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from botocore.signers import CloudFrontSigner def rsa_signer(message): with open('pk-XXXXXXXXXXXXXXXXXXXX.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1()) key_id = 'XXXXXXXXXXXXXXXXXXXX' url = 'https://XXX.cloudfront.net/index.html' expire_date = datetime.utcnow() + timedelta(minutes=60) cloudfront_signer = CloudFrontSigner(key_id, rsa_signer) # Create a signed url that will be valid until the specific expiry date # provided using a canned policy. signed_url = cloudfront_signer.generate_presigned_url( url, date_less_than=expire_date) print(signed_url) |
こちらはほぼAWSの以下のサンプルの通りです。
https://github.com/boto/boto3/blob/develop/boto3/examples/cloudfront.rst
こちらの「expire_date」の設定で設定された期間が有効なHTMLホスティングが実施できるようになりました。
今回はindex.htmlを対象としているのでurlにファイル名まで記載しています。
index.htmlにCloudFrontのWebホスティングとして接続するとアクセス権限で以下のようになります。
署名付きURLで制限時間内に接続すると以下のようになります。
また、制限時間を過ぎてしまうと以下のようになります。
設定は若干複雑ですが利用シーンの高い設定となります。
よりセキュアな設定が可能となりますので様々な利用シーンでの展開が可能となります。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。