AWSの無料枠を使ってEC2インスタンス上にDockerホストを構築する


# 概要
AWSの無料枠、EC2だと一番小さなt2.microだけど、いろいろと試すことが可能です。たとえば、docker-machine経由でDockerホスト化して、様々なDockerコンテナを試してみるとか。

ここでは、AWSの無料枠にDockerホストを立ち上げて、DockerコンテナとしてGlassFishを立ち上げてみます。

以下の、3, 4, 5はオプションです。デフォルトが定義されているはずなので、それが使えます。

# 手順
1. AWSのアカウントを取得する
2. リージョンを決める
3. Virtual Private Cloud を作成する（オプション）
4. インターネットゲートウェイを作って、VPCにアタッチする（オプション）
5. ルートテーブルを修正してインターネットゲートウェイを追加する（オプション）
6. サブネットを作成する（オプション）
7. セキュリティブループを作りインバウンドルールを設定する
8. docker-machineでcentos with dockerのインスタンスを生成する
9. GlassFishをDockerコンテナとして導入する
10. 楽しんで！　have fun!

# 1. AWSのアカウントを取得する
こちからどうぞ。
![スクリーンショット 2015-12-09 2.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/79341/f653cfa5-c986-2913-2eef-72f1e7e2fc17.png "スクリーンショット 2015-12-09 2.18.24.png")


クレジットカードを登録するだけです。無料枠を超えたときのためです。AWSコンソールはとってもカスタマー思いなので安心してください。無料枠を超えるようなEC2インスタンスを作ろうとすると、枠超えちゃうけど大丈夫かい？、と聞いてくれます。素晴らしい。

今はなんとクリスマスセール？で$25分もらえちゃいます。いいなぁ。



# 2. リージョンを決める
無料枠で東京リージョンを使えます。早いです。

> でも、ここでは、諸事情により様々なリージョンを使います。
> 注意すべき点は都度説明します。



# 3. Virtual Private Cloud を作成する（オプション）
デフォルトのVirtual Private Coludを使わない場合に実施してください。これは、仮想のプライベートなクラウド、です。バプリックなクラウド上に、プライベート空間を作成するってことです。

AWSコンソールから、サービス→__VPC__と選択します。するとこんな画面が出ます。
![スクリーンショット 2015-12-09 2.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/79341/8cba595b-5f6a-e04f-685a-2902c0b046a1.png "スクリーンショット 2015-12-09 2.34.14.png")

ウィザードでなく、__VPCの作成__メニューからやってみましょう。

CIDRが、10.0.0.0/16です。
作るとこんな感じになります。
![スクリーンショット 2015-12-09 2.47.52.png](https://qiita-image-store.s3.amazonaws.com/0/79341/42bc19c1-d60c-3e1f-2d2d-0018f8104b1e.png "スクリーンショット 2015-12-09 2.47.52.png")






# 4. インターネットゲートウェイを作って、VPCにアタッチする（オプション）
VPCを作成した場合は必要に応じて__インターネットゲートウェイ__を作ります。インターネットアクセスを可能にするためのゲートウェイを作るということです。

このような感じで作ります。
![スクリーンショット 2015-12-09 2.51.44.png](https://qiita-image-store.s3.amazonaws.com/0/79341/354cc006-585b-e666-9dfc-0c5630bc579f.png "スクリーンショット 2015-12-09 2.51.44.png")

作れたら、それを選択して先ほど作成したVPCにアタッチします。
![スクリーンショット 2015-12-09 2.53.42.png](https://qiita-image-store.s3.amazonaws.com/0/79341/88e5ddd0-7f62-c48a-c45d-4e1b6cb29178.png "スクリーンショット 2015-12-09 2.53.42.png")




# 5. ルートテーブルを修正してインターネットゲートウェイを追加する（オプション）

インターネットゲートウェイを作成した場合は__ルートテーブル__に追加してやります。インターネットゲートウェイを作っただけでルートテーブルに追加していない場合は、当然ながらインターネットにアクセスできないVPCになっちゃいます。

やり方は、対象のVPCを選択して、ルートテーブルのリンクをクリックします。
![スクリーンショット 2015-12-09 2.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/79341/6699b795-0e47-6e02-1004-31ff876e6371.png "スクリーンショット 2015-12-09 2.56.47.png")

こんな感じで追加します。
![スクリーンショット 2015-12-09 2.58.14.png](https://qiita-image-store.s3.amazonaws.com/0/79341/426a2e56-74f8-c58e-2ff8-dc1e42e841a2.png "スクリーンショット 2015-12-09 2.58.14.png")





# 6. サブネットを作成する（オプション）
VPCを作成した場合はサブネットも作成します。

こんな感じでやります。
![スクリーンショット 2015-12-09 3.00.08.png](https://qiita-image-store.s3.amazonaws.com/0/79341/2baf5c16-8478-b7d3-d516-1ee1cc8aaf62.png "スクリーンショット 2015-12-09 3.00.08.png")

アベイラビリティゾーン違いで複数作るのが基本です。ここでは__us-west-2a__で作ってます。



# 7. セキュリティブループを作りインバウンドルールを設定する
EC2のコンソールを使います。docker-machineを使う場合は、__2376__ポートの開放が必要です。

![スクリーンショット 2015-12-09 3.08.59.png](https://qiita-image-store.s3.amazonaws.com/0/79341/dc62e037-359d-db9b-a82e-3d69ff7a952a.png "スクリーンショット 2015-12-09 3.08.59.png")



# 8. docker-machineでcentos with dockerのインスタンスを生成する
`docker-machine`を使います。次のようなスクリプトを実行します。環境に合わせて調整しましょう。

この設定例は、バージニア(us-east-1)向けの設定です。

> リージョンの英名？はこちら。[AWS リージョンを選択する](https://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-plan-region.html)


```bash
docker-machine --debug create \
    --driver amazonec2 \
    --amazonec2-access-key ***** \
    --amazonec2-secret-key ***** \
    --amazonec2-region us-east-1 \
    --amazonec2-ami ami-b57a3ddf \
    --amazonec2-ssh-user ec2-user \
    --amazonec2-instance-type t2.micro \
    --amazonec2-root-size 30 \
    --amazonec2-security-group sample \
    --amazonec2-vpc-id ***** \
    --amazonec2-subnet-id ***** \
    --amazonec2-zone a \
    sample
```


調整すべき値(amazonec2-xxxx)

|パラメータ |値 |
|:-------:|:-:|
|access-key|自分のアクセスキーを指定します|
|secret-key|自分のシークレットキーを指定します|
|region|リージョンを指定します|
|ami|Dockerを含んだイメージを指定します|
|ssh-user|イメージで生成されるインスタンスに接続できるユーザを指定します|
|instance-type|インスタンスタイプを指定します。無料枠がt2.microです|
|root-size|EBSのサイズです|
|security-group|先ほど作成したセキュリティグループを指定します|
|vpc-id|先ほど作成したVPCか既存のVPCのIDを指定します|
|subnet-id|指定したVPCに属するサブネットのIDを指定します|
|zone|指定したsubnetに対応したアペイラビリティゾーンを指定します|



参考:[docker Amazon Web Services](https://docs.docker.com/machine/drivers/aws/)

> 2015.12.11追記
> 未だにうまくいったりいかなかったりがあるようです。上のスクリプトは__--debug__を指定していますので何が失敗しているかがわかるかも。
> ちなみに成功すると最後はこんな感じになります。

>```
・・・
(sample) Calling RPCServerDriver.GetSSHUsername
Using SSH client type: external
Reticulating splines...
(sample) Calling RPCServerDriver.GetConfigRaw
(sample) Calling RPCServerDriver.GetConfigRaw
To see how to connect Docker to this machine, run: docker-machine env sample
```

> 通信状況の悪い環境でやると失敗することが多いような気がします。失敗した場合はamiイメージを変えてチャレンジしてみてください。

> なお、docker-machine ls してリストアップされるマシン以下のフォルダに格納されます。これが正常ケースです。ssh用の公開鍵/秘密鍵ペアの他に、プライベート認証局の秘密鍵と証明書、サーバーの秘密鍵と証明書、設定ファイルなどがあります。

> ```
$ ls -ort ~/.docker/machine/machines/sample
total 72
-rw-------  1 hagi   381 12 10 22:34 id_rsa.pub
-rw-------  1 hagi  1679 12 10 22:34 id_rsa
-rw-r--r--  1 hagi  1123 12 10 22:42 server.pem
-rw-------  1 hagi  1679 12 10 22:42 server-key.pem
-rw-------  1 hagi  1679 12 10 22:42 key.pem
-rw-r--r--  1 hagi  1050 12 10 22:42 cert.pem
-rw-r--r--  1 hagi  1025 12 10 22:42 ca.pem
-rw-------  1 hagi  4213 12 10 22:43 config.json
```

> 失敗した場合はファイルが欠損しているようです。たとえば、証明書関連がないとか。
> また、`docker-machine ls`したときにSTATEが__Error__となるケースがあります。

>```
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
sample          -        amazonec2    Error
```

>こうなった場合は、
> 1.証明書などが格納されているフォルダを削除する
> 2.AWS上のEC2インスタンスの残骸を削除する（あれば）
> 3 AWS上のキーペアの残骸を削除する（あれば）
> などの操作をしてから、あらためてチャレンジしてみてください。
>
> そのあたりの詳細はまた書きます。



# 9. glassfishをDockerコンテナとして導入する
[こちら](http://qiita.com/osuo/items/99a2b7413ce75f8217be#glassfishを動かす)を参考にして導入しましょう。


# 10. 楽しんで！　have fun!
Docker環境がクラウド上にできました！あとは様々なDockerコンテナをビルドして動かしてみてください！



# つぎは、Trend Micro の Deep Security as a service の導入
セキュリティ対策です。AWSなどのクラウド上にサービスを提供する環境を置く際、やっぱりセキュリティは大丈夫なの？という心配が少なくないですよね。従量課金でAWS無料枠のt2.microだと、0.01USD/Hourです。908円/月程度です。（1USD=122円、24H x 31日）

![スクリーンショット 2015-10-22 22.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/79341/7d7ea169-4dd4-224e-341b-099b3a100ce4.png "スクリーンショット 2015-10-22 22.34.53.png")

参考:http://www.trendmicro.com/cloud-content/us/pdfs/business/datasheets/ds_deep-security-as-a-service.pdf

導入手順はまた今度。