概要
画像コンテンツを扱うアプリのバックエンドをRails/EC2/S3/CloudFrontで作った。
コンテンツ保護のためCloudFrontの署名付きURLを使ったが、何やらAWSのSDKとやらが必要だったのでそのメモ。
前提
S3/CloudFrontの設定と署名用のキーペアの作成が終わっていること。
下記を参考にさせてもらったらバッチリできた。
CloudFront+S3で署名付きURLでプライベートコンテンツを配信する
https://dev.classmethod.jp/cloud/aws/cf-s3-deliveries-use-signurl/
しかし、肝心の署名付きURLの発行しようとしたらRubyのサンプルがなくて詰んだ。
泣きながら初心者なりに試行錯誤して見ると一応動いた。
やったこと
AWS SDK をGemで追加して
Gemfile
gem 'aws-sdk-cloudfront'
キーペアのIDとダウンロードした秘密鍵を指定し、署名付きURLを発行する。
url_signer.rb
signer = Aws::CloudFront::UrlSigner.new(
key_pair_id: "APKA9ONS7QCOWEXAMPLE", # 鍵ID
private_key_path: "tmp/pk-cloudfront.pem" # 鍵ファイル
)
# 5分間有効な署名付きURLを発行
signed_url = signer.signed_url(
"https://d111111abcdef8.cloudfront.net/images/image.jpg",
expires: Time.now.getutc + 5.minute
)
# 発行された署名付きURL
# signed_url = https://d111111abcdef8.cloudfront.net/images/image.jpg?Expires=123456789&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=APKA9ONS7QCOWEXAMPLE
これだけだ。
発行したURLでアクセスするとちゃんとコンテンツにアクセスできたし、有効期間(5分)が過ぎた後はちゃんとアクセスが拒否された。
ちなみにexpiresではなくpolicyも指定できるので、もっと複雑な条件も指定できるらしい。