Vagrantで AWS EC2 を構築してみる
概要
vagrant-awsというプラグインを使用し、
EC2 インスタンスを Vagrant 経由で立ち上げる。
そうすると、EC2インスタンスの作成・停止・破棄などの操作を vagrant up
やvagrant destroy
でローカルから実行できるようになる。
詳しい内容はこの本にも書いてある。 vagrant-aws 以外にもvagrant のことがかなり詳しく書いてあるためおすすめ。
- 作者: Mitchell Hashimoto,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/02/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (10件) を見る
vagrant 初心者にはこちらがおすすめ。
- 作者: 新原雅司
- 出版社/メーカー: 技術評論社
- 発売日: 2013/09/12
- メディア: Kindle版
- この商品を含むブログ (5件) を見る
ひつようなもの
- VirtualBox
- Vagrant
- AWS のアカウント
手順
AWS マネジメントコンソールでの作業
- Vagrant用ユーザとグループを作成
- セキュリティグループを作成
- キーペアを作成
ローカルでの作業
- vagrant-aws, dotenvのインストール
- Vagrantfile編集
- vagrant up
AWS マネジメントコンソールでの作業
1. Vagrant用ユーザとグループを作成
Vagrant が AWS にアクセスするためのユーザとグループを作成する。
ユーザの作成
- 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
- 左メニューの「ユーザ」を選択
- 「新規ユーザの作成」より新規ユーザを作成
- ユーザ名を入力(例:vagrant)
- 「作成」でユーザを作成
- 「認証情報をダウンロード」よりcsvファイルを保存
認証情報は vagrant-aws で使用するため、大切に保管しておく。
グループの作成
- 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
- 左メニューの「グループ」を選択
- 「新しいグループの作成」より新規グループを作成
- グループ名を入力(例:vagrant) -> 「次のステップ」
- ポリシーのアタッチで「PowerUserAcess」を選択 -> 「次のステップ」
- 「作成」でグループを作成
グループにユーザを登録
- 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
- 左メニューの「グループ」を選択
- 作成したグループを選択(今回はvagrant)
- 「グループのアクション > グループにユーザを追加」を選択
- 作成したユーザを選択(今回はvagrant) -> 「ユーザの追加」
2. セキュリティグループを作成
vagrant-aws で EC2 を作成する際に指定するセキュリティグループを事前に作成する。
- EC2ダッシュボードに移動
- 左メニューの「セキュリティグループ」を選択
- 「セキュリティグループの作成」より新規セキュリティグループを作成
- セキュリティグループの設定を入力
- セキュリティグループ名 : vagrant
- 説明 : vagrant-aws test
- VPC : 適当なvpcを選択
- インバウンドのルールに以下を追加
- SSH : 任意の場所
- HTTP : 任意の場所
- HTTPS : 任意の場所
- 「作成」でセキュリティグループを作成
3. キーペアを作成
Vagrant が AWS にアクセスする際に使用するキーペアを作成する。
- EC2ダッシュボードに移動
- 左メニューの「キーペア」を選択
- 「キーペアの作成」より新規キーペアを作成
- キーペア名(例:vagrant)を入力
- 「作成」でキーペアを作成、同時にローカルにインストールされる
ダウンロードしたキーペアは大切に保管しておく。
ローカルでの作業
ローカルにてテスト用のディレクトリを作成し、そこで作業を行う。
$ mkdir vagrant-aws && $_
1. vagrant-aws, dotenvのインストール
下記コマンドで vagrant-aws をインストールする。
$ vagrant plugin install vagrant-aws
次に、dotenv をインストールする。
AWS の認証情報は Vagrantfile ではなく別ファイル(.envファイル)に記述する。
なぜこのようなことをするのかというと、
Vagrantfile は大抵のプロジェクトにおいて、バージョン管理ツールの管理対象とする。
その際、Vagrantfile に直接 AWS の認証情報を記述してしまうと、
認証情報が第三者に見える状態となってしまうためである。
.env ファイルを使用できるようにするためには dotenv プラグインが必要なのでインストールする。
$ vagrant plugin install dotenv
最後に各プラグインの確認。
$ vagrant plugin list dotenv (2.0.2) vagrant-aws (0.6.0)
2. Vagrantfile編集
Vagrantfileを作成する。
$ vagrant init
作成されたVagrantfileひな形を下記のように編集。
# -*- mode: ruby -*- # vi: set ft=ruby : # .env読み込み require 'dotenv' Dotenv.load VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # AWS 利用時はOSイメージは必要ないが、Boxは必要なためダミーを用意 config.vm.box = "dummy" config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box" # aws設定 config.vm.provider :aws do |aws, override| # AWS認証情報 aws.access_key_id = ENV['AWS_ACCESS_KEY_ID'] aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY'] aws.keypair_name = ENV['AWS_KEYPAIR_NAME'] # Amazon Linux AMI 2015.09 (HVM), SSD Volume Type を使用 # awsコンソール -> インスタンスの作成 -> 「ステップ 1: Amazon マシンイメージ(AMI)」より aws.ami = "ami-9a2fb89a" aws.instance_type = "t2.micro" aws.instance_ready_timeout = 120 aws.terminate_on_shutdown = false aws.security_groups = [ ENV['AWS_SECURITY_GROUP'] ] aws.region = "ap-northeast-1" # aws.availability_zone = "ap-northeast-1a" aws.tags = { "Name" => "vagrant-aws", "Description" => "vagrant-aws test", } # eipの自動割当 aws.elastic_ip = true # ssh設定 override.ssh.username = 'ec2-user' override.ssh.private_key_path = ENV['AWS_SSH_PRIVATE_KEY_PATH'] # sudo設定(tty 許可) aws.user_data = <<-USER_DATA #!/bin/sh sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers USER_DATA end end
次にVagrantfileと同じ階層に.envファイルを作成する。
# ユーザ作成時に取得したアクセスキー AWS_ACCESS_KEY_ID = "xxx" # ユーザ作成時に取得したシークレットアクセスキー AWS_SECRET_ACCESS_KEY = "xxx" # 作成したキーペア名 AWS_KEYPAIR_NAME = "vagrant" # セキュリティグループ名 AWS_SECURITY_GROUP = "vagrant" # awsに接続するためのssh鍵 AWS_SSH_PRIVATE_KEY_PATH = "/path/to/vagrant.pem"
3. vagrant up
vagrant up
を実行し、Vagrant 経由で EC2 インスタンスの構築を行う。
$ vagrant up --provider=aws Bringing machine 'default' up with 'aws' provider... ==> default: Warning! The AWS provider doesn't support any of the Vagrant ==> default: high-level network configurations (`config.vm.network`). They ==> default: will be silently ignored. ==> default: Launching an instance with the following settings... ==> default: -- Type: t2.micro ==> default: -- AMI: ami-9a2fb89a ==> default: -- Region: ap-northeast-1 ==> default: -- Keypair: vagrant ==> default: -- Elastic IP: true ==> default: -- User Data: yes ==> default: -- Security Groups: ["vagrant"] ==> default: -- User Data: #!/bin/sh ==> default: sed -i -e 's/^\(Defaults.*requiretty\)/#\1/' /etc/sudoers ==> default: -- Block Device Mapping: [] ==> default: -- Terminate On Shutdown: false ==> default: -- Monitoring: false ==> default: -- EBS optimized: false ==> default: -- Assigning a public IP address in a VPC: false ==> default: Waiting for instance to become "ready"... ==> default: Waiting for SSH to become available... ==> default: Machine is booted and ready for use! ==> default: Rsyncing folder: /path/to/your/dir/ => /vagrant
インスタンスにssh接続
$ vagrant ssh __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/ No packages needed for security; 7 packages available Run "sudo yum update" to apply all updates. [ec2-user@remote]$
SSH情報
$ vagrant ssh-config Host default HostName xx.xxx.xxx.xxx User ec2-user Port 22 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile vagrant.pem IdentitiesOnly yes LogLevel FATAL
インスタンスの停止
$ vagrant halt ==> default: Stopping the instance...
インスタンスの削除
$ vagrant destroy ==> default: Terminating the instance...
まとめ
VagrantでEC2インスタンスを作成した。
ansible, chef などのプロビジョニングツールと併用すると、
vagrant up
のみで「EC2インスタンス立ち上げ->環境構築」まで行える。
こうすると、Vagrant + プロビジョニングツールを使った Infrastructure as Code のようなことができる。
また、Vagrant にこだわらないのであれば、aws-cli とプロビジョニングツールを組み合わせても同じことが可能。
参考
関連記事
スポンサーリンク