AWSのAMIと起動テンプレートを利用して開発環境を簡単に用意する(EC2環境の複製)

# 概要
共同で同じサービスやシステムを開発している際、作っている機能によっては環境に必要なパッケージや設定値などを細かく設定する必要がある。
都度、1から設定していると設定漏れ等により同じ環境を作れなくなったりする。

また、行っている作業によっては作業ミスにより環境を壊してしまって・・・

なんて、事はよくある話だと思われる。

そのような問題を解決する方法はいろいろあるけど、(vagrantとかだとこれ : https://qiita.com/rakuraku0615/items/5fcd59b1c6f263142ec5:title 等) 今回はAWS環境にて行う。

#### 今回行う事

 - AWS環境のAMIというサービスを利用する事により、使用している環境のバックアップを作成し、複製する。
 - EC2の起動テンプレートを利用することによりインスタンス起動後の作業を短縮&作業ミスを減らす

# 今回の要素

* Amazon EC2 (https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)

* Amazon マシンイメージ (https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html)

# 手順
<b>すでに環境はAWS EC2インスタンスで作成済みのものとします。</b>

#### Amazon マシンイメージ(AMI)の作成
バックアップの元となるイメージを作成する。

*  EC2 => インスタンスと選択

* 複製したいインスタンスのメニューから、イメージ => イメージの作成 を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/f1d66cf3-8e5e-86cd-b4ba-6a267c9cf283.png)

* 以下のような作成画面が出てくるので、AMI名、AMIについての説明、作成するAMIに紐づくEBSのスナップショットの設定を入力し、イメージの作成を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/b12369ab-dfda-3698-7498-ba8ddaa2649f.png)

* 左側サイドメニューのAMIを選択すると、作成したAMIが表示される。(ステータス = pendingは、現在作成中のAMI)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/c343ca55-90c4-0451-2cd9-051492802634.png)

* 使用可能になると、ステータス = availableになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/7c198652-4839-e11e-c3fb-12980fe95151.png)

これで、AMIの作成完了。

#### AMIからインスタンスを複製する
作成したAMIをベースにインスタンスを複製する。
(単純にAMIからインスタンスを立ち上げる"だけ"の場合)


* 左側サイドメニューのAMI => インスタンス作成時のベースとなるAMIを選ぶ。その後AMIのメニューから起動を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/4812a894-a266-1f25-e584-1f0b7f372932.png)

* 作成するインスタンスのタイプ等設定を決めてインスタンスを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/0e49796f-1375-c1e3-99f7-ecc29d102389.png)

* 認証鍵は以前使用していた鍵と同じ鍵でも、新しい鍵をつくるのでもよい。(使用者が自分で、今までの鍵の使用に問題なければ既存の物を使用すれば早い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/6def0815-dbc4-7c88-b415-bea689bd23d6.png)

* 作成の確認時にAMIが使用されている事を確認できれば、作成を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/62c3784e-2900-888f-61f6-25890de89a43.png)

<b>複製完了</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/9d6a9a1f-5eb4-a551-4ab8-f00ad70e6676.png)

#### 起動テンプレートの作成

予め起動テンプレートを作成する
* テンプレートの起動を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/dcf83a78-e360-5ddb-ff99-49888f713d26.png)

* 新しいテンプレートを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/e7d2ca58-ef38-9fe3-c4e5-45b69b966696.png)

* 必要な設定を追加していく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/a0c2e3b9-826d-2517-432f-5775d70d2596.png)

AMIは作成したイメージを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/e7bed1ad-19e5-0760-8d3e-415e1758284f.png)

キーペア、ネットワーク、セキュリティグループは必要な値を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/ca561af8-48e9-baf2-4cb3-84d5ff66d456.png)

ベースボリュームはAMIにより自動で決まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/5364ead3-e581-0a78-83a2-3c0cd4268690.png)

高度な詳細からユーザーデータ項目にて構築後実行して欲しいコマンド等を記入する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/b43dbe6e-a34f-9b6f-c903-aa0b6f2d7d7f.png)

* テンプレート作成を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/12166b47-3f1c-8d44-d776-f58e9861297b.png)

* ＊インスタンスからテンプレートを作成することも可能＊
ベースとなるインスタンスのAMIなどが自動選択されるので複製の元を作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/6a9c857c-1ab8-ca58-e016-c0b5e2073d0e.png)

#### 起動テンプレートからインスタンスを立ち上げる
* 起動したいテンプレートを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/9eebcfeb-fea9-b896-23e6-bc10577896be.png)

* アクションから"テンプレートからインスタンスを起動"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/09612c28-9841-f247-d95e-1c5b415a8f40.png)

* 起動を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/b4a69c9b-0b98-5ba3-596d-ab4df805dbb6.png)

* インスタンスが作成された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115125/e2e7033c-1b52-eb3a-a918-ba3ac34fe4d8.png)

* ユーザーデータに設定された内容が実行されたことを確認
* 
```
$ ls -l tmp_dir/
合計 4
drwxrwxr-x 4 ec2-user ec2-user 4096  4月 22 01:45 dotfiles
```

これでインスタンスの複製を行うことができた

# 注意する点

* インスタンス内のディレクトリ、ファイル等はコピーされるため、インスタンスごとで異なる設定を行う必要がある時にはそれぞれの対応が必要

* AMIにクレデンシャルファイル等を載せる場合(推奨しません)公開範囲はプライベートにすることを忘れずに行う

* Route53等DNSの設定等は複製されない

* AMIは作成された時点から更新が行われるわけではないので、環境の更新が頻繁に行われるようであれば、どこかでAMIを更新する作業が必要となる

* 今のところAMI作成については料金がかからないが、AMI作成の過程にあるEBSのスナップショットの作成については料金が発生する


---


これで、いつでも環境を壊す準備ができた。



* 新しいメンバーが入ってきて環境構築のサポートをしてあげたり

* 環境を壊してしまって細かい設定を検証しながら復旧させたり

と、細かい問題から

* サービスの負荷が耐えられないのでインスタンス数を増やして対応する

というところまで、幅広く問題を解決できるため、AWSのEC2インスタンスを使用しているなら是非とも使って置くことをお勧めします。

# 参考書籍
Amazon Web Servicesクラウドデザインパターン設計ガイド 

<a href="https://hb.afl.rakuten.co.jp/hgc/188c57a4.0efe8309.188c57a5.5f9c8220/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2Fa5c365757acd3847ba590929ad6561ed%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Frakutenkobo-ebooks%2Fi%2F14717876%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjMwMHgzMDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjF9" target="_blank" rel="nofollow noopener noreferrer" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/188c57a4.0efe8309.188c57a5.5f9c8220/?me_id=1278256&item_id=14717876&m=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F4347%2F2000003344347.jpg%3F_ex%3D80x80&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F4347%2F2000003344347.jpg%3F_ex%3D300x300&s=300x300&t=pict" border="0" style="margin:2px" alt="" title=""></a>