Subscribed unsubscribe Subscribe Subscribe

VagrantからAWSのEC2インスタンスを起動してみる

VagrantからAWSの操作ができれば、自身のMac Book Proで開発して、
vagrant upとすることで検品もしくは、本番環境に反映することができます。
実際、個人的なWEBサービスなら本番環境に即時反映でもいいと考えています。
その方がスピード感があり、開発フローがシンプルになります。

今回使用するのは、Vagrantの作者Mitchell Hashimoto氏がメンテしている、
以下のvagrant-awsというvagrantプラグインです。
Rubyで記述されています。

まずは今回必要となるvagrantプラグインをインストールします。

プラグインのインストール

$ vagrant plugin install vagrant-aws

vagrantawsAPIが操作できるようになります

  • dotenv
$ vagrant plugin install dotenv

※.envファイルにawsへのアクセス情報を記載して、VagarntfileからはENV['キー名']で使用できるようにします。
※VagrantfileにはDotenv.loadとの1行を入れれば.envファイルが読み込まれます。
※これで.gitignoreに.envと追記すれば非公開情報以外のものをgithubに置けます。

EC2 Management Consoleでuser,group,keypair,security_groupの作成

省略

.envの作成

# vagrantのproviderはデフォルトではVirtualBoxなのですが、
# これでvagrant upの対象がawsになります。
# vagrant up --provider=awsとしたい場合はコメントアウトしてください。 
VAGRANT_DEFAULT_PROVIDER="aws"

# AWSの認証情報
AWS_SSH_USERNAME = "ec2-user"
AWS_SSH_KEY = {{xxxx.pemへの絶対パス}}
AWS_ACCESS_KEY_ID = {{アクセスキーID}}
AWS_SECRET_ACCESS_KEY = {{シークレットアクセスキー}}
AWS_KEYPAIR_NAME = {{xxxx.pemのxxxxの部分}}
AWS_SECURITY_GROUP = {{セキュリティグループ名}}

AWS_SSH_USERNAME:
Amazon Linux の場合は、デフォルトのユーザー名は ec2-user です。
RHEL5 の場合は、ユーザー名は root または ec2-user のどちらかです。
Ubuntu の場合は、ユーザー名は ubuntu です。
Fedora の場合は、ユーザー名は fedora または ec2-user のどちらかです。
SUSE Linux の場合は、ユーザー名は root です。
参照

AWS_SSH_KEY:
xxxx.pemはEC2 Management ConsoleでKey Pair作成時に落ちてきます。

AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY:
EC2 Management Consoleでユーザー作成時に落ちてくるcredentials.csvに記載されています。

AWS_SECURITY_GROUP:
こちらもEC2 Management Consoleで作成したものを記載してください。
自身のIPからのみのInboundのSSH,HTTPを許可することも忘れずに。

boxの作成

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

※boxは必要なので、ダミーのボックスを作成します。

Vagrantfileの編集

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

# .envの情報を読み込み
Dotenv.load

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ec2"
  config.vm.synced_folder "./", "/vagrant"

  # AWS settings
  config.vm.provider :aws do |aws, override|
    # アクセスの設定
    override.ssh.username         = ENV['AWS_SSH_USERNAME']
    override.ssh.private_key_path = ENV['AWS_SSH_KEY']
    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']
    aws.security_groups           = [ENV['AWS_SECURITY_GROUP']]
    #aws.session_token            = "SESSION TOKEN"
    
    # インスタンスの設定
    # amiはEC2 Management Consoleで事前に作成しておく
    aws.region                 = "ap-northeast-1"
    aws.availability_zone      = "ap-northeast-1a"
    aws.instance_type          = "t2.micro"
    aws.instance_ready_timeout = 120
    aws.terminate_on_shutdown  = false
    aws.ami = "ami-90948091"
    aws.tags = {
      "Name"        => {{インスタンス名},
      "Description" => {{ディスクリプション}},
    }

    # sudoをttyでログインしているユーザからも実行できるようにする
    aws.user_data = <<-USER_DATA
    #!/bin/sh
    echo "Defaults    !requiretty" > /etc/sudoers.d/vagrant-init
    chmod 440 /etc/sudoers.d/vagrant-init
    USER_DATA
  end
end

EC2インスタンスの作成

$ vagrant up
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: Starting the instance...
==> 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: /Users/k_higo/vagrant-ec2/ => /vagrant

これでvagrantを使用して、EC2インスタンスが作成されました。

f:id:keiwt:20150104192040p:plain

EC2インスタンスをStopする場合

$ vagrant halt

EC2インスタンスをTerminateする場合

$ vagrant destroy

EC2インスタンスにアクセスしてみる

$ vagrant ssh

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
18 package(s) needed for security, out of 42 available
Run "sudo yum update" to apply all updates.
$ pwd
/home/ec2-user

ちなみにソースは以下を参照してみてください。