インフラのコード化：Terraformを使ってWindowsサーバーを構築し、リモートデスクトップで接続する方法

## はじめに

AWS (Amazon Web Services) を活用すれば、クラウド上で手軽にWindowsサーバーを構築し、リモート操作環境を素早く整えることができます。

:::note info
**最近は検証費用が増加していることが悩みです。そこで今回は、Terraformを使って簡単に構築する方法をご紹介します。**
:::

この記事で紹介するコードは、一部修正するだけで実際に使用可能です。***この内容が、誰かの技術的な支えになれば幸いです。***

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

これまでは、Windowsサーバーを手動で構築することが一般的でした。

:::note warn
**しかし、手軽に検証環境を用意したい場合には、Terraformを活用して効率的に構築する方法が便利だと感じました。**
:::

また、技術検証やコスト削減に関する取り組みについては、以前の記事で詳しくまとめています。**興味のある方はぜひご覧ください。**

https://qiita.com/free-honda/items/36548acc5b4badf7cce1

***今回の記事では、自分の備忘録としても役立つように、手順を整理して公開することにしました。***

## 知識整理

### Windowsサーバーとは
Windowsサーバーは、マイクロソフトが開発したサーバー用OSで、主に企業で利用されています。ファイル共有、データ管理、ウェブサイト運営などを簡単に行えるのが特徴です。

過去の記事では、AWSマネジメントコンソールを使用して手動でWindowsサーバーを作成する方法についても紹介しています。***興味のある方はぜひご覧ください。***

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

:::note info
***Windowsサーバーは、Windows PCに似た操作画面を持ち、使いやすいだけでなく、高いセキュリティ性能や大規模なネットワーク管理能力を備えています。***
:::

### リモートデスクトップとは
リモートデスクトップは、ネットワークを通じて他のコンピュータを遠隔操作できる機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/71d445c7-07aa-b5c1-52f9-c7d84fd50418.png)
引用画像：https://clouddirect.jp.fujitsu.com/service/navi-beginner-remote_desktop

https://www.ntt.com/business/services/rink/knowledge/archive_89.html

Windowsの標準機能を使えば、PCやMacからサーバーや他のPCにアクセスし、操作することができます。

***この機能を活用すれば、離れた場所からでもサーバー管理や設定変更、仕事を効率的に進めることが可能です。***

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

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

:::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   = 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" # 修正: キーペアを指定

  depends_on = [aws_security_group.public_sg]

  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-09 at 19.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/eb3922ac-73a7-f58e-bf35-574f82ad9b01.png)

### 初期パスワードについて

***AWSでWindowsサーバーを構築した場合、初期のAdministratorアカウントのパスワードはインスタンス作成時に生成されます。***

:::note 
万が一、このパスワードを忘れてしまった場合でも、AWSの機能を使って復元することが可能です。
:::

初期パスワードの復元方法については、過去の記事で手順をご紹介していますので、参考にしてみてください。

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

実際に以下の画像のように、インスタンス作成時に設定したキーファイルを使用して、ユーザー名とパスワードが生成されていることを確認できます。

![Screenshot 2025-01-09 at 19.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/406dffd0-ae0b-d94f-1cf3-30fccced3d53.png)

## RDP接続してみた

リモートデスクトップ接続を行うために、Windowsの検索バーに「RDP」と入力し、アプリケーションを起動します。

![Screenshot 2025-01-09 at 18.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/266c2662-40c4-8cb9-b059-fe37e0bb5c11.png)

「コンピュータ」欄にAWSコンソールで確認したパブリックIPアドレスを入力し、ユーザー名に「Administrator」、パスワードに復号化したパスワードを入力します。

セキュリティ警告が表示された場合は、「接続」をクリックして進みます。

![Screenshot 2025-01-09 at 19.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/82588c78-70a9-7bec-88b6-c462b1e63539.png)

接続が成功すると、以下のようにWindowsサーバーのデスクトップ画面が表示されます。

![Screenshot 2025-01-09 at 19.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/39a03ff1-dd9c-ab15-a560-e36ddb33b333.png)

これでリモートデスクトップ接続が完了し、サーバーにアクセスできるようになります。

### 補足: MacBookでの接続について
MacBookから直接Windowsサーバーにリモートデスクトップ接続することも可能ですが、多少の設定が必要です。

:::note warn
**そのため、MacBookでは『[Windows App](https://apps.apple.com/jp/app/windows-app/id1295203466?mt=12&_ga=2.157844473.236964923.1727040295-1174739268.1727040295)』というアプリを利用して自宅のWindows 11端末に接続し、その端末からリモートデスクトップ経由でWindowsサーバーにアクセスしています。**
:::

https://qiita.com/free-honda/items/22d6df98a8f5f83b8f90

これは踏み台サーバーを経由してアクセスしている感覚に近いですが、詳しい手順は上記の記事で紹介していますので、参考にしてください（以下のようなイメージです）。

![Screenshot 2025-01-09 at 20.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/72be022e-820d-6089-3390-45a49e2a5f02.png)

## まとめ

今回は、Terraformを使ってWindowsサーバーを構築し、リモートデスクトップで接続する方法をご紹介しました。

:::note info
**次回以降は、構築したWindowsサーバーにTerraformを使ってActive Directory機能を追加する方法を解説します。**
:::

***少し難易度が上がりますが、参考文献を確認しながら積極的に挑戦していきたいと思います！！***

## おまけ: 作成も一瞬で、削除もコマンド一発
Terraformで作成したリソースは、簡単に削除することができます。***削除するには、以下のコマンドを実行します。***

```bash
terraform destroy
```

実行後、Terraformは現在の状態ファイルを元に削除対象のリソースをリストアップし、確認メッセージが表示されます。

```bash
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes        

aws_s3_bucket.example: Destroying... [id=honda-cloudshell-terraform-demo]
aws_s3_bucket.example: Destruction complete after 0s

Destroy complete! Resources: 1 destroyed.
```

このプロンプトに `yes` と入力すると、Terraformは指定されたリソースを安全に削除します。