【初心者向け】AWSアカウント作成からHTTPS（SSL証明書）対応までの完全ガイド

## はじめに

本記事では、AWS初心者の私が実際にEC2インスタンスを作成し、独自ドメインでHTTPS通信（SSL証明書）を有効化するまでの手順を備忘録としてまとめます。対象は以下のような方です：

+ Spring BootやJavaアプリをAWS上で公開したい人
+ 独自ドメインでHTTPS（SSL）通信を実現したい人
+ docker-composeでアプリケーションを構築している人

## ステップ1：AWSアカウント作成とEC2の立ち上げ
1\.  AWS公式サイト（https://aws.amazon.com/jp/?nc2=h_lg） からアカウントを作成
2\. マネジメントコンソールへログイン
3\. `EC2インスタンス`を作成（Amazon Linux 2023を推奨）
4\. セキュリティグループに以下を許可：
+ SSH (ポート22)(自身のIPアドレス)
+ HTTP (ポート80)(0:0:0:0/0)
+ HTTPS (ポート443)(0:0:0:0/0)
+ DB用のポート(今回は5432を使用)(EC2のIPアドレス)
+ 必要に応じて8080も追加

5\. `.pem` キーファイル（秘密鍵）をダウンロード
6\. ローカル端末からSSHで接続：
```bash
# ssh -i "キーファイルの格納パス" ec2-user@<パブリックIP>
ssh -i "C:\test\xxxxx.pem" ec2-user@<パブリックIP>
```

#### ⚠エラーが出てしまった場合⚠
秘密鍵の設定状態が誰でも閲覧できるようになっている状態だと思うので以下のコマンドを実行して秘密鍵が「自分だけしか読めない」状態に設定
```bash
# 管理者権限でPoweShellを開く
icacls "C:\test\xxxxx.pem" /inheritance:r
icacls "C:\test\xxxxx.pem.pem" /grant:r "$($env:USERNAME):(R)"
icacls "C:\test\xxxxx.pem.pem" /remove "BUILTIN\Users"
```

## ステップ2：Docker & docker-compose環境構築
```bash
# Docker
# ① パッケージ更新
sudo yum update -y
# ② Dockerのインストール
sudo yum install -y docker
# ③ Dockerサービスの起動
sudo systemctl start docker
# ④ 再起動したときに自動でDockerが起動されるようにする
sudo systemctl enable docker
# ⑤ ec2-user を docker グループに追加（sudo無しで使えるように）
sudo usermod -aG docker ec2-user
# ⑥ 一度ログアウトして再接続
exit
#Dockerが動いていることを以下のコマンドで確認
docker info

# Docker Compose（PostgreSQL 16.7コンテナを使用）
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
# 確認
docker-compose --version
```

## ステップ3：Dockerfile作成
保存方法：Ctrl + X → Y → Enter で保存して閉じる

```bash
# このコマンドでDockerfileが作成される
nano Dockerfile

# ここから下がDockerfileの記載内容
FROM amazoncorretto:21

# タイムゾーンの設定
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 作業ディレクトリの設定
WORKDIR /app

# JARファイルのコピー
# xxxx.jarを/app/abcde.jarとして保存
COPY xxxxx.jar /app/abcde.jar

# アプリケーションの実行
ENTRYPOINT ["java", "-jar", "abcde.jar"]

# コンテナがリッスンするポートを指定
EXPOSE 8080
```

## ステップ4：デプロイ
1\. `scp`でアプリのjarファイルやdocker-compose.ymlを転送：
```bash
# scp -i "キーファイルの格納パス" "転送ファイルの格納場所" ec2-user@<パブリックIP>:/home/ec2-user/

# docker-compose
scp -i "C:\test\xxxxx.pem" "C:\test\docker-compose.yml" ec2-user@<パブリックIP>:/home/ec2-user/

# jarファイル
scp -i "C:\test\xxxxx.pem" C:\test\xxxxx.jar ec2-user@<パブリックIP>:~
```

2\. EC2上で`docker-compose up -d --build`

## ステップ5：Route 53で独自ドメインを取得
1\. AWSマネジメントコンソール > Route 53 > ドメインの購入
2\. 例：`ドメイン名`
3\. ドメイン取得後、自動でホストゾーンが作成されます
4\. ホストゾーンにAレコードを追加：
+ 名前：空欄（ルートドメイン）
+ タイプ：Aレコード
+ 値：EC2のパブリックIPアドレス

## ステップ6：Nginx設定とHTTPS対応
#### Nginxインストール
```bash
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
```

### nginx.confの編集

```bash
sudo vi /etc/nginx/nginx.conf
```
### 編集モード
i キーを押す → INSERTモードになり、文字が入力できる状態になります（左下に -- INSERT -- と表示）。
### 編集終了・保存
ESC キーを押す → コマンドモードに戻る
:wq と入力して Enter → 保存して終了
（w＝write、q＝quit）
### 編集を取り消して終了（変更せず終了したいとき）
ESC → :q! → Enter
（! をつけることで強制終了）
### nginx.conf を前回編集中に異常終了したため、スワップファイル（.swp）が残ってしまったときの対処法
```bash
sudo rm /etc/nginx/.nginx.conf.swp
sudo vi /etc/nginx/nginx.conf
```


以下のように編集：
```bash
server {
    listen 80;
    server_name ドメイン名;
    location / {
        proxy_pass http://localhost:8080;
    }
}
```
再読み込み：
```bash
sudo nginx -t
sudo systemctl reload nginx
```

#### CertbotでHTTPS対応
```bash
sudo amazon-linux-extras enable epel -y
sudo yum install certbot python3-certbot-nginx -y
sudo certbot --nginx -d ドメイン名
```
HTTPS用の設定が`/etc/nginx/nginx.conf`に追記されるか確認。
問題なければ、以下も記載。
リダイレクト設定も追記：
```bash
server {
    listen 80;
    server_name ドメイン名;
    return 301 https://$host$request_uri;
}
```
再度適用：
```bash
sudo nginx -t
sudo systemctl restart nginx
```

## ステップ7：HTTPSでアクセス確認
ブラウザで `https://ドメイン名` にアクセスして、HTTPSの鍵マークが表示されれば成功！

## おまけ
Dockerコマンド
```bash
# lsで現在いるディレクトリに格納されているファイルを確認
$ ls
Dockerfile  xxxxx.jar  docker-compose.yml

# ログの確認
docker-compose logs -f

# Dockerイメージをビルド ： 同じイメージ名を使っていたら、既存のイメージが上書きされる
docker build -t イメージ名

# 起動コンテナ一覧（オプション -a で停止含めて表示）
docker ps

# コンテナ停止（stopとrmを一度に実行）
docker-compose down

# コンテナ停止（個別）
docker stop xxxxx-app xxxxx-db

# コンテナ削除（NAMES）
docker rm 削除対象のname

# コンテナ再起動
docker-compose up --build
```

## おわりに
今回はAWSのアカウント作成からHTTPS化までを一連の流れでまとめました。
最初は戸惑う部分も多いですが、一つずつクリアしていけば問題なく公開までたどり着けます！

この記事がどなたかの参考になれば幸いです。

## 参考文献
AWS公式ドキュメント
https://docs.aws.amazon.com/
Certbot公式
https://certbot.eff.org/
nginx公式ドキュメント
https://nginx.org/en/docs/