Edited at

vagrant-awsを使用する際のVagrantファイル詳細

More than 3 years have passed since last update.


使い方


  • vagrant-awsのインストール

vagrant plugin install vagrant-aws


  • 起動方法

vagrant up --provider=aws


Vagrantfileのサンプル

VAGRANTFILE_API_VERSION = "2"

$script = <<SCRIPT
#
echo 'Start ShellScript'
# タイムゾーンを日本に変更
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
# AWSのVolumeのリサイズ(デフォルトだと8GBのため)
sudo resize2fs /dev/sda1
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Box名
config.vm.box = "dummy"
# 「vagrant box add」をしなくていいように設定
config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
# 同期するフォルダを選択(vagrant-awsでは常に同期される訳ではなく、provisionやupなどのコマンド実行時に同期される)
config.vm.synced_folder "./", "/home/ec2-user/vagrant", disabled: true
config.vm.provider :aws do |aws, override|
# アクセスキー(リポジトリに入れたいので環境変数に保持)
aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
# シークレットアクセスキー(リポジトリに入れたいので環境変数に保持)
aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
# キー名
aws.keypair_name = "キーペア名"
# インスタンスタイプ(http://aws.amazon.com/jp/ec2/pricing/ を参照)
aws.instance_type = "c3.large"
# リージョン(東京はap-northeast-1)
aws.region = "ap-northeast-1"
# アベイラビリティゾーン
aws.availability_zone = "ap-northeast-1c"
# 使用するAMIのID
aws.ami = "AMIのID"
# セキュリティグループ(複数指定でor判定)
aws.security_groups = ['group1','group2']
# タグ
aws.tags = {
'Name' => '名前',
'Description' => '詳細'
}
# 最初に実行されるシェルスクリプト(sudoできるamiを作成した方が良い)
aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
# EBSの指定が可能
aws.block_device_mapping = [
{
# デバイス名
'DeviceName' => "/dev/sda1",
# 名称
'VirtualName' => "ボリューム名",
# ボリュームサイズ(GB単位)
'Ebs.VolumeSize' => 100,
# ターミネートした際に削除するかどうか
'Ebs.DeleteOnTermination' => true,
# EBSのタイプを指定
'Ebs.VolumeType' => 'standard',
#'Ebs.VolumeType' => 'io1',
# standardでIOPSを指定するとエラーが発生するので注意
#'Ebs.Iops' => 1000
}
]
# -----
# ここからはVPCを使用する際の設定
# サブネットID(マネジメントコンソールから取得)
#aws.subnet_id = 'サブネットID'
# VPC内のローカルIPアドレスを指定
#aws.private_ip_address = '192.168.0.33'
# 自動的にEIPを割り当てる場合(EIPの取得上限は5個のためそれ以上の指定はエラーとなる)
#aws.elastic_ip = true

# -----
# SSHのユーザー名を指定(AMIはec2-user、ubuntuはubuntu)
override.ssh.username = "ec2-user"
# SSHのKeyのパスを指定
override.ssh.private_key_path = "~/.ssh/aws-key.pem"
end
# シェルを実行
config.vm.provision "shell", inline: $script
# Chefを実行
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["./site-cookbooks"]
chef.add_recipe "php54"
chef.add_recipe "apache"
chef.json = {
}
# ログレベル
#chef.log_level = :debug
end
# 仮想環境にインストールするchefのバージョン(latestは最新バージョンという意味)
config.omnibus.chef_version = :latest

end


各オプションについて


  • vagrant-awsを使用する際のおまじない

config.vm.box = "dummy"

config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

aws.keypair_name = 'keypair'


知っておくと便利なこと


  • 「./.vagrant/machines/aws/id」にEC2のインスタンスIDが記述されているので削除すればAWS起動前と同じ状態になり、
    編集、作成すればVagrantで起動していないEC2インスタンスについても
    操作することが可能です。


その他


  • vagrant-awsはREADME.mdに書かれていないオプションがあるので使用する際には調査が必要

  • 便利ですけど個人的にはaws-cliとChefを組み合わせた方がいい気がします。

  • 今時はvagrant-aws使わないでProductionでは他のものを使ったほうがいいですね。


便利コマンド


  • AWSのインスタンスのIDを取得

INSTANCE_ID=`cat .vagrant/machines/default/aws/id | sed  "s/$//g"`


  • AWSのパブリックIDアドレスを取得(aws-cliが必要になります)

AWS_PUBLIC_IP=`aws ec2  describe-instances --instance-ids ${AWS_ID} | grep PublicIpAddress | awk {'print $2 '} | sed s/,//g | sed s/\"//g`