はじめに
以前、Elastic Beanstalkのワーカー環境だけ作る方法を記事にしました。
その際用意できなかったサンプルコードを作成しましたので記事にしました。
コード
以下のサンプルを拝借して作りました。
python.zip
を解凍してコードを少し書き換えます。welcome
の中身を空文字にしただけです。
import logging.handlers
# Create logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Handler
LOG_FILE = '/tmp/sample-app.log'
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=1048576, backupCount=5)
handler.setLevel(logging.INFO)
# Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Add Formatter to Handler
handler.setFormatter(formatter)
# add Handler to Logger
logger.addHandler(handler)
welcome = "" # ここを空文字にしただけ
def application(environ, start_response):
path = environ['PATH_INFO']
method = environ['REQUEST_METHOD']
if method == 'POST':
try:
if path == '/':
request_body_size = int(environ['CONTENT_LENGTH'])
request_body = environ['wsgi.input'].read(request_body_size)
logger.info("Received message: %s" % request_body)
elif path == '/scheduled':
logger.info("Received task %s scheduled at %s", environ['HTTP_X_AWS_SQSD_TASKNAME'],
environ['HTTP_X_AWS_SQSD_SCHEDULED_AT'])
except (TypeError, ValueError):
logger.warning('Error retrieving request body for async work.')
response = ''
else:
response = welcome
start_response("200 OK", [
("Content-Type", "text/html"),
("Content-Length", str(len(response)))
])
return [bytes(response, 'utf-8')]
圧縮
他のファイル、フォルダを削除します。
- .ebextensions/
- cron.yaml
- EBSampleApp-Python.iml
残ったapplication.py
だけを選択してzipファイルにします。
デプロイ
Elastic Beanstalkにて、環境からデプロイします。
環境を作成していない場合は、以前の記事を参考に作成してください。
”ファイルを選択”にて、先ほど作成したzipファイルを指定して、デプロイします。
確認
インスタンスの中に入ります。インスタンスへのアクセスについては前回の手順になります。
cat /tmp/sample-app.log
で、ログが確認可能です。
確認するファイルを抑えたら、実際にキューにメッセージを入れてみます。
コンソールでSQSのサービスを表示します。Elastic Beanstalkの環境の画面からリンクもあります。
2つ作成されていますので、WorkerQueue
を選びます。
「メッセージを送受信」から、メッセージ本文を入力して、「メッセージを送信」をクリックします。
キューに入ったことを確認するため、同画面の下部でポーリングを行えますが、すぐに処理されてしまうため、メッセージは取得できませんでした。
処理されたことを確認するために、EC2に戻りcat /tmp/sample-app.log
を実行しログを見てみます。
ワーカーインスタンスで取得され、ログに出ていることを確認できました。
おわりに
以前の際はサンプルコードがわからず載せられませんでしたが、いろいろやってみて調べがつきましたので記事にしました。
同様の課題をお持ちの方の力になれれば幸いです。