Vagrant AWS Provider で EC2 上に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを乗っけて、 SSH で接続可能に。

# Vagrant AWS Provider で EC2 上に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを乗っけて、 SSH で接続可能にする #vagrant #ec2 #coreos #docker
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Vagrant AWS Provider で EC2 上に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを乗っけて、 SSH で接続可能にする
## <i class="fa fa-cube" style="font-size:1em;"></i> 前提
* EC2 で security group を作成し、 ssh 用の該当ポートをあけておく
* EC2 で keypair を作成しておく
* Vagrant dotenv plugin をインストールしておく
    * EC2 の環境変数の設定に利用します
* CoreOS 上の Docker コンテナに SSH 接続するのは推奨される作法ではないらしいのですが、諸事情があり利用します
    * <i class="fa fa-external-link-square" style="font-size:1em;"></i> [【翻訳】Dockerコンテナ内でSSHDを実行してはいけない理由](http://postd.cc/docker-ssh-considered-evil/)
* Docker の基本操作については下記参照
    * [Docker | 基本操作コマンドについて](http://qiita.com/tbpgr/items/5370bf6bc945c3cf3ec0)
    * [Docker | Images](http://qiita.com/tbpgr/items/9276887b213003aa84eb)

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-cloud-download" style="font-size:1em;"></i> Vagrant AWS Provider Plugin をインストール

~~~bash
vagrant plugin install vagrant-aws
~~~

### <i class="fa fa-cloud-download" style="font-size:1em;"></i> ダミーの Vagrant box をダウンロード
Vagrant AWS Provider を利用する場合、ダミーの box が必要になります。
詳しくは、下記リンク先参照
<i class="fa fa-github-square" style="font-size:1em;"></i> [Vagrant AWS Provider GitHub](https://github.com/mitchellh/vagrant-aws)

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

### <i class="fa fa-gear" style="font-size:1em;"></i> Vagrantfile の作成

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

# 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 = "dummy"

  config.vm.provider :aws do |aws, override|
    Dotenv.load # vagrant dotenv plugin を利用して .env ファイルから環境変数をロード
    aws.access_key_id             = ENV['ACCESS_KEY_ID']
    aws.secret_access_key         = ENV['SECRET_ACCESS_KEY']
    aws.keypair_name              = ENV['KEY_PAIR_NAME']

    aws.region                    = "ap-northeast-1"
    aws.ami                       = 'ami-858eb884' # CoreOS のマシンイメージ
    aws.instance_type             = 't1.micro'
    aws.security_groups           = 'sample' # CoreOS への接続用と、 Ubuntu 

    override.ssh.username         = "core"
    override.ssh.private_key_path = "~/.ssh/sample.pem"
  end
end
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> .env の作成

~~~
ACCESS_KEY_ID=your_access_key
SECRET_ACCESS_KEY=your_secret_access_key
KEY_PAIR_NAME=sample
~~~

### <i class="fa fa-cloud" style="font-size:1em;"></i> EC2 に CoreOS インスタンスを作成
Vagrant up でインスタンスを作成します

~~~
$ cd /path/to/your/vagrant_file
$ vagrant up --provider=aws
# $ vagrant.exe up --provider=aws # windows の場合は exe を実行する
~~~

### <i class="fa fa-cloud" style="font-size:1em;"></i> EC2 上の CoreOS に ssh 接続する

~~~bash
$ cd /path/to/your/vagrant_file
$ vagrant ssh
# $ vagrant.exe ssh # windows の場合は exe を実行する
Last login: Thu Dec  4 07:38:23 2014 from localhost
CoreOS (stable)
core@ip-some_ip ~ $ whoami
core
core@ip-some_ip ~ $ docker version
Client version: 1.2.0
Client API version: 1.14
Go version (client): go1.3.1
Git commit (client): fa7b24f
OS/Arch (client): linux/amd64

Server version: 1.2.0
Server API version: 1.14
Go version (server): go1.3.1
Git commit (server): fa7b24f
~~~

※ ssh コマンドで接続してもよい

~~~bash
$ ssh -i ~/.ssh/sample.pem core@some_ip
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> Dockfile の作成

~~~bash
core@some_ip ~ $cat << EOF > Dockerfile
FROM ubuntu:trusty
MAINTAINER your_name <some@mail_address.hogehoge.co.jp>
RUN apt-get update
RUN apt-get install -y openssh-server
RUN useradd -m -s /bin/bash core
RUN mkdir -p /home/core/.ssh; chown core:core /home/core/.ssh; chmod 700 /home/core/.ssh
ADD .ssh/authorized_keys /home/core/.ssh/
RUN chown core /home/core/.ssh/authorized_keys; chmod 600 /home/core/.ssh/authorized_keys
RUN chown -R core:core /home/core/.ssh
RUN echo "core    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers.d/core
RUN /etc/init.d/ssh start
RUN /etc/init.d/ssh stop
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
EOF
~~~

### <i class="fa fa-gavel" style="font-size:1em;"></i> イメージの作成

~~~bash
core@some_ip ~ $ sudo docker build -t="sample/ubuntu:trusty" .
~~~

### <i class="fa fa-search-plus" style="font-size:1em;"></i> イメージの確認

~~~bash
core@some_ip ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sample/ubuntu       trusty              7739e9be341f        16 hours ago        255.7 MB
<none>              <none>              0b9f16a0bfe8        18 hours ago        255.7 MB
ubuntu              trusty              86ce37374f40        9 days ago          192.7 MB
~~~

### <i class="fa fa-play-circle" style="font-size:1em;"></i> コンテナの起動
* -d はデタッチモード。コンテナをバックグラウンドで実行。
* -p はポートフォワードの設定

~~~bash
core@some_ip ~ $ sudo docker run -d -p 2222:22 sample/ubuntu:trusty /usr/sbin/sshd -D
~~~

### <i class="fa fa-search-plus" style="font-size:1em;"></i> 起動確認

~~~bash
core@some_ip ~ $ docker ps -a
CONTAINER ID        IMAGE                  COMMAND               CREATED             STATUS              PORTS                  NAMES
5fac64bc7c27        sample/ubuntu:trusty   "/usr/sbin/sshd -D"   49 minutes ago      Up 49 minutes       0.0.0.0:2222->22/tcp   thirsty_heisenberg
~~~

## <i class="fa fa-search-plus" style="font-size:1em;"></i> ローカル環境からの接続確認

~~~bash
$ ssh -i ~/.ssh/sample.pem core@some_ip -p 2222
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.2.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

$ whoami
core
~~~

## <i class="fa fa-trophy" style="font-size:1em;"></i> Complete !

## <i class="fa fa-exclamation-circle" style="font-size:1em;"></i> ハマりポイント
* Dockerfile で ADD を利用するの際に dis のディレクトリの最後に `/` （スラッシュ） をつけること。
  サンプルの設定が載ったいくつかのサイトがスラッシュなしのだったのでハマった。
    * <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Docker 公式サイトドキュメント |Dockerfile ADD](https://docs.docker.com/reference/builder/#add)

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
<i class="fa fa-external-link" style="font-size:1em;"></i> [Docker (土曜日に podcast します)](http://d.hatena.ne.jp/naoya/20130620/1371729625)
<i class="fa fa-external-link" style="font-size:1em;"></i> [coreos-vagrantでDockerしてみてわかったこととかハマったこととか](http://iakio.hatenablog.com/entry/2013/11/28/002657)
<i class="fa fa-external-link" style="font-size:1em;"></i> [dockerのUbuntuにsshで接続するAdd Star](http://d.hatena.ne.jp/seinzumtode/20140315/1394897302)
<i class="fa fa-github-square" style="font-size:1em;"></i> [Vagrant AWS Provider GitHub](https://github.com/mitchellh/vagrant-aws)