読者です 読者をやめる 読者になる 読者になる

Tech memo

日々学んだ技術のびぼうろく

Vagrantで AWS EC2 を構築してみる

概要

vagrant-awsというプラグインを使用し、
EC2 インスタンスを Vagrant 経由で立ち上げる。

そうすると、EC2インスタンスの作成・停止・破棄などの操作を vagrant upvagrant destroy でローカルから実行できるようになる。

詳しい内容はこの本にも書いてある。 vagrant-aws 以外にもvagrant のことがかなり詳しく書いてあるためおすすめ。

実践 Vagrant

実践 Vagrant

vagrant 初心者にはこちらがおすすめ。

Vagrant入門ガイド

Vagrant入門ガイド

ひつようなもの

  • VirtualBox
  • Vagrant
  • AWS のアカウント

手順

AWS マネジメントコンソールでの作業

  1. Vagrant用ユーザとグループを作成
  2. セキュリティグループを作成
  3. キーペアを作成

ローカルでの作業

  1. vagrant-aws, dotenvのインストール
  2. Vagrantfile編集
  3. vagrant up

AWS マネジメントコンソールでの作業

1. Vagrant用ユーザとグループを作成

Vagrant が AWS にアクセスするためのユーザとグループを作成する。

ユーザの作成

  1. 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
  2. 左メニューの「ユーザ」を選択
  3. 「新規ユーザの作成」より新規ユーザを作成
  4. ユーザ名を入力(例:vagrant)
  5. 「作成」でユーザを作成
  6. 「認証情報をダウンロード」よりcsvファイルを保存

認証情報は vagrant-aws で使用するため、大切に保管しておく。

グループの作成

  1. 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
  2. 左メニューの「グループ」を選択
  3. 「新しいグループの作成」より新規グループを作成
  4. グループ名を入力(例:vagrant) -> 「次のステップ」
  5. ポリシーのアタッチで「PowerUserAcess」を選択 -> 「次のステップ」
  6. 「作成」でグループを作成

グループにユーザを登録

  1. 「サービス > セキュリティ&アイデンティティ > IAM」 を選択
  2. 左メニューの「グループ」を選択
  3. 作成したグループを選択(今回はvagrant)
  4. 「グループのアクション > グループにユーザを追加」を選択
  5. 作成したユーザを選択(今回はvagrant) -> 「ユーザの追加」

2. セキュリティグループを作成

vagrant-aws で EC2 を作成する際に指定するセキュリティグループを事前に作成する。

  1. EC2ダッシュボードに移動
  2. 左メニューの「セキュリティグループ」を選択
  3. 「セキュリティグループの作成」より新規セキュリティグループを作成
  4. セキュリティグループの設定を入力
    • セキュリティグループ名 : vagrant
    • 説明 : vagrant-aws test
    • VPC : 適当なvpcを選択
  5. インバウンドのルールに以下を追加
    • SSH : 任意の場所
    • HTTP : 任意の場所
    • HTTPS : 任意の場所
  6. 「作成」でセキュリティグループを作成

3. キーペアを作成

Vagrant が AWS にアクセスする際に使用するキーペアを作成する。

  1. EC2ダッシュボードに移動
  2. 左メニューの「キーペア」を選択
  3. 「キーペアの作成」より新規キーペアを作成
  4. キーペア名(例:vagrant)を入力
  5. 「作成」でキーペアを作成、同時にローカルにインストールされる

ダウンロードしたキーペアは大切に保管しておく。

ローカルでの作業

ローカルにてテスト用のディレクトリを作成し、そこで作業を行う。

$ 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 とプロビジョニングツールを組み合わせても同じことが可能。

参考

関連記事

www.yjhm214.com

www.yjhm214.com

スポンサーリンク