AWS
Vagrant

VagrantでAmazon Web ServicesのVPCにAmazon Linuxのインスタンスを作成

More than 5 years have passed since last update.


1. ローカルでの準備


  1. Vagrantのインストール。

  2. vagrant-aws のインストール。

vagrant plugin install vagrant-aws


  1. dummy ボックスの作成。

vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box


2. AWSでの準備


1. アクセスキー、シークレットIDの取得


  1. AWSのコンソールにログイン。

  2. 自分のアカウント名をクリックして表示されるドロップダウンメニューから「Security Credentials」を選択。

  3. Access Keys (Access Key ID and Secret Access Key) を開いて「Create New Access Key」をクリック。

  4. ポップアップに表示された「Download Key File」をクリックしてアクセスIDとシークレットキーのペアが記載されたファイルをダウンロード。rootkey.csvという名前で落ちてくる。


  5. rootkey.csv には以下のように記載されているので、これを今回はそれぞれMYAPP_AWS_ACCESS_KEY_IDMYAPP_AWS_SECRET_KEYという名前で環境変数として設定した。


    rootkey.csv

    AWSAccessKeyId=yourawsaccesskeyid
    
    AWSSecretKey=yourawssecretkey


    $HOME/.bash_profile

    + export MYAPP_AWS_ACCESS_KEY_ID=yourawsaccesskeyid
    
    + export MYAPP_AWS_SECRET_KEY=yourawssecretkey




2. Key Pairs の作成


  1. EC2 > Key Pairs に移動。

  2. 「Create Key Pair」をクリック。

  3. 適当な名前をつける。ここではnaoyes-myappとしておく。

  4. 「Yes」をクリックすると鍵ペアが作成されてダウンロードされる。naoyes-myapp.pemというファイル名。

  5. これをローカルの任意の場所に置く。ここでは/Users/naoyes/.ssh/naoyes-myapp.pemとしておく。


3. VPC Security Groups の作成


  1. VPC > Security Groups に移動。

  2. 「Create Security Group」をクリック。とりあえず外向けにはWEBとSSHを許容したいので以下の2つのセキュリティグループを作成した。各々sg-XXXXXXXXsg-YYYYYYYYといった感じでIDが振られる。



    • sg-XXXXXXXX : Inbound 80 0.0.0.0/0, Outbound ALL


    • sg-YYYYYYYY : Inbound 22 0.0.0.0/0, Outbound ALL




4. VPC Subnet ID の確認


  1. VPC > Subnets に移動。

  2. 2つあるサブネットのうちの適当な片方のサブネットsubnet-ZZZZZZZZを採用。

以下、その理由を。

デフォルトVPCだとサブネットが2つ存在している。そのどちらも「明示的には」ルートテーブルに紐付けられていない。これはRoute Tablesに存在してる唯一のルートテーブルのAssociated With0 Subnetsとなっていることから分かる。つまり2つのサブネットは一見宙ぶらりんな状態。

翻って、この唯一のルートテーブルはMainYesとなっている。つまりこのルートテーブルはいわゆるメインルートテーブルということになる。「宙ぶらりんな状態のサブネットはみんなこのルートテーブルが適用されますよ」というのがメインルートテーブルの役割。よって実は2つのサブネットはともに暗黙的にはメインルートテーブルを使用することとなっている。

もう一度メインルートテーブルの中身を見てみる。0.0.0.0/0のターゲットがInternet Gatewayに向いていることからこれはインターネットとやりとりできそうだということがわかる。

今回はWEBサーバを設置したいのでこの2つのサブネットのどちらにインスタンスを置いても問題なさそう。というかもう一つインターナルなルートテーブルを作成してそこに片方のサブネットを紐付けてDBサーバインスタンスを置くのが常套か。

今回はとりあえずはそこまではしない。

よって2つあるうちの片方のサブネットsubnet-ZZZZZZZZを仮に採用


5. その他、設定値の決定


  • リージョン

ap-northeast-1


  • インスタンスタイプ

t1.micro


  • AMI
    Amazon Linux の'PV EBS-Backed 64 ビット'とした。

ami-3561fe34

以下を参考に。EBSルートデバイスとした。インスタンスタイプがmicroだし。

* http://d.hatena.ne.jp/torazuka/20110504/rootdevice

* http://aws.amazon.com/jp/amazon-linux-ami/


3. インスタンスの作成


1. 適当なディレクトリを掘ってvagrantを初期化

cd /path/to/myapp

vagrant init


2. Vagrantfileの作成


/path/to/myapp/Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "dev.myapp" do |machine|
machine.vm.box = "opscode-centos-6.5"
machine.vm.network :private_network, ip: "192.168.40.10"
end

config.vm.define "prod.myapp" do |machine|
machine.vm.box = "dummy"
machine.vm.provider :aws do |aws, override|
aws.access_key_id = ENV['MYAPP_AWS_ACCESS_KEY_ID']
aws.secret_access_key = ENV['MYAPP_AWS_SECRET_KEY']
aws.region = 'ap-northeast-1'
aws.instance_type = 't1.micro'
aws.ami = 'ami-3561fe34'
aws.security_groups = [
'sg-XXXXXXXX', # WEB
'sg-YYYYYYYY', # SSH
]
aws.keypair_name = 'naoyes-myapp'
aws.tags = {
'Name' => 'MYAPP',
'Env' => 'PROD',
}
aws.subnet_id = 'subnet-ZZZZZZZZ'

override.ssh.username = "ec2-user"
override.ssh.private_key_path = '/Users/naoyes/.ssh/naoyes-myapp.pem'
override.ssh.pty = true
end
end
end



  • ローカル上の開発環境をdev.myapp、AWS上の本番環境をprod.myappとして同一ファイルに記載してある。

  • Amazon Linuxの場合、override.ssh.pty = true の記述が無いとvagrant upの際に以下のエラーになった。そのあたりの議論はこちらに。
    https://github.com/mitchellh/vagrant/issues/1482

stderr from the command:

sudo: sorry, you must have a tty to run sudo


3. インスタンスの作成

vagrant up prod.myapp --provider=aws


これでAWS上のインスタンスのにsshで接続できる。またWEBサーバをインストールしてHTTPアクセスしたらトップページが表示されることを確認した。