ブログ

ryuzeeによるブログ記事。不定期更新

vagrant-awsの環境別オプション指定方法

全国1000万人のVagrantユーザーのみなさんこんにちは。今回はVagrantからAmazon EC2を操作する際に利用するvagrant-awsプラグインについて詳細を見ていきましょう。

インストール

もうこれは書くまでないのですが、以下のようにインストールしてください。
vagrant plugin install vagrant-aws

Amazon EC2のネットワークについて知っておこう

今回の肝はここです。Amazon EC2のインスタンスを立ち上げる際に選択可能な環境は3つあります。
  • EC2-Classic環境内に構築する
  • デフォルトVPCの環境内に構築する
  • 自分でVPCを定義し、その中に構築する
それぞれによってvagrant-awsで指定すべきオプションの内容が変わってきます。したがって自分がどの環境内にEC2のインスタンスを構築するのかをまず明らかにしてください。それぞれの違いは以下になります。

■ EC2-Classic EC2が登場した当時からある環境。自分のアカウント以外のアカウントによって作成されたインスタンスも含めて同じ公開用のネットワーク上に存在するイメージ(いわゆるパブリック)。起動時に自動でPublic DNS名が振られる

■ VPC 仮想プライベートクラウドの環境のことで、自分の好きなアドレス体系(例えば10.0.0.0/16)でネットワークを構成することができる。例えばサブネットを複数作ったり、インスタンスに固定のプライベートIPを振ったりすることも可能。最近、初回起動時にオプションの選択をすることでPublic DNS名を自動で付けられるようになった。

■ デフォルトVPC 2013年の5月頃以降にAWSアカウントを作成したり、はじめてあるリージョンにインスタンスを起動する場合にあらかじめ用意されるVPC。こちらの機能が有効になっている場合はEC2-Classicは利用できない。同様にEC2-Classicを利用している場合はデフォルトVPCは利用できない。 デフォルトVPCではローカルIPアドレスとして172.31.0.0/16が用意されており、インスタンス起動時にデフォルトで自動でPublic DNSが振られる

これらを踏まえて設定の方法を見ていきます。

EC2-Classic環境で、vagrant-awsを利用する

まずはコードをすべて載せておきます。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  #--- 以下を指定 -- 
  box_name = "dummy"
  box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  ssh_username = "ec2-user"
  security_groups = ["web"]
  region = "ap-northeast-1"
  availability_zone = "ap-northeast-1a"
  ami = "ami-b1fe9bb0"
  instance_type = "m1.medium" 
  #--- ここまで -- 

  config.vm.box = box_name
  config.vm.box_url = box_url

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_KEY']
    aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
    override.ssh.username = ssh_username
    override.ssh.private_key_path = ENV['AWS_PRIVATE_KEY_PATH']

    #---- EC2-Classic固有の設定 ----#
    # リージョンを設定
    aws.region = region 
    # AZを設定
    aws.availability_zone = availability_zone 
    # セキュリティグループを設定
    aws.security_groups = security_groups 
    #---- EC2-Classic固有の設定ここまで ----#

    # User-data 
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
    # タグを指定(任意)
    aws.tags = aws.tags = { "Name" => "test-classic-default-minimal", "env" => "dev"}
    # AMIを指定。起動したいリージョンにあるAMI
    aws.ami = ami 
    # インスタンスタイプを設定
    aws.instance_type = instance_type
  end
end 

EC2-Classic/VPC/デフォルトVPCに関係なく設定すべき項目としては以下があります。

  • APIをコールするためのアクセスキーとシークレットキー。今回は環境変数から読み込んでいます。一般的に機密情報なので、ベタで書いてしまうとバージョン管理システムに登録できなくなってしまいますので、外部から読むようにしてください
  • インスタンスにsshで接続する際のユーザー名。Amazon LinuxやRed Hat Linuxであればec2-user、ubuntuであればubuntuとなります
  • 起動したインスタンスに接続する際のキーペアの名前(マネジメントコンソールからEC2を起動する場合に選択する箇所がありますね)と、秘密鍵のパス
  • インスタンスを起動するリージョン
  • 起動するインスタンスの元となるAmazon Machine Image(AMI)のID
  • インスタンスに付与するタグの情報。例えば起動したインスタンスの名前やその他自分でタグのキーを作って値を設定することができます
  • User Data。これはインスタンスの初回起動時に、ここに設定した値をインスタンスに引き渡すことができます。#!から書き始めるとスクリプトとして認識されて実行されます

■ EC2-Classic固有の設定 次にEC2-Classicの場合の固有の設定をみていきます。

  • アベイラビリティーゾーン。インスタンスを起動するアベイラビリティゾーンを指定します。指定しない場合は起動時に自動で決められます。なお東京リージョンの場合はユーザーが利用可能なアベイラビリティゾーンは2つです
  • セキュリティグループ。この項目はVPCでも設定しますが、EC2-ClassicとVPCとで設定の仕方が異なります。EC2-Classicの場合は自分がセキュリティグループを作成したときに付けた名前を指定します
以上がEC2-Classic環境での話になります。

VPC環境での設定

次はVPC(非デフォルト)環境の場合です。またコードをみてみましょう。
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  #--- 以下を指定 -- 
  box_name = "dummy"
  box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  ssh_username = "ec2-user"
  subnet_id = "subnet-00d7c369"
  private_ip_address = "10.0.0.46"
  security_groups = ["sg-ea736a86"]
  region = "ap-northeast-1"
  ami = "ami-b1fe9bb0"
  instance_type = "t1.micro"
  #--- ここまで -- 

  config.vm.box = box_name
  config.vm.box_url = box_url

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_KEY']
    aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
    override.ssh.username = ssh_username
    override.ssh.private_key_path = ENV['AWS_PRIVATE_KEY_PATH']

    #---- VPC固有の設定 ----#
    # リージョンを設定
    aws.region = region 
    # サブネットIDを指定
    aws.subnet_id = subnet_id
    # VPC内のローカルIPを指定
    aws.private_ip_address = private_ip_address 
    # Public Subnet内を指定した場合
    # 自動的にEIPを取得して割り当てるので、EIPの取得上限数(5個)に注意
    aws.elastic_ip = true 
    # セキュリティグループを設定
    # ここではIDのリストを指定
    aws.security_groups = security_groups 
    #---- VPC固有の設定ここまで ----#

    # User-data 
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
    # タグを指定(任意)
    aws.tags = aws.tags = { "Name" => "test-minimal", "env" => "dev"}
    # AMIを指定。起動したいリージョンにあるAMI
    aws.ami = ami 
    # インスタンスタイプを設定
    aws.instance_type = instance_type
  end
end 

先ほどと同じところは割愛します。VPC環境で指定すべき項目は以下になります。

  • subnet_id:そのインスタンスを起動するサブネットのID(サブネットはマネジメントコンソールのVPCの画面の左側のナビゲーションから確認できます)。値はsubnet-xxxxxxxのような形になります
  • private_ip_address:割り当てするプライベートIPアドレスです。指定しない場合は当該subnetの内容に合致するプライベートIPアドレスが自動で割り当てられます
  • elastic_ip:trueに設定すると起動時に自動でElastic IP(固定IP)を取得して割り当てます。これを指定しない場合はグローバルIPアドレスもPublic DNS名も割り当てられないので、インターネット経由で直接起動したインスタンスにログインすることはできなくなります。例えばVPNなどでプライベートサブネットに直結している場合はなくても大丈夫ですが、一般的には指定が必要になります。なお、Elastic IPは1リージョン内ではデフォルトでは5個までしか使えません。既に使いきっている場合はこの割り当て処理ができないため、起動できません。必要に応じて上限緩和の申請を行ってください
  • security_groups:ここではインスタンスに割り当てるセキュリティグループを指定します。ただし、EC2-Classicの場合とは異なり、セキュリティグループのIDを指定します。sg-xxxxxxxxといった形になります。配列なので複数割り当てることもできます

デフォルトVPCの場合

最後にデフォルトVPCの場合です。この場合の唯一の違いは
    aws.elastic_ip = true 

の箇所が不要になる、という点です。デフォルトVPCの場合は起動時に自動でPublic DNSが割り当てられます。 ※もちろん指定しても構いませんが、その場合はEIPを新たに確保して割り当てられます。

以上が、それぞれの環境における設定の違いになります。 この違いをぜひ押さえて楽しいVagrant + AWSライフをお過ごしください!

なお、それぞれのソースコードは以下にあります。(それぞれリージョンが異なっているため、AMIの指定やキーペアの指定など注意してください)

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら