Terraformで構築：AWS上のWindowsサーバーにIIS（Internet Information Services）を設定して遊んでみた

## はじめに
今回は、GUIベースの管理ツールで直感的に設定や管理が可能な、Microsoftが提供するWebサーバーソフトウェア「**IIS（Internet Information Services）**」の構築について解説していきます。

:::note info
**IISはMicrosoft製品であるため、Windows ServerやActive Directoryとシームレスに連携できるのが特徴です。**
:::

この記事は、個人レベルの検証をもとに作成しています。そのため、内容が実運用環境に適さない場合がありますことをご了承ください。

***この内容が、どなたかの技術的な参考になれば幸いです。***

## 書こうと思ったきっかけ
普段はLinuxサーバーを使うことが多いのですが、私は日常的にWindowsサーバーも利用しています。

通常は、LinuxのApacheやNGINXを使用することがほとんどです。

:::note warn
**しかし、今回少しだけPACファイルの技術検証をしたいと思い、Windowsサーバーを活用してIISを構築してみることにしました。**
:::

***この記事は、自分自身の備忘録として、また体系的にまとめるために作成しました。***

## そもそも、IIS（Internet Information Services）とは？
IIS（Internet Information Services）は、Microsoftが提供するWebサーバーソフトウェアです。**Windows Serverや一部のWindowsエディションに標準で組み込まれており、以下のような機能を提供します。**

https://www.kagoya.jp/howto/it-glossary/server/iis/

一般的には、Linuxで利用されるApacheやNGINXが主流ですが、IISはGUIベースの管理ツールを備えており、直感的に設定や管理ができるのが特徴です。

:::note info
***主に、Windows環境でのWebサイトやアプリケーションのホスティングに利用されており、使いやすく信頼性の高いソリューションとして知られています。***
:::

## 補足: `user_data` に PowerShell スクリプトを追加

今回の検証では、前回紹介したシンプルなシングル構成のTerraformコードをベースに、`user_data` を使用してPowerShellスクリプトを追加しています。

:::note warn
- **`Install-WindowsFeature` で IIS をインストール。**
- **`index.html` を作成し、ウェブページのコンテンツを追加。**
:::

`user_data` を活用することで、AWSで起動するWindowsインスタンスに対して初期設定やソフトウェアのインストールを自動化できます。

***これにより、手作業を減らし効率的な環境構築が可能です。***

### もっと補足：`user_data`の設定場所はここ

普段、マネジメントコンソール上でEC2を構築したことがある方は、なんとなくイメージがつくかもしれませんが、一応補足としてご説明します。

:::note
***EC2を起動する際の「高度な設定」オプションの最下部に、`user_data`を設定する項目があります。***
:::

今回は、Terraformを使ってこの部分にPowerShellスクリプトを追加しています。

![Screenshot 2025-01-09 at 22.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5d2a4f6a-49d2-6c22-788e-394c99da23c7.png)

`user_data`については、直近の記事でも詳しくまとめていますので、興味がある方はぜひ参考にしてください。

https://qiita.com/free-honda/items/7a7bce3aedcff9a98393

## 今回使うコードについて

今回使用するコードは、シンプルなシングル構成で、検証目的に特化して作成しています。

:::note alert
**注意点として、`key_name` の部分は環境に合わせて修正が必要です。コードを使用する際には、適宜修正を行ってください。**
:::

また、`associate_public_ip_address = true` の設定により、パブリックIPアドレスが自動的に割り当てられる仕様になっています。

```main.tf
provider "aws" {
  region = "ap-northeast-1" # Tokyo region
}

# VPC作成
resource "aws_vpc" "main_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "terraform-main-vpc"
  }
}

# サブネット作成 (パブリックサブネット)
resource "aws_subnet" "public_subnet" {
  vpc_id                  = aws_vpc.main_vpc.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true

  tags = {
    Name = "terraform-public-subnet"
  }
}

# インターネットゲートウェイ作成
resource "aws_internet_gateway" "main_igw" {
  vpc_id = aws_vpc.main_vpc.id

  tags = {
    Name = "terraform-main-igw"
  }
}

# ルートテーブル作成
resource "aws_route_table" "public_route_table" {
  vpc_id = aws_vpc.main_vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main_igw.id
  }

  tags = {
    Name = "terraform-public-route-table"
  }
}

# サブネットとルートテーブルの関連付け
resource "aws_route_table_association" "public_association" {
  subnet_id      = aws_subnet.public_subnet.id
  route_table_id = aws_route_table.public_route_table.id
}

# セキュリティグループ作成
resource "aws_security_group" "public_sg" {
  vpc_id = aws_vpc.main_vpc.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # HTTPアクセスを許可
  }

  ingress {
    from_port   = 3389
    to_port     = 3389
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # RDPアクセスを許可
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"] # すべてのアウトバウンドを許可
  }

  tags = {
    Name = "terraform-public-sg"
  }
}

# EC2インスタンス作成 (Windows Server)
resource "aws_instance" "windows_ec2" {
  ami                         = "ami-045921da241a7a9c6" # 指定されたWindows ServerのAMI ID
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnet.id
  security_groups             = [aws_security_group.public_sg.id]
  associate_public_ip_address = true # パブリックIPv4アドレスを有効化
  key_name                    = "honda" # 修正: キーペアを指定

  user_data = <<-EOF
    <powershell>
    # IISのインストール
    Install-WindowsFeature -name Web-Server -IncludeManagementTools

    # デフォルトのIISウェルカムページを有効化
    Set-Content -Path C:\\inetpub\\wwwroot\\index.html -Value '<h1>Welcome to IIS on AWS</h1>'
    </powershell>
  EOF

  tags = {
    Name = "terraform-windows-ec2"
  }
}
```

## 実際にやってみた

ここでは、CloudShellでのTerraformのセットアップが完了していることを前提に進めます。

**まだセットアップが完了していない方は、過去の記事を参考にしてセットアップを実施してください。**

https://qiita.com/free-honda/items/19b4e7db8b8f24d41277

まず、以下のコマンドを入力して、**main.tf**というファイルを作成します。

```bash
vi main.tf
```

``vi``では、ファイル編集後にESCキーを押し、``:wq``で保存して終了します。

```main.tf
# 上記の完成した全体のコードをコピーして貼り付けてください。
```

次に、以下のコマンドで Terraform を初期化します。

```bash
terraform init
```

実際に、以下のように「``Terraform has been successfully initialized!``」と表示され、成功が確認できました。

```bash
Partner and community providers are signed by their developers.

・・・（省略）

Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see

・・・（省略）

rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

次に、以下のコマンドを入力して、確認メッセージが表示されたら「``yes``」と入力します。

```bash
terraform apply
```

その後、以下のように「``Apply complete! Resources: xx added, 0 changed, 0 destroyed.``」と表示され、成功したことが確認できました。

![Screenshot 2025-01-09 at 19.21.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/54ecc79f-9242-8810-3cd8-4f5e30f37f9c.png)

Terraformで構築したWindowsサーバーをAWSマネジメントコンソールで確認します。***以下のスクリーンショットのように、サーバーが1台構築されていることが確認できました。***

![Screenshot 2025-01-11 at 6.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fc46cca2-107f-47af-1e74-83869ef608f9.png)

## 実際にブラウザからアクセスしてみた
構築したサーバーへのログインやRDP接続の手順については、ここでは割愛しますが、過去の記事で詳しく解説していますので、そちらをご参照ください。

https://qiita.com/free-honda/items/98086628f844afe73079

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

今回は、構築したWindowsサーバーのパブリックIPアドレスを使用し、ローカル環境（MacBook）のブラウザからアクセスを試みます。

```css
http://43.207.29.110/
```

デフォルトのトップページは、以下のように表示されます。

![Screenshot 2025-01-11 at 6.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a963ab0c-be57-c3a8-a7fa-c73ae2a5d25d.png)

さらに、Terraformで設定したHTMLファイルの内容が正しく反映されていることも確認できました。

![Screenshot 2025-01-11 at 6.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a12a28d0-415a-e017-fd81-a7d8bfa2d369.png)

***結果として、検証は大成功と言えます！***

## さらに遊んでみた（笑）

今回は簡易的なページを表示していましたが、別のHTMLファイルに置き換えて新しいページを表示させてみることにしました。

:::note info
***今回表示させたのは、年末年始に技術勉強を共にしたITスクールの仲間たちに向けたメッセージを記したHTMLファイルです。***
:::

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

ちなみに、`C:\inetpub\wwwroot`ディレクトリが主に使用されるディレクトリです。

![Screenshot 2025-01-11 at 6.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0a147258-a2f2-43ad-cff5-1a33e96563af.png)

置き換えたHTMLファイルを元に、先ほどアクセスしていたブラウザの画面を更新すると、以下のように正しく表示されました。***これにより、IISが問題なく起動していることが確認できました。***

![Screenshot 2025-01-11 at 6.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dccc6b80-5aa5-f123-ee01-f46d6c2a090f.png)

気がつけば2025年も10日以上が過ぎています。1日1日を大切に過ごしていきたいと改めて感じました...。

## まとめ
ここまでお読みいただき、ありがとうございました。今回の内容は、Windowsサーバーを使い慣れている方にとっては基本的な内容だったかもしれません。

:::note warn
***しかし、自分で実際に構築してみることで良い復習となりました。***
:::

次回は、このWindowsサーバーのIISウェブサーバーを活用し、プロキシ設定やPACファイルに関する技術検証を進めていきたいと思います。