1. ローカルでの準備
- Vagrantのインストール。
- vagrant-aws のインストール。
vagrant plugin install vagrant-aws
- dummy ボックスの作成。
vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
2. AWSでの準備
1. アクセスキー、シークレットIDの取得
-
AWSのコンソールにログイン。
-
自分のアカウント名をクリックして表示されるドロップダウンメニューから「Security Credentials」を選択。
-
Access Keys (Access Key ID and Secret Access Key) を開いて「Create New Access Key」をクリック。
-
ポップアップに表示された「Download Key File」をクリックしてアクセスIDとシークレットキーのペアが記載されたファイルをダウンロード。
rootkey.csv
という名前で落ちてくる。 -
rootkey.csv
には以下のように記載されているので、これを今回はそれぞれMYAPP_AWS_ACCESS_KEY_ID
、MYAPP_AWS_SECRET_KEY
という名前で環境変数として設定した。rootkey.csv
AWSAccessKeyId=yourawsaccesskeyid
AWSSecretKey=yourawssecretkey
diff:$HOME/.bash_profile
- export MYAPP_AWS_ACCESS_KEY_ID=yourawsaccesskeyid
- export MYAPP_AWS_SECRET_KEY=yourawssecretkey
2. Key Pairs の作成
- EC2 > Key Pairs に移動。
- 「Create Key Pair」をクリック。
- 適当な名前をつける。ここでは
naoyes-myapp
としておく。 - 「Yes」をクリックすると鍵ペアが作成されてダウンロードされる。
naoyes-myapp.pem
というファイル名。 - これをローカルの任意の場所に置く。ここでは
/Users/naoyes/.ssh/naoyes-myapp.pem
としておく。
3. VPC Security Groups の作成
- VPC > Security Groups に移動。
- 「Create Security Group」をクリック。とりあえず外向けにはWEBとSSHを許容したいので以下の2つのセキュリティグループを作成した。各々
sg-XXXXXXXX
、sg-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 の確認
- VPC > Subnets に移動。
- 2つあるサブネットのうちの適当な片方のサブネット
subnet-ZZZZZZZZ
を採用。
以下、その理由を。
デフォルトVPCだとサブネットが2つ存在している。そのどちらも「明示的には」ルートテーブルに紐付けられていない。これはRoute Tablesに存在してる唯一のルートテーブルのAssociated With
が0 Subnets
となっていることから分かる。つまり2つのサブネットは一見宙ぶらりんな状態。
翻って、この唯一のルートテーブルはMain
がYes
となっている。つまりこのルートテーブルはいわゆるメインルートテーブルということになる。「宙ぶらりんな状態のサブネットはみんなこのルートテーブルが適用されますよ」というのがメインルートテーブルの役割。よって実は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```の作成
```ruby:/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アクセスしたらトップページが表示されることを確認した。