Elastic Beanstalkのワーカー環境のPythonサンプル

# はじめに

以前、Elastic Beanstalkのワーカー環境だけ作る方法を記事にしました。

https://qiita.com/a_b_/items/3b49c5dd582dd13b8f04

その際用意できなかったサンプルコードを作成しましたので記事にしました。

# コード

以下のサンプルを拝借して作りました。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/GettingStarted.DeployApp.html

`python.zip`を解凍してコードを少し書き換えます。`welcome`の中身を空文字にしただけです。

```python:application.py
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ファイルにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4682237d-7b2a-06d7-9b80-0c9e0795b8c0.png)

# デプロイ

Elastic Beanstalkにて、環境からデプロイします。
環境を作成していない場合は、[以前の記事](https://qiita.com/a_b_/items/3b49c5dd582dd13b8f04)を参考に作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b119f0f4-ae1a-7aa3-8ca4-d9a0b70583d1.png)

”ファイルを選択”にて、先ほど作成したzipファイルを指定して、デプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/169c426a-24c9-b0bb-95c0-422027682a12.png)

デプロイが終わるまで、少し待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2747df87-8183-7152-d7b0-9f608bbcd0e3.png)

デプロイが終わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/554022d6-1156-1a27-21e2-6942a4bc54d7.png)

終わらない場合は右上の更新を押して確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/06a33566-cba9-1584-e997-5c665ed33702.png)

# 確認

インスタンスの中に入ります。インスタンスへのアクセスについては前回の手順になります。

https://qiita.com/a_b_/items/3b49c5dd582dd13b8f04#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E5%85%A5%E3%82%8B

`cat /tmp/sample-app.log`で、ログが確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a92a375f-503d-c4af-6ba6-e5a6d9b0629b.png)

確認するファイルを抑えたら、実際にキューにメッセージを入れてみます。

コンソールでSQSのサービスを表示します。Elastic Beanstalkの環境の画面からリンクもあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ef5f4f50-9b70-5081-864b-7bc4fed0e5b9.png)

2つ作成されていますので、`WorkerQueue`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8cfb1d0e-0925-0055-1337-c5aec601d7b2.png)

「メッセージを送受信」から、メッセージ本文を入力して、「メッセージを送信」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d5d3b9a4-7f95-d9d4-9cc3-46bdbace93c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d4c2ab8f-38d4-bffa-d13c-0bf5f7689241.png)

キューに入ったことを確認するため、同画面の下部でポーリングを行えますが、すぐに処理されてしまうため、メッセージは取得できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3a180e8e-beb7-2ebb-18d5-569501823f3a.png)

処理されたことを確認するために、EC2に戻り`cat /tmp/sample-app.log`を実行しログを見てみます。
ワーカーインスタンスで取得され、ログに出ていることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/273de845-2578-9cd4-f971-08847cad335c.png)

# おわりに

以前の際はサンプルコードがわからず載せられませんでしたが、いろいろやってみて調べがつきましたので記事にしました。
同様の課題をお持ちの方の力になれれば幸いです。