EC2にApacheでPython動かした時の覚書


Hello World!というhtmlを返す+S3に何か書き出せることだけ確認したときの覚書。

インストール

$ sudo yum install httpd

設定

/etc/httpd/conf/httpd.conf
を編集

  • Options に ExecCGIを追加
  • DirectoryIndex に index.pyを追加
  • AddHandler cgi-script に.pyを追加

ソースコード

/var/www/html/
にindex.pyをつくってコード書く

$ chmod 755 index.py
して実行できるようにする。

boto3使うので入れる
$ sudo pip install boto3

書いたコード

(BucketNameは自分のバケット名に書き換え)

index.py
#!/usr/bin/python
# coding:utf-8

import boto3
import logging
import datetime
import cgi
import uuid

def main():

    now_s = datetime.datetime.now().strftime('%Y.%m.%d-%H:%M:%S')
    messge = "no-message"
    field = cgi.FieldStorage() # クエリパラメータにmessageがあれば使う
    if field.has_key('message'):
        message = field['message'].value

    # html
    print "Content-Type: text/html\n"
    print "Hello World!"

    # S3
    s3 = boto3.resource('s3')
    key = 'test-folder/{0}-{1}.txt'.format(now_s, uuid.uuid4())
    s3.meta.client.put_object(Bucket='BucketName', Key=key, Body=message)

    # log
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
    logger = logging.getLogger()
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)

    logger.error(message)
    logger.info(message)

if __name__ == "__main__":
    main()

Apache Start

$ service httpd start

確認

httpリクエストして、以下が確認できればOK。

  • 応答が200で、Hello World!というhtmlが返る。
  • S3の指定したバケットのtest-folderに「日付+日時+uid.txt」みたいな名前のファイルができている。
  • ログ出力できている。

その他

PostされたBodyを取得したいとき、それがフィールドとして壊れてたり生データだとcgi.FieldStorageから取れず、not indexableエラーでる。sys.stdin.read()ならとれた。

How to parse the “request body” using python CGI?