読者です 読者をやめる 読者になる 読者になる

satococoa's blog

Web や iOS アプリを作るエンジニアの日記です

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}"
こんな感じです。
これだけで世界中に効率よくコンテンツを配れるというのはすごいですね。