satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

CloudFrontを使ってみた

昨日のコードに機能追加をし、CloudFrontを使うようにしてみました。
CF = RightAws::AcfInterface.new(ACCESS, SECRET)
CF.create_distribution(get_domain_for_bucket(bucket), "distribution for #{bucket.name}"
ハマったのは2行目の第一引数。バケットをap-southeast-1のリージョンに作ったため、てっきりmybucket.s3-ap-southeast-1.amazonaws.comみたいなドメインを指定するのかと思っていたのですが、mybucket.s3.amazonaws.comの形式で指定しないと作れませんでした。
get_domain_for_bucketはbucket名にs3.amazonaws.comを付けてるだけのメソッドです。

あとは以下のようなコードでディストリビューションを選択し、そっちのドメインから配信するようにしてやればOKです。
dists = CF.list_distributions
#=> [{:aws_id=>"nnnnnnnnnnnnnn",
  :status=>"Deployed",
  :last_modified_time=>"2011-03-01T14:02:00.543Z",
  :domain_name=>"xxxxxxxxxxxxx.cloudfront.net",
  :origin=>"mybucket.s3.amazonaws.com",
  :comment=>"distribution for mybucket",
:enabled=>true}, {:aws_id=>"nnnnnnnnnnnnnn", :status=>"Deployed", :last_modified_time=>"2011-03-01T14:02:03.330Z", :domain_name=>"xxxxxxxxxxxxx.cloudfront.net", :origin=>"mybucket-thumb.s3.amazonaws.com", :comment=>"distribution for mybucket-thumb",
:enabled=>true}]

def get_distribution_for_bucket(bucket, dists)
  dists.detect{|dist| dist[:origin] =~ /#{bucket.name}.+/}
end
@bucket       = S3.bucket(bucket_name)
thumbs_bucket = S3.bucket(bucket_name+'-thumb')
dists         = CF.list_distributions
@dist         = get_distribution_for_bucket(@bucket, dists)
@thumbs_dist  = get_distribution_for_bucket(thumbs_bucket, dists)
# "http://#{@dist[:domain_name]}/#{key.name}"
こんな感じです。
これだけで世界中に効率よくコンテンツを配れるというのはすごいですね。