🔛

Pythonのwsgiref.simple_serverをEC2で試してみる

2023/02/15に公開

前置き

どうも地元が嫌いな人です。
今日はEC2で簡単なPythonプログラムを動かします。
このプログラムは標準ライブラリのwsgiref.simple_serverを使ったものです。
EC2で適当に何かを動かしてみよう的なのりです。

EC2を立ち上げる

まずはEC2の画面に行きます そうしなければ何も始まりません。

次にオレンジ色の「インスタンス」を起動を押します

・ 名前 お好みで
・ OS amazon Linux

・ Architecture 64ビット(x86)
・ インスタンスタイプ t2.micro
・ ここで青色の「キーペアを作成」をクリックしてキーペアを作ります
(これをやらないとサーバーに入れません)

クリックするとこんな画面が出るので

名前をお好みで入力してオレンジ色の「キーペアを作成」をクリックします。
するとキーペアがダウンロード出来るのでインスタンスを削除するまで
大切に保管しておきましょう

このままインスタンスを作成しても良いのですが、今回はユーザーデータを使います
「高度な詳細」をクリックします

一番下までスクロールして
ユーザーデータ と書かれているところに記入します。

今回は以下の内容を入力します。

#!/bin/bash
sudo yum update -y

上から一行ずつ解説すると
一行目がシェバンと呼ばれるもので今回のようなシェルスクリプトを書く際のお作法です。
書かなくても動いてくれたりしますが、環境によっては不具合が出るので書きましょう[1]
2行目はAmazon Linux2のアップデートを行っています

次に「インスタンスを起動」をクリックしてインスタンスを作成します。

ステータスチェックが「2/2 のチェックに合格しました」になるまで待ちます。

※このスクショではインスタンス作成時にキーペアを選択せずにインスタンスを作成するという
間抜けなことを2回も繰り返したため3台のインスタンスが表示されています。

作成したインスタンスへ接続する

ステータスチェックが完了したらサーバーへ接続するのですが、
今回は楽をしたいのでAWSの便利機能を使います。
作成したインスタンスにチェックをつけて「接続」をクリックします。

こんな表示になって

こんな感じの画面になれば接続成功です。

Python3がインストールされているか確認する

以下のコマンドを入力してバージョン情報が表示されたらインストール成功です

python3 -V

デフォルトだとPython3のバージョンが少し古いみたいですが、
お試しなので今回は気にしません。

サンプルプログラムをダウンロード

今回動かすPythonプログラムはこれです。

from wsgiref.simple_server import make_server
import json

def app(environ, start_response):
  status = '200 OK'
  headers = [
    ('Content-type', 'text/html; charset=utf-8'),
    #('Accddess-Control-Allow-Origin', '*'),
  ]
  start_response(status, headers)
  html = """
    <html>
    <head>
        <title> {title} </title>
    </head>
    <body>
        Hello AWS
        {str1}
    </body>
    </html>

  """
  html = html.replace('{title}', 'AWS')
  html = html.replace('{str1}', '<br>good price')

  return [html.encode('utf-8')]

with make_server('', 8080, app) as httpd:
  print("Start server")
  httpd.serve_forever()
  

内容としては標準ライブラリでHTMLを返しているだけです。
またLinuxは80番などの1024以下のウェルノンポートを利用するのは面倒なので
8080番ポートを利用しています。
以下のコマンドでDL出来ます。

wget https://gitlab.com/-/snippets/3624996/raw/main/simple-web-python.py

プログラムを動かす

いよいよ動かします。

python3 simple-web-python.py

動いてるインスタンスのグローバルIPを確認する

この状態のまま再度EC2の画面に戻ってPythonプログラムを動かしているインタンスを開きます。
この画像だと一番下のやつです

開いてこんな画面になったら

「パブリック IPv4 アドレス」をコピーします

ブラウザからアクセスする(失敗編)

コピーしたIPアドレスをブラウザに貼り付けてアクセスします。

...
..
.

出ない!
出ないんですね これが出ないんだなぁー

ファイヤーウォールのポートを開ける

原因はファイヤーウォールで通信が塞がれているからです。
なので許可するように設定します。

「動いてるインスタンスのグローバルIPを確認する」で開いたページに戻り
下の「セキュリティー」から「セキュリティグループ」をクリックします。

「インバウンドのルールを編集」をクリックします。

「ルールを追加」をクリックします

・ タイプ カスタムTCP
・ ポート範囲 8080
・ ソース Anywhere
上記を選択したら「ルールを保存」をクリックします。

こんな感じの画面が出たら完了です。

ブラウザからアクセスする(成功編)

再度アクセスしてみます。


出たー!出た! 出たぁ〜

終わり

続き

脚注
  1. ぶっちゃけシェル芸みたいな高度なことしない限り動くことが多い気はしますが ↩︎

Discussion