EC2にHTTP接続する

AWSのEC2に構築した(パブリックサブネット内の)仮想サーバーにHTTP接続する方法をまとめました。

動作環境

ホストOSWindows 11 Home 22H2(22621.963) 64bit
ブラウザChrome 109.0.5414.75
Visual Studio Code1.74.3
GoLang1.19.5

設定手順

EC2に仮想サーバーを構築

ここを参考に進めてみてください。

EC2にセキュリティグループを設定

VPC上の通信を制御するためのセキュリティグループを設定します。ここで仮想サーバーの8080番ポートをHTTP接続先として開放します。前述の手順でSSHの接続先ポートを設定したセキュリティグループに追加する形にします。

[ソース]には作業しているPCのグローバルIPアドレスを設定しましたが、ブログなどのWebサイトとして利用するなら、『0.0.0.0/0』でもいいと思います。

VS CodeのSSH接続設定

仮想サーバーにVS CodeからSSH接続して、Webサーバーとしての環境を整えていきます。ここではGoLang(Go言語)のnet/httpパッケージを使って接続できるようにしていきます。VS Codeをインストールしていない場合、迷うことはないと思いますが、ここを参考に進めてみてください。

拡張機能『Remote Development』のインストール

ここを参考に進めてみてください。

VS Codeから仮想サーバーにSSH接続

EC2に仮想サーバーを構築する際に作成したキーペアの秘密鍵を.sshフォルダに格納し、configファイルを用意します。

C:\Users\[ユーザー]\.ssh
    config
    キーペアの秘密鍵(pemファイル)

configファイルの内容は下記のようにしておきます。

Host [任意の名前]
  HostName [仮想サーバーのパブリックIPアドレス]
  User [仮想サーバーへのログインユーザー名]
  IdentityFile C:\Users\[ユーザー名]\.ssh\[pemファイル名]
  IdentitiesOnly yes # 指定した秘密鍵のみを許可
  PasswordAuthentication no # パスワード接続を拒否

この状態でVS Codeのサイドメニュー[Remote Explorer]を開き、該当の接続設定を選択すると、仮想サーバーにSSH接続できると思います。もし設定が表示されない場合は、VS Codeを再起動してみてください。

SSH接続に成功するとVS Code左下が下記のような表示になります。

仮想サーバーにWebサーバー環境を構築

GoLangのインストール

[Terminal] > [New Terminal]を開き、作業ディレクトリの作成、GoLangのインストールをします。このディレクトリ内にGoLangのプログラムファイルを作成します。

# ホームディレクトリにいる前提
# GoLangのインストール
sudo apt update
sudo apt upgrade
sudo wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xvf go1.19.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
source .profile
go version
------------------------------
go version go1.19.5 linux/amd64
------------------------------
# 作業ディレクトリを作成
sudo mkdir /webserver
sudo chown -R ubuntu /webserver
cd /webserver
sudo touch main.go
go mod init [任意のGoプロジェクト名]

Webサーバーの作成

main.goにWebサーバーを起動するプログラムを記述します。

package main

import (
    "fmt"
    "net/http"
    "log"
)

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "<h1>Hello Internet!!</h1>")
}

func main() {
    http.HandleFunc("/", hello)
    // rootユーザーじゃないので8080を解放
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

ソースコードをビルドします。

go build [任意のGoプロジェクト名]

Webサーバーのデーモン化

Webサーバーをデーモン(サービス)化し、起動します。

sudo vi /etc/systemd/system/webserver.service
------------------------------
[Unit]
Description=Webserver

[Service]
ExecStart=/bin/bash -c './[任意のGoプロジェクト名]'
WorkingDirectory=/webserver
Restart=always
Type=simple
User=ubuntu

[Install]
WantedBy=multi-user.target
------------------------------
sudo systemctl daemon-reload
sudo systemctl start webserver.service
sudo systemctl status webserver.service
systemctl list-units --type=service | grep webserver

WebサーバーにHTTP接続

ブラウザから下記で接続できればOKです。

http://[仮想サーバーのパブリックIPアドレス]:8080