実際に試してみた：User Dataを活用してEC2サーバー構築を効率化する具体的な方法

## はじめに

今回は、EC2でサーバーを構築する際に利用できる「**User Data**」について取り上げます。この高度なオプション設定については、これまで特に意識せずスルーしてきました。

:::note
**しかし、サーバー構築時の環境セットアップを簡単に自動化できる可能性があると気づき、実際に試してみることにしました。**
:::

***本記事では、その手順や効果をまとめています。***

最近はCloudFormationやTerraformなどを活用してインスタンス起動時にコマンドを投入する方法を使用することが多いですが、**今回は手動で作成する場合の挙動も改めて確認していきます。**

## 書こうと思ったきっかけ
**User Dataという設定項目の存在は以前から認識していましたが、インスタンス起動後にSSH接続してコマンドを入力しても工数的に大きな違いはないと考えていました。**

:::note warn
しかし、「***自動化を取り入れることで、どれだけ効率化できるのか？***」という疑問が浮かび、今回試してみることにしました。
:::

今後この設定をどれだけ活用するかは分かりませんが、未来の自分への備忘録として、今回の技術検証を体系的にまとめます。

***この内容が誰かの技術の支えになれば幸いです！***

## まず、User Dataとは
Amazon EC2では、User Dataを使用して、インスタンス起動時にコマンドやスクリプトを自動的に実行することができます。

:::note alert
**この機能を活用することで、サーバー構築や設定作業を自動化し、効率的に環境をセットアップすることが可能です。**
:::

***詳しく知りたい方は、以下のブログやAWS公式ドキュメントを参考にしてみてください。***

https://dev.classmethod.jp/articles/ec2-userdata-apache-documentroot

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html

### User Dataの特徴

User Dataに実行したいコマンドやスクリプトを入力することで、インスタンス起動時に自動的に設定が行われるため、***手動での作業を大幅に削減できます。***

- **自動実行:**
EC2インスタンスの起動時に、指定したスクリプトやコマンドを自動的に実行します。
通常、初回起動時に1回だけ実行されます（必要に応じて再実行も可能）。

- **セットアップの自動化:**
パッケージのインストール
サービスの設定や起動
カスタムスクリプトの実行

- **簡単な構文:**
User Dataにはシェルスクリプトやクラウド初期化ツール（`Cloud-Init`）を利用できます。

https://qiita.com/yamada-hakase/items/40fa2cbb5ed669aaa85b

## 前提条件
ここでは、VPCなどの基本的なAWS構成がすでに構築されていることを前提としています。

***まだ構築が終わっていない方は、以下の記事でVPCやサブネットの作成方法をご紹介していますので、ぜひ参考にしてください。***

https://qiita.com/free-honda/items/9513ef83f189b29f4796

:::note alert
**また、セキュリティグループの設定も重要です。特に、インバウンドルールでHTTP（ポート80）を解放する必要があります。**
:::

セキュリティグループの設定方法については、以下の記事で詳しく解説していますので、あわせて参照してください。

https://qiita.com/free-honda/items/fa6533d9eb2204ad7cf8

***これらの設定が完了していることを確認してから、次の手順に進むことをおすすめします。***

## 実際に使ってみた
AWSのマネジメントコンソールからEC2のサービス画面に移動し、「インスタンスを起動」をクリックします。

![Screenshot 2025-01-06 at 20.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a15f9371-a756-97e6-b487-e8eb20479f04.png)

***途中の設定手順は省略しますが、ご了承ください。***

インスタンス起動時に、EC2管理コンソール内の「**Advanced Details**」セクションで「**User Data**」にスクリプトを貼り付けます。

![Screenshot 2025-01-06 at 19.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1f3cc1da-3134-578e-a429-f1994638e968.png)

以下のスクリプトは、HTTPサーバーをインストールして起動する設定例です。

```bash
#!/bin/bash
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "Hello, EC2!" | sudo tee /var/www/html/index.html
```

### 少し補足：シェバン（#!/bin/bash）とは？

**`#!/bin/bash` はシェバン（shebang）と呼ばれる記述で、スクリプトファイルの先頭に記載する特殊な文字列です。**

これにより、スクリプトがどのインタプリタ（プログラムを実行するソフトウェア）で実行されるべきかを指定します。

:::note warn
***この場合は、Bashシェルを指定しています。***
:::

## ブラウザからアクセスしてみた
ここでは、EC2にパブリックIPアドレスが付与されていることを前提に、管理画面からIPアドレスを確認します。

![Screenshot 2025-01-06 at 19.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7a8ec6df-b679-a75b-cd44-08e18378a9de.png)

私の環境では、以下のURLをブラウザで指定してアクセスしました。

```armasm
http://52.196.216.234/index.html
```

このURLで、今回自動作成された `index.html` にアクセスします。

![Screenshot 2025-01-06 at 19.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a87b0f64-9e5e-733e-f3e2-a3b1153f51e4.png)

***想定通り、設定したコマンドが実行されていることを確認できました！！***

## まとめ
今回、普段あまり使用していなかったUser Dataの設定について検証を行いました。

:::note warn
***実際に試してみると、サーバーを構築する台数が多い場合には非常に便利な機能であると感じました。***
:::

***今後は、この設定項目に`Cloud-Init`を活用することで、さらに高度な初期化が可能となります。*** 機会があれば、その活用にも挑戦したいと思います。

***基本的な技術検証の内容ではありますが、この情報がどなたかの技術的な支えとなれば幸いです！***

## 参考記事

https://dev.classmethod.jp/articles/systemsmanager-statemanager-userdata

https://qiita.com/miyuki_samitani/items/d1078feda3c4748b4756

https://atmarkit.itmedia.co.jp/ait/articles/1408/25/news016.html

https://faq.idcf.jp/faq/show/58?site_domain=default