aws-sdk-core(aws-sdkのversion2)をつかって、Capistrano3でデプロイする場合にどのようにコードを書けばいいかあまり情報がなかったので、公式ドキュメントを見ながら、実装してみた。
access keyを使うので、IAMでアクセスコントロールをしておいたほうが良い。
現在は2.0.6.preを指定してgem installする。
# Gemfile
# AWS SDK for Ruby version2
gem 'aws-sdk', '2.0.6.pre'
deploy配下はこんな感じでインスタンスを取得
# config/deploy/staging.rb
require 'aws-sdk-core'
# Access keyとSecret Access Keyをつかって、EC2からpublic_dns_nameを取得する
ec2 = Aws::EC2::Client.new(
access_key_id: ENV['ACCESS_KEY_ID'],
secret_access_key: ENV['SECRET_ACCESS_KEY'],
region: 'ap-northeast-1')
# 検索条件は1、EC2に紐付いているtag情報 2、起動中のEC2で条件検索する。
# ここは自分の検索したい条件を色々変更することが可能。
ec2_filtered = ec2.describe_instances(
filters:[
{name: "tag:foo", values: ['bar']},
{name: 'instance-state-name', values: ['running']}
])
# 検索条件からpublic_dns_nameを取得する(array)
instances = ec2_filtered.reservations.map{|k| k.instances}[0].map{|k| k.public_dns_name}
role :app, *instances
role :web, *instances
server *instances,
user: 'ec2-user',
roles: 'localhost',
ssh_options: {
forward_agent: true,
auth_methods: ["publickey"],
# if you want to debug capistrano set verbose to debug
# verbose: :debug,
keys: ENV['AWS_PEM_PATH']}
set :stage, :production
set :rails_env, 'production'
上記はEC2からの検索だが、もちろんELB配下のpublic_dns_nameを取得することも可能。その際は Aws::ElasticLoadBalancing::Client
を使う。