【AWS】AMIの作成とマウントまとめ

# はじめに
この記事はインフラ初心者の私がAWS Cloudtechを通して学んだことを
記録＆アウトプットするための備忘録です。

# このページの目的
・EC2へのEBSのアタッチ→マウント手順の理解
・AMIの作成方法の理解
・Apacheのインストール方法の理解

# やること(ざっくり)
■AMIの作成
○EC2の作成
○Userdataの使用
○Apacheのインストール
○Apacheの起動
○EBSのアタッチ→EC2にログインしてマウント
○自動マウント設定の有効化
○イメージの作成

■AMIからインスタンスの作成
○インスタンス作成後の状態確認

■自宅PCからApacheのテストページへのアクセス

# 環境
・Windows10
・Teraterm Version 4.105

# AMIの作成
## インスタンスの作成
デフォルトVPCのパプリックサブネット内にインスタンスを作成する。
※基本的なEC2作成手順は[こちら](https://qiita.com/hargen888/items/f5011ee8955215351ae4)に記載しているのため、詳細は割愛。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/01d4c4dc-daab-1981-615a-b9130396b32d.png)

ユーザデータを設定し、[次のステップ：ストレージの追加をクリック]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/fdf35d2a-9e49-bcdb-2f20-83a4617b64c6.png)

### ユーザーデータの設定コマンドの説明

| コマンド | 説明 |
|:-:|:-:|
| #!/bin/bash | シバン。シェルスクリプトであることを宣言する。実行ログの確認時に確認しやすいように記載。 |
| echo 表示するもの | 画面に文字列や数値、変数を表示する。 |
| yum -y install httpd | Apacheをインストールする。(yum -yで問い合わせ全てにYesと答えるように設定している。)  |
| systemctl start httpd.service | Apacheの起動コマンド |
| systemctl enable httpd.service | 再起動後もApacheが起動するように設定  |
| echo $(curl http://169.254.169.254/latest/meta-data/instance-id) >> /tmp/test | curlコマンドで取得したインスタンスIDを /temp/testファイルに書き出す |

※httpdはApacheのパッケージ名

■テストでの確認事項
○インスタンスメタデータの取得コマンドが正常に動作しているか
○取得したデータを確認できるか

・ストレージ設定
ストレージはデフォルト設定で[タグの追加]をクリック

・タグの追加
Nameタグを作成して[セキュリティグループの設定]をクリック

・セキュリティグループの設定
SSHとHTTPを設定して[確認と作成]ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/415fba14-6029-159d-e7af-c7f182e4399b.png)

## 確認
既存のキーペアを選択して、インスタンスを作成する。

■現在の構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/fe5b58d4-b905-0404-a151-4259b744d2f5.png)


##ユーザーデータの処理確認
作成したEC2インスタンスにTeratermからログイン後、ユーザーデータの処理が正常に完了しているかを確認する。

■Apacheの起動確認
以下のコマンドを実施しステータスがactiveになっていることを確認。

```bash
systemctl status httpd.service
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/b173787c-164d-9a25-1149-687c4f59483d.png)


■テストファイルの確認
catコマンドでテストファイルの中身を確認し、作成したインスタンスのインスタンスIDが取得できていることを確認。

```bash
cat /tmp/test
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/7ef1b513-ce2b-1bc4-2529-e768ad1ead6f.png)

■ログファイルで実行記録の確認
catコマンドでログファイルを確認

```bash
cat var/log/cloud-init-output.log
```
※catコマンドは主にファイルの閲覧に利用するコマンド。ファイルの結合もできる。

■参考URL
[catコマンド](https://eng-entrance.com/linux_command_cat)

##Apacheテストページの表示
作成したインスタンスのパブリックIPをURLに貼り付けてApacheのテストページが表示されることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/ea3ec6f9-91b3-a12e-e921-0ac30aa41666.png)

## EBSのアタッチ
作成したEC2インスタンスに新たに作成したEBSをアタッチ&マウントして使えるようにしていく。

### EBSの新規作成
1. 左ペインから「ボリューム」を選択後、[ボリュームの作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/f0b9e3e3-c7f8-edc5-df8d-b09e473c356d.png)

2. 作成するボリュームのタイプやサイズ、アベイラビリティゾーンを指定して、[ボリュームの作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/addea98b-08ca-b1fd-55b4-591d79610916.png)


各項目について(今回設定した箇所のみ記載)

| 項目 | 説明 |
|:-:|:-:|
| ボリュームタイプ | 作成するボリュームタイプを選択する。今回はスループット最適化HDDを選択 |
| サイズ(GiB) | ボリュームのサイズを設定する。今回は最小の125を設定。 |
| アベイラビリティゾーン(AZ) | 作成したEC2と同一のAZを指定する。<br>(EC2のAZと同一でなければ使用できない) |

作成したボリュームのステータスがavailableになったことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/2aac6092-6c47-9394-f19d-09c29598d644.png)

3.作成したボリュームを選択し、アクション→ボリュームのアタッチを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/b97a57c8-bb4c-db01-a08f-8679bacd9b01.png)


4.ポップアップが表示されたら、「インスタンス」の項目に先ほど作成したインスタンスのインスタンスIDを選択して[アタッチ]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/116c54d3-e09d-0a64-b09d-e2925cfd6a0c.png)

インスタンスに今回新たに作成したボリュームがアタッチされていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e8fea0ae-c12d-c66c-5047-083227c778a5.png)

5.ルート権限に変更後、先ほどアタッチした /dev/sdf 配下を確認。

```
ls -l /dev/sdf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/c50836c1-ebb2-3bd6-44ec-8222dba2dc9e.png)

xvdfのシンボリックリンクが/dev/sdfという名前で作成されていることを確認。


6.lsblkコマンドで確認

```
lsblk
```

今回作成したデバイスが新たにアタッチされていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/43307e05-3ecd-8bb0-ee58-5f871df96396.png)

※lsblkコマンドはブロックデバイスを一覧表示するコマンド
■参考URL
lsblkコマンド(https://www.atmarkit.co.jp/ait/articles/1802/02/news021.html)

7.dfコマンドでディスクの容量を確認する

```
df -h
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/71741d2f-d7e9-b7d6-35a7-971e28de8250.png)

アタッチしただけでは今回作成したストレージを利用できず、dfコマンドでディスク容量も確認できない。
後述の手順で今回作成したストレージをマウントして利用可能な状態にする。

※dfコマンドはディスクの空き容量表示するコマンド
■参考URL
[dfコマンド](https://eng-entrance.com/linux-command-df)

###マウント手順
ファイルシステムの作成→マウント
まず、マウント前後の状態確認を実施する。

**ちょっと待った。ファイルシステムとは何ぞや？？？**
そんなあなたには以下の記事がおすすめ。もちろん私も参照しました。
ざっくり解説すると、ファイルの管理方式自体や管理方式にのっとってフォーマットした記憶領域のことです。

■参考記事URL
[【ざっくり概要】Linuxファイルシステムの種類や作成方法まとめ！](https://eng-entrance.com/linux-make-filesystem)

**手順に戻ります。**
1.先ほど作成した/dev/sdfのファイル情報を確認する。

```
file -s /dev/sdf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/17d5ed5b-33a9-a178-3d28-c2f6e8cec560.png)

/dev/sdf はxvdfへのシンボリックリンクであることがわかりました。

```
file -s /dev/xvdf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/f9aed97d-caa9-4e78-b5bb-ba421df8d193.png)
/dev/xvdfはdataと表示されていますが、マウント後に表示される情報が変わります。

※fileコマンドはファイル形式を調べるためのコマンド

■参考URL
[fileコマンド](https://www.atmarkit.co.jp/ait/articles/1605/10/news018.html)

2.ファイルシステムを作成する(フォーマット)

linuxシステムがファイルをストレージとして使用できるようにするために、以下のコマンドを実施する。

```
mkfs -t ext4 /dev/xvdf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/aa5942cb-2dd6-b3b8-3dac-88e372ab1582.png)

※mkfsコマンドはファイルシステムのフォーマットを行うためのコマンド
※ここでいうフォーマットとは作業可能な状態にすること

■参考URL
[mkfsコマンド](https://www.atmarkit.co.jp/ait/articles/1803/09/news034.html)

3.マウントポイントを作成する
作成したファイルシステムと関連付けるためのディレクトリを作成。今回は/log。

```
mkdir /log
```
lsコマンドで/logディレクトリが作成されていることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e0a994a8-9115-441b-2ae3-825f2db5a8c4.png)

4.マウントを実行
作成したHDDを使用できるようにするためにmountコマンドを実行する。
今回は/dev/xvdf のファイルシステムを、/logディレクトリにマウント。

```
mount /dev/xvdf /log
```

■参考記事URL
[mountコマンドについてまとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-mount)

5.dfコマンドでディスクのファイル容量を確認する

```
df -h
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/6b5a5bf8-82ed-4be2-0f36-6c13f7d89ad9.png)

/logディレクトリにストレージ(/dev/xvdf)がマウントされ、利用可能な状態になっています。
ヤッター！！

■現在の構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/71384247-f900-0942-07c8-cdd4b15bd26f.png)


# EC2のバックアップ取得、復元

作成したEC2インスタンスの取得、削除、復元まで実施する。

## 事前準備
バックアップ取得前に以下を実施する。
1./log配下にtouchコマンドでテストファイルを作成する

```
touch /log/testfile.log
```
※touchコマンドはタイムスタンプを変更したり新規ファイルを作成するコマンド
touchコマンド(https://eng-entrance.com/linux-command-touch)

lsコマンドで/log配下にテストファイルが作成されていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/cd0b533b-f12d-87a2-e66e-1cc3cad191d6.png)

2.自動マウントの設定を有効にする
デフォルトの設定だとEC2インスタンスを起動したときに/logが自動的にマウントされないようになっているため、EC2インスタンスの再起動時に/dev/sdfが/logに自動的にマウントされるように設定する。

ファイル情報を確認してUUIDを控える

```
file -s /dev/xvdf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/628d6e02-0bd7-3eca-5f06-0359ae20a494.png)

viコマンドで/etc/fstabを編集する

```
vi /etc/fstab
```

自動マウント設定を有効にするための情報を追記する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/67a59d5e-3d19-d202-5cdf-63d261f6c5ea.png)

Escキーでコマンドモードに戻り、「:wq」でファイルを保存する。

試しに再起動してみて、dh -fで/logがマウントされていることを確認するのも良いかもしれません。

※viコマンドはLinuxの標準のエディタを起動するコマンド。ファイルの編集とかができる。
※etc/fstabファイルはマウントするファイルシステムの情報を記述するファイル

■参考URL
[viコマンド](https://eng-entrance.com/linux-command-vi)
[Linux - mount / unmount of File System](https://www.infraeye.com/study/linuxz24.html) ←わかりやすい

## バックアップ
事前準備が完了したのでバックアップを取得します。
1.インスタンスの停止
バックアップを取得するインスタンスを停止する。
※起動したままでもバックアップ可能だが、不具合が起こる可能性があるため基本的にインスタンスは停止した状態でバックアップを取得する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/b57e8415-89fd-66b5-6828-0d3b7b38a043.png)

2.イメージを作成する
イメージを作成したいインスタンスを選択し、アクション→イメージとテンプレートから[イメージの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/57654db0-d116-b67c-d37c-711e519f1044.png)

赤枠箇所を設定して、[イメージを作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/2f0a3417-0945-7b73-b183-de523b6fb40a.png)

AMI作成後、2つのスナップショットがAMIに紐付いていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/c9f3dcfe-c8be-8448-7123-6c4fc02fe22f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/ea42a632-dae0-4470-3e99-af51f212b078.png)

## バックアップの復元
作成したAMIからインスタンスを起動する。

1.左ペインから「インスタンス」を選択し、[インスタンスを起動]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/01e2eb4b-0b19-bd78-2d8f-ff79aa9230eb.png)

※AMIの画面の[起動]ボタンからでも作成できる。

2.左タブから「マイAMI」をクリックし、[選択]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/dd67470e-906e-2b31-8904-84dd058bae0a.png)

3.インスタンス作成時の設定をして、インスタンスを起動する。
※手順は割愛

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/bb5be17c-bad2-f445-54df-dc1dd803688d.png)

作成したインスタンスにEC2-test-1と同じデバイスが紐付いていることを確認。

4.作成したインスタンスにログインして、マウント状態とテストファイル有無を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/34c38c87-f0cf-ab30-176f-cfc0eb73bad9.png)

/dev/xvdf が/logにマウントされていること、バックアップ前に作成したテストファイルがあることを確認。

5.Apacheのテストページにアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/a902fefa-e4f2-953c-6bba-ed9f9590a687.png)

AMIで作成したインスタンスからも無事にApacheのテストページにアクセスできました。

# 終わりに
この記事の作成に前作の倍以上の時間がかかった気がしますが、その分多くのことを学べました。
以前Linuc Level1を取得したときはPing-tと暗記だけでなんとか乗り切ったのですが、各コマンドについての知識があまり身についておらず、ただ資格を取得しただけになってしまったように実感しました。(もっと実際に操作してみるべきだったと反省。)
今回、実際に手を動かすことで少しは定着したと思います。
特にマウントやシンボリックリンクの箇所は資格取得時もあまり理解していなかった箇所なので今回いい経験になりました。
おまけの情報も書いたので興味のある方は読んでみてください。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
# おまけ① シンボリックリンクについて
シンボリックリンクについて理解が浅かったので軽くまとめてみました。

| 用語 | 説明 |
|:-:|:-:|
| ハードリンク | あるファイルのinodeと、そのファイルにつけられた名前とのつながりの事 |
| シンボリックリンク | Windowsでいうショートカットみたいなもの。シンボリックリンクを作成することで参照先のファイルにアクセスできる |

■シンボリックリンクの作り方

```
ln -s リンク元 登録名
```
上の画像のようにxvdfのシンボリックリンク(/dev/sdf)を作成したい場合は以下のような感じ

```
ln -s xvdf /dev/sdf 
```
■参考記事URL
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1152.html)
[「ls -l」コマンドの表示からファイルの属性を理解しよう](https://www.atmarkit.co.jp/ait/articles/1605/18/news015_3.html)
[シンボリックリンクとハードリンクの違い](https://qiita.com/katsuo5/items/fc57eaa9330d318ee342)
[Linux: ハードリンクと inode](https://qiita.com/lnznt/items/6178e1c5f066f22fe9c2#comments) ←詳細に書かれているのでオススメです。

# おまけ② マウントについて
マウントについて理解するのにかなり時間がかかりました。
マウントについての解説は以下の記事が個人的にわかりやすかったです。

■参考記事URL
[Linux - mount / unmount of File System](https://www.infraeye.com/study/linuxz24.html)
[この１ページで一通りわかる！Linuxのマウント(mount)について](https://eng-entrance.com/linux-mount)　
[【Linux】ドライブの「マウント」について](http://www.code-magagine.com/?p=3246)

# おまけ③ manコマンドの表示を日本語にする方法
コマンドのオプションについて調べたくてマニュアルを見たのですが、英語で書かれており読み解くのが辛かったので、日本語に変更してみました。

1.ロケールを確認する

```
locale 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/40d35242-4412-bc7c-2177-29fa2ddd13b4.png)

LANG=en_US.UTF-8 となっているので日本語に変更します。

2.環境変数 LANGの置き換え

ロケールを日本語に設定する。

```
export LANG=ja_JP.UTF-8
```
再びlocaleコマンドを実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/1a1d43c7-1fe0-2c02-f299-b1624f12518a.png)
LANGを変更すると他の環境変数もかわるみたいですね。

3.日本語のマニュアルページをインストールする。

```
sudo yum -y install man-pages-ja
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/2c1374fc-8a3c-a819-89f4-4bd7920197bd.png)
※上記コマンドでインストールできます。(私はすでにインストール済みのため画像のように出ています。)

これでマニュアルの日本語化は完了です。
マニュアルを参照して、日本語表記になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/bb052b90-9d40-71be-faa3-90fc23cf4b19.png)

日本語表記だとわかりやすいですね。神！

| 用語 | 説明 |
|:-:|:-:|
| ロケール | 各言語などの地域情報。<br>ロケール情報を変えてローカライゼーションする。 |
| ローカライゼーション | 国の環境に最適化すること。 |

■参考URL
[【Linux入門】ローカライゼーションのためのロケール情報設定方法](https://eng-entrance.com/linux-localization-locale)
[(CentOS7)マニュアルを日本語化する](http://hiroumi.wpblog.jp/2016/04/30/centos7%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E3%81%99%E3%82%8B/)

# おまけ④ file -sについて

本手順ではfile -sを当たり前のように使っていますが、私も最初は使い方がわからなかったのでネットで調べてみました。
**しかし、調べても情報が全然なかったのでマニュアルを読んでみました。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/e9d99189-2483-6f63-ea92-2b5eb37a15c3.png)

よくわからん・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/0f62a1a5-2586-d80c-99f7-4f7cba87e445.png)

オプションなし 　　　スペシャルファイルは読み込まない
file -s 　　　　　　　スペシャルファイル(デバイスファイル)を読み込んで詳細情報を教えてくれる

みたいな感じなのか？
わかる方教えていただけると嬉しいです。