AWS EC2でWindowsServerを構築してhttpsで接続するまでの手順

## 背景と実施したこと
仕事の都合でAWSでWindowsServerを作る機会がありました。
WindowsServerの構築・設定は慣れていない部分もあったので手順を残しておきます。
IT初心者の方にとっては、Webアプリをインターネットに公開するまでの流れがわかると思うので機会があれば参考にしてみてください。


参考にした記事
[freenom](https://www.lancork.net/2019/05/how-to-use-freenom-free-domain/ "freenom")
[Amazon EC2(Windows OS)で構築したWebサーバ(IIS)のSSL設定](https://qiita.com/u-bayashi/items/9a8570f412db0a28763c)

## Step
1. EC2 WindowsServerの構築
    1. インスタンスの作成
    1. Elastic IPアドレスの割当
    1. セキュリティグループの設定
    1. リモートデスクトップでの接続
1. IISのインストール・ローカルでの確認
    1. IISのインストール
    1. ローカルホストでアクセスできることの確認
    1. 仮想ディレクトリの追加
1. SSLの設定
    1. ドメインとIPアドレスの紐付け
    1. IISでサイトと取得したドメインの紐付け
    1. 証明書の発行
    1. httpsでアクセス



## EC2 WindowsServerの構築

### インスタンスの作成
まずはインスタンスを作成します。ここでは2019のシンプルな構成のものを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/f8a4ea06-7d0a-3dcf-f811-d1c566395341.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/79f517f1-330c-8fe7-378f-7f84cfcd794e.png)

以降はスペックを選択するフェーズになりますが、ここは個々の目的に合わせて選んでください。

注意点としては、インスタンスに接続するためのキーを聞かれるフェーズがあります。
ここで作成したキーは大事に保存しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/dacfb59f-a35c-3705-63fc-9d119a3c5636.png)

### Elastic IPアドレスの割当
インスタンスにはデフォルトでIPアドレスが紐付きますが、これは起動毎に変わってしまいます。
そのため静的なIPアドレスを紐付けるためにElastic IPを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/6374c262-aa2c-d286-6121-69db5f7529e4.png)

取得後は、作成したインスタンスに紐付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/797d6eb1-0a93-3f1c-4669-8be1b74fa724.png)


### セキュリティグループの設定
次にセキュリティグループ（以下SG）を作成します。
サーバ作業のためのRDP
サイトにアクセスするためのhttp、httpsをインバウンドルールに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/9aca3976-ed17-eaca-6286-66e9d6dffaaf.png)


### リモートデスクトップでの接続
インスタンスの「接続」から「RDPクライアント」タブに移動します。
「パスワードの取得」を行いadministratorのパスワードを取得します（この際インスタンス構築時に作成したキーが必要）
その後、リモートデスクトップファイルをDLして接続しましょう。
※接続できない場合はSGの設定がうまくいっていないかも知れません。
自分の場合もなぜかデフォルトのSGに設定してもうまく行かなかったので、SGを再作成して再度紐付けなおすとうまくいきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/47d8e2d1-91af-d905-2acb-c2557b2249bb.png)

## IISのインストール・ローカルでの確認
この項はリモートデスクトップでインスタンスにログインしての作業になります。

### IISのインストール
IISのインストールを行います。
こだわりがない場合、設定等はひとまずデフォルトで進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/72eedfac-f55c-e779-64f4-86e9d9945c36.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/9004e7a3-9462-5957-f89e-d5a7a6b04747.png)

### ローカルホストでアクセスできることの確認
IISがインストール後は以下のようにIISマネージャーからデフォルトのページにアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/490b59be-767e-b7cf-a7b8-bb8b485d63fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/621d54f6-4a61-65ec-717e-290a969e0c5b.png)


### 仮想ディレクトリの追加
デフォルトのページはサーバ内のどこを参照しているかというと
"C:\inetpub\wwwroot\iisstart.htm"
このパスを参照しています。

ここパスに任意のHTMLなどを置いてみてもいいのですが、ここでは仮想ディレクトリを追加して
上記とは違うパスのファイルを参照させてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/61c09548-64f1-476a-df66-d211e8545f6e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/df716fb4-2bb9-dfaa-05c7-59615879323c.png)

指定したパスに適当なHTMLを配置し、インスタンス内のブラウザから
http://localhost/test
で接続するとファイルの内容にアクセスできます。

ちなみにクライアントPCからIPアドレスでアクセスしてもきちんと表示されます。

## SSLの設定
httpでのアクセスは確認できましたが、httpsではアクセスできないままかと思います。
これを解消させます。

### ドメインとIPアドレスの紐付け
まずはIPアドレスでのアクセスしかできない状態からドメインでのアクセスができるようにします。
適当なドメイン取得サービスを使って任意のドメインとインスタンスのElastic IPアドレスを紐付けます。
ここでは[freenom](https://my.freenom.com/clientarea.php)を使います。
詳しい使い方などは
[完全無料の独自ドメインを取得できるFreenomの使い方
](https://www.lancork.net/2019/05/how-to-use-freenom-free-domain/ "freenom")を参照ください。

ドメインの取得が完了したら5分ほど待って以下の要領でコマンド打って紐づきができていることを確認しましょう。
タイムアウト等のエラーが表示されなければOKです。

```bash
nslookup ec2amaz-hh9q23q.ml
```

### IISでサイトと取得したドメインの紐付け
続いて取得したドメインとサイトの紐付けを行います。
紐付けたいサイトを右クリックして以下の要領で紐付けを行います。（この段階でhttpのみでOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/663817da-9a88-3d9b-644b-de936bd544f9.png)



### 証明書の発行
最後に証明書のインストールを行います。
インストールはWebからツールをDLするため以下のセキュリティチェックはOFFにしておきましょう。
（それかクライアントPCでDLしてリモデ先にコピーしましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/1d2ca256-face-1d4b-d365-6fff92266dbc.png)


https://www.win-acme.com/
こちらのページから
win-acme.v2.1.20.1185.x64.pluggable.zip
をDLして展開します。

展開後、管理者権限でexeを実行し以下のように設問に答えていきます。

```bash
A simple Windows ACMEv2 client (WACS)
 Software version 2.1.20.1185 (release, pluggable, standalone, 64-bit)
 Connecting to https://acme-v02.api.letsencrypt.org/...
 Scheduled task not configured yet
 Please report issues at https://github.com/win-acme/win-acme

 N: Create certificate (default settings)
 M: Create certificate (full options)
 R: Run renewals (0 currently due)
 A: Manage renewals (0 total)
 O: More options...
 Q: Quit

 Please choose from the menu: n

 Running in mode: Interactive, Simple

 Please select which website(s) should be scanned for host names. You may
 input one or more site identifiers (comma-separated) to filter by those
 sites, or alternatively leave the input empty to scan *all* websites.

 1: Default Web Site (1 binding)

 Site identifier(s) or <Enter> to choose all: 1

 1: ec2amaz-hh9q23q.ml (Site 1)

 Listed above are the bindings found on the selected site(s). By default all
 of them will be included, but you may either pick specific ones by typing the
 host names or identifiers (comma-separated) or filter them using one of the
 options from the menu.

 P: Pick bindings based on a search pattern
 A: Pick *all* bindings

 Binding identifiers(s) or menu option: a

 1: ec2amaz-hh9q23q.ml (Site 1)

 Continue with this selection? (y*/n) - yes

 Source generated using plugin IIS: ec2amaz-hh9q23q.ml

 Terms of service:   C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\LE-SA-v1.2-November-15-2017.pdf

 Open in default application? (y/n*) - yes

 Do you agree with the terms? (y*/n) - yes

 Enter email(s) for notifications about problems and abuse (comma-separated): xxxx@gmail.com

 [ec2amaz-hh9q23q.ml] Authorizing...
 [ec2amaz-hh9q23q.ml] Authorizing using http-01 validation (SelfHosting)
 [ec2amaz-hh9q23q.ml] Authorization result: valid
 Downloading certificate [IIS] Default Web Site, (any host)
 Store with CertificateStore...
 Installing certificate in the certificate store
 Adding certificate [IIS] Default Web Site, (any host) @ 2022/3/2 12:17:21 to store WebHosting
 Installing with IIS...
 Adding new https binding *:443:ec2amaz-hh9q23q.ml
 Committing 1 https binding changes to IIS
 Adding Task Scheduler entry with the following settings
 - Name win-acme renew (acme-v02.api.letsencrypt.org)
 - Path C:\Users\Administrator\Downloads\win-acme.v2.1.20.1185.x64.pluggable
 - Command wacs.exe --renew --baseuri "https://acme-v02.api.letsencrypt.org/"
 - Start at 09:00:00
 - Random delay 04:00:00
 - Time limit 02:00:00
 Adding renewal for [IIS] Default Web Site, (any host)
 Next renewal scheduled at 2022/4/26 12:16:35
 Certificate [IIS] Default Web Site, (any host) created

 N: Create certificate (default settings)
 M: Create certificate (full options)
 R: Run renewals (0 currently due)
 A: Manage renewals (1 total)
 O: More options...
 Q: Quit

 Please choose from the menu:
```
### httpsでアクセス
ここまでくるとようやくクライアントPCからhttpsで接続できるようになります。
できない場合はSGでの設定を再度見直してみてください。

## まとめ

AWSでインスタンスを構築からSSLでのアクセスまでを確認しました。
インフラ作業に慣れていないと戸惑うこともありますが、このくらいの手順は覚えておきたいですね。