【AWS】作成済みのEC2インスタンスを複製する方法~AMIの作成~

# はじめに
似たようなEC2インスタンスを何個も作る際にAMIを使うととても便利だったのでまとめておきます
これによってRubyやNginx、Node.jsなどのパッケージのインストール作業などを何度もやらなくて済み、数分でインスタンスを複製できるのでとても便利でした


# 前提
AWSで作成済みのEC2インスタンスがある

# 対象読者
EC2インスタンスを新規で作成したいけど、パッケージのインストールなど諸々の作業がめんどくさいと思っている人

# AMIって何？
Amazon Machine Imageの略
インスタンスの作成に必要なソフトウェア構成 (OS、アプリケーションサーバー、アプリケーション) を含むテンプレートのこと

EC2インスタンスを作成する際に出てくる以下の画面で選択するのがAMIです
通常はここからAWSが提供しているAmazon Linux 2 AMIなどを選択してEC2インスタンスを作成しますが、
今回はこのAMIを自分で作ってそこからEC2インスタンスを作成するという流れになります
<img width="1438" alt="スクリーンショット 2020-02-09 18.33.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/5dfee69d-41ec-55fe-c5e4-52bb1182307d.png">

# 作業の流れ
1. 複製元となるEC2インスタンスからAMIイメージを作成する
2. AMIイメージから新規のEC2インスタンスを作成する
3. 作成したインスタンスにssh接続して、インスタンスの中身を確認する


### 1. 複製元となるEC2インスタンスからAMIイメージを作成する
まずは複製するインスタンスを決めて停止させます
＊停止させなくてもできるのですが、AWS非推奨でデータの整合性が取れない場合があります

今回は停止したChat-spaceという名のインスタンスを複製することとします
＊Elastic IPアドレスがEC2インスタンスに紐づいていないと課金されてしまいますので、必ずアドレスの関連付け解除と解放をしてから停止させましょう
<img width="1149" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/81b82673-badc-290f-b663-fb5100d9d306.png">

複製するインスタンスを選択し、アクションからイメージの作成をクリックします
<img width="1335" alt="スクリーンショット 2020-02-09 18.47.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/636364ee-23fc-7f83-04af-186ac25fb0be.png">


次に実際のAMIの設定を入力していきます
イメージの説明はあとで変更可能ですが、イメージ名は変更できないので注意してください
今回はtest-serverとします
ボリュームタイプなども選べますが、今回はデフォルトの設定とします
イメージの作成を押すとAMIの作成が始まります
<img width="1334" alt="スクリーンショット 2020-02-09 18.47.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/7d1ffaae-19ca-334b-fbb6-44405bd7072b.png">

左側のタブのイメージ>AMIをクリックすると、作成したAMIを確認できます
しばらくするとステータスがavailableになったAMIが作成されます
<img width="1333" alt="スクリーンショット 2020-02-09 18.47.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/fba2d519-52ba-dc48-e079-05456c34e48a.png">

### 2. AMIイメージから新規のEC2インスタンスを作成する
次に新規のEC2インスタンスを起動していきます
作成されたAMIを選択して、起動ボタンをクリックします
すると、EC2インスタンスを作成するいつもの画面が出てくるので設定をしていきます

#### インスタンスタイプ
今回は無料枠のtc2.microとします
<img width="1375" alt="スクリーンショット 2020-02-09 18.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/d943ec75-5a1e-fd8c-45b5-76c9cea9d05a.png">

#### インスタンスの設定
ネットワークの設定などを行います
自分で作成したVPCやサブネットがあればここで選択します
今回はデフォルト値のままとします
自動割り当てパブリックIPは有効になってないとインターネット通信ができないので注意してください
<img width="1338" alt="スクリーンショット 2020-02-09 18.48.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/c17ccd12-20bc-6997-3a25-07e5fc7cc6e8.png">

#### ストレージの追加
ストレージを追加できます
今回はデフォルトのままとします
<img width="1336" alt="スクリーンショット 2020-02-09 18.48.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/7017a294-7d29-06f5-6e0b-0de45d24d7b3.png">

#### タグの追加
必須ではないですが、タグ付けをしておくと何のインスタンスなのか一目でわかるのでつけておくと便利です
Nameキーで好きなインスタンス名をつけておくことが一般的です
今回はtest-serverとします
<img width="1335" alt="スクリーンショット 2020-02-09 18.48.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/493e6c52-a2f2-9f49-fb49-2a8992155773.png">

#### セキュリティグループの設定
既存のセキュリティグループがある場合はそれを選択することもできますので適宜設定してください
今回は新規作成することとします
ルールの追加を押し、HTTP, HTTPS, ポート3000をフルオープンで許可します
<img width="1335" alt="スクリーンショット 2020-02-09 18.48.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/0be14fe7-8797-12d7-56e3-553acd485664.png">

最後にキーペアを選択してください
今回は既存のdeploytestというキーペアを使います
インスタンスの作成を押すと作成が始まります
<img width="1338" alt="スクリーンショット 2020-02-09 18.55.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/a0c75545-ce09-9ad7-2792-6ec5c6795af1.png">

### 3. 作成したインスタンスにssh接続して、インスタンスの中身を確認する
EC2インスタンスが作成されたらパッケージがインストールされているか確認していきます

その前に今回はパッケージがインストールされていないとどういう表示になるかを先に見てみます
nginxやnode.jsがインストールされてるかを確認しましたが、下記のように何も出力されません
<img width="680" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/317402cf-50c6-426e-044a-c911c8c90a08.png">

ではいよいよ作成したインスタンスにssh接続します
先ほど設定したキーペアを使ってください
Elastic IPアドレスは必要であれば適宜設定してください
なければインスタンスのパブリックIPアドレスを@以降に記述して接続します

インスタンスに接続した状態でnginxやnode.jsがインストールされているかを確認すると、下記のようにインストールされていることが確認できました
<img width="680" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/e1a5ccd4-653e-44a3-7479-a5a2aca95ef4.png">


このようにAMIを使うと、あるインスタンスに対して行った設定を引き継いで複製することができます

ちなみに今回はchat-spaceというアプリケーションを入れたインスタンスだったので下記のようにそのアプリケーションディレクトリまで複製されてしまっています

今回はこのアプリケーションは使わないので下記コマンドで削除しています
これでchat-spaceのディレクトリは消去されました
あとは好きなアプリをgit cloneするなりしてください
<img width="328" alt="スクリーンショット 2020-02-09 17.11.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/be731788-de9c-37c4-781c-1e08715eaa17.png">


# まとめ
パッケージのインストール作業はめんどくさいことが多いですが、1つ作っておけば今回の方法で複製できるのでとても便利です
作成時間も10分くらいでできちゃいますので、同じようなインスタンスを作成する場合はぜひ使ってみてください

間違いなどあれば指摘していただけると嬉しいです