はじめに
S3 にあるファイルを特定のユーザーに限定して配信したい場合などがあるかと思いますが、その際、署名付きURL が役に立ちます。S3 と署名付きURLだけでも実現可能なのですが、本エントリーではよりセキュアな配信を可能にするために CloudFront も使ってみようと思います。
署名付きURLとは
アクセスを許可したいオブジェクトに対して期限を指定して URL を発行する機能です。バケットやオブジェクトのアクセス制御を変更することなく特定のオブジェクトに一時的にアクセスを許可したい場合に非常に有効です。
使用するサービス
- Amazon Simple Storage Service (Amazon S3)・・・AWS が提供するオブジェクトストレージサービス
- Amazon CloudFront・・・動画、アプリケーション、静的、動的なコンテンツを迅速かつ安全に配信できるコンテンツデリバリネットワーク(CDN)サービス
アーキテクチャ
実際に運用する際は上記のようになるのが一般的かと思いますが、今回は EC2 は使用せずに署名付きURLをローカルで作成します。
手順
- S3 バケットにファイルをアップロード
- ローカルで公開鍵・秘密鍵を作成
- 公開鍵を CloudFront に登録
- キーグループを CloudFront に 作成
- CloudFrontディストリビューションを作成
- 署名付きURLの生成
- 動作確認
1. S3 バケットにファイルをアップロード
以下のように画像をアップロードしました。
アップロードした画像はこちらです。
2. ローカルで公開鍵・秘密鍵を作成
署名付き URL を生成するためには公開鍵・秘密鍵を作成する必要があります。OpenSSL を使用して作成してみます。
まずは秘密鍵を作成します。
openssl genrsa -out private_key_presigned_url.pem 2048
秘密鍵から、CloudFront に登録するための公開鍵を作成します。
openssl rsa -pubout -in private_key_presigned_url.pem -out public_key_presigned_url.pem
作成完了です。
3. 公開鍵を CloudFront に登録
「パブリックキーを作成」をクリックします。
「名前」と「キー」を入力して「パブリックキーを作成」をクリックします。「キー」に入力する値は以下のコマンドで取得します。
cat public_key_presigned_url.pem | pbcopy
4. キーグループを CloudFront に 作成
「キーグループを作成」をクリックします。
登録した公開鍵を設定し、「キーグループを作成」をクリックします。
5. CloudFrontディストリビューションを作成
「ディストリビューションを作成」をクリックします。
「オリジンドメイン」に作成した S3 バケット、「S3バケットアクセス」で「はい、OAIを使用します」を選択します。
「ビューワーのアクセスを制限する」で「Yes」を選択、作成したキーグループを設定してデゥストリビューションを作成をクリックします。
6. 署名付きURLの生成
AWS CLI を使って CloudFront の署名付き URL を生成します。詳細はこちらを参照してください。
aws cloudfront sign \ --url https://d3pmk7agw3wwym.cloudfront.net/hane.jpg \ --key-pair-id xxxxxxxxx \ --private-key private_key_presigned_url.pem \ --date-less-than 2022-08-07T08:30:00+09:00
以下のように署名付きURLが生成されました。
https://d3pmk7agw3wwym.cloudfront.net/hane.jpg?Expires=1659828600&Signature=zJkStrKGj-pciCgh-vOyaMnD6zDMXvsalGA0PPGh2IdoHXyFX- ~中略~ rQKarrjBT3OymyWJDBZrjL6oJDORU2v1v94aDdeIukeXyIVqbyeZ8N7Py0aZznXVI16qsgtPHqzTx~OZXgOEYgrJRR73DzF08YbT3TTNUSGo70gMwMLzXKsCq0VWRWxE5PNZTZ1-ULaL3A__&Key-Pair-Id=xxxxxxxx
7. 動作確認
署名付きURLでアクセス
S3バケットに格納されている画像にアクセスすることができました。
通常URLでアクセス
アクセスできないことがわかりました。
署名付き URL の有効期限が切れた後に署名付きURLでアクセス
アクセスできないことがわかりました。
さいごに
AWS認定試験には必ずと言っていいほど出題される署名付きURLに関して何となく理解していたつもりでしたが、実際に自分で使い方を試してみることでより理解が深まった気がします。やはり座学ではなく実践で学ぶのが一番ですね。