はじめに
本記事では、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で接続:
# ssh -i "キーファイルの格納パス" ec2-user@<パブリックIP>
ssh -i "C:\test\xxxxx.pem" ec2-user@<パブリックIP>
⚠エラーが出てしまった場合⚠
秘密鍵の設定状態が誰でも閲覧できるようになっている状態だと思うので以下のコマンドを実行して秘密鍵が「自分だけしか読めない」状態に設定
# 管理者権限で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環境構築
# 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 で保存して閉じる
# このコマンドで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を転送:
# 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インストール
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
nginx.confの編集
sudo vi /etc/nginx/nginx.conf
編集モード
i キーを押す → INSERTモードになり、文字が入力できる状態になります(左下に -- INSERT -- と表示)。
編集終了・保存
ESC キーを押す → コマンドモードに戻る
:wq と入力して Enter → 保存して終了
(w=write、q=quit)
編集を取り消して終了(変更せず終了したいとき)
ESC → :q! → Enter
(! をつけることで強制終了)
nginx.conf を前回編集中に異常終了したため、スワップファイル(.swp)が残ってしまったときの対処法
sudo rm /etc/nginx/.nginx.conf.swp
sudo vi /etc/nginx/nginx.conf
以下のように編集:
server {
listen 80;
server_name ドメイン名;
location / {
proxy_pass http://localhost:8080;
}
}
再読み込み:
sudo nginx -t
sudo systemctl reload nginx
CertbotでHTTPS対応
sudo amazon-linux-extras enable epel -y
sudo yum install certbot python3-certbot-nginx -y
sudo certbot --nginx -d ドメイン名
HTTPS用の設定が/etc/nginx/nginx.conf
に追記されるか確認。
問題なければ、以下も記載。
リダイレクト設定も追記:
server {
listen 80;
server_name ドメイン名;
return 301 https://$host$request_uri;
}
再度適用:
sudo nginx -t
sudo systemctl restart nginx
ステップ7:HTTPSでアクセス確認
ブラウザで https://ドメイン名
にアクセスして、HTTPSの鍵マークが表示されれば成功!
おまけ
Dockerコマンド
# 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/