2021年10月30日土曜日

Python+Flask+AWSGI プログラムの動作確認

このページではPython + AWS Lambda + AWS API Gateway でREST APIを動作させる前に Flask + AWSGI で作ったスクリプトがLambdaで動作するかを確認します。

Lambda関数を作成する

新規 Lambda関数の作成手順については割愛します。
以下を参考にしていただければ簡単です。
コンソールで Lambda の関数の作成

Lambda関数に作成したスクリプトとpipのパッケージを登録する

このページでは以下の記事で準備したスクリプトを登録します。
Python+Flask+AWSGI プログラムの作成

AWS Lambdaでpipのパッケージを利用するには、自分で各種ファイルをアップロードしてやる必要があります。
ざっくりとした手順は以下の通り。

  1. PCに空のディレクトリを作成する。
  2. 1.で作成したディレクトリにpip install package_name -t ./ で必要なpipパッケージをインストールする。
  3. 1.で作成したディレクトリの直下に「lambda_function.py」を作成する。
  4. zipファイルにまとめる。ここでは1.のディレクトリを圧縮するのではなく、ディレクトリの中身を圧縮する。(zipファイルの直下にlambda_function.pyが来るようにする)
  5. AWS マネジメントコンソールのLambda関数画面からzipファイルをアップロードする。

pipで使用している-tはインストール先を指定するためのスイッチです。
zipファイルのアップロードについては、このページ下部の参考URLに詳細が掲載されています。

POSTリクエストの内容を返せるかテストする

API Gatewayのルールに沿った応答を返せるか、Lambda関数画面からテストすることができます。
手順は以下の通り。

  1. AWS マネジメントコンソールのLambda関数画面で「Test」ボタンから新規テスト作成画面(テストイベントの設定)を開く。
  2. 「新しいテストイベントの作成」を選択し、イベントテンプレートから「apigateway-aws-proxy」を選択する。
  3. 表示されたJSONの"path"の値を"/"にする。
  4. 「作成」ボタンをクリックし、テストを実行する。

上手くいけば以下のような内容のデータがテスト結果に出力されます。pathの値が正しくないと404エラーが返ります。
テストテンプレートのJSONの内容についてはこのページ下部の参考URLに詳細が掲載されています。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}

以上で動作確認まで完了です。
この後 API Gatewayの設定をしていきます。

参考

.zip ファイルアーカイブで Python Lambda 関数をデプロイする
コンソールで Lambda の関数の作成
API Gateway で Lambda プロキシ統合を設定する

2021年10月22日金曜日

Python+Flask+AWSGI プログラムの作成

ここではPython + AWS Lambda + AWS API Gateway でREST APIの動作確認をするための簡単なPythonアプリを作成します。

利用環境

  • Windows 10 Pro
  • Python 3.9

必要なパッケージのインストール

アプリ開発端末に必要なPipパッケージをインストールします。
今回はFlaskとAWSGIを利用します。(他にも有用な組み合わせはあるようです)

アプリ用のフォルダを新規作成し、コマンドプロンプトでそこに移動します。
ここでpipパッケージをインストールしますが、パッケージのインストール先をカレントディレクトリにしておきます。
後々AWS Lambdaに登録する際、作成したPythonのファイルと一緒にpipパッケージをアップロードする必要があるからです。

パッケージのインストール先を指定するには「-t」を使います。

C:\Users\hoge>mkdir app01
C:\Users\hoge>cd app01
C:\Users\hoge\app01>python -m pip install AWSGI Flask -t ./

Pythonスクリプトの作成

AWS Lambdaで動作させるためにファイル名は「lambda_function.py」とし、関数「lambda_handler」を定義します。

import awsgi
from flask import (
    Flask,
    request,
    jsonify,
)

app = Flask(__name__)

@app.route('/')
def path_dev():
    name=request.args.get("name")
    return jsonify(message="Hello! " + name)

def lambda_handler(event, context):
    print("at lambda_handler")
    return awsgi.response(app, event, context, base64_content_types={"image/png"})

後はLambdaにアップロードして動作確認できればOKです。

参考

サーバのメールをクライアントPCで閲覧したい。(dovecot, imap)

概要

閉じられた環境で動いているサーバがあるのですが、cronやlogwatchの動作履歴をクライアントPCで手軽に見たいなー、と思い立ちました。

幸いどちらもメール通知機能があるので、IMAP POP3対応のdovecotを導入しThunderbird等のメーラでメールを閲覧できるようにします。

とりあえず閉じた環境なので、セキュリティ関連は後で設定する ということですっ飛ばしています。

ざっくりとした構成は以下の図のような感じ。

image/svg+xml DOVECOT DOVECOT CentOS CentOS IMAP Port :143 IMAP... cron logwatch etc ... cron... Mail Mail User/Password User/Password

環境

  • CentOS 7
  • dovecot 2.2.36
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ yum list installed | grep dovecot
dovecot.x86_64                         1:2.2.36-8.el7                  @base

dovecot のインストール

yum から普通にインストールします。

$ yum install dovecot

サーバ起動時に自動起動するように設定します。

$ systemctl enable dovecot

設定ファイルを変更する

imap接続を許可する

クライアントからimap接続をさせるために設定ファイルを修正します。

$ vi /etc/dovecot/dovecot.conf

...

protocols = imap

...

imap以外の接続方法を無効化する

imaps、pop3、pop3s といったプロトコルを無効化するには、各プロトコルのポートの設定を0にします。コメントアウトは効かないようです。

$ vi /etc/dovecot/conf.d/10-master.conf
...

service imap-login {
  service_count=1
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 0
    ssl = yes
  }
}
service pop3-login {
  service_count=1
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 0
    ssl = yes
  }
}

...

ipv4 すべてのインターフェースをlistenする

今回はipv4のみを使用するので以下のように設定します。

$ vi /etc/dovecot/dovecot.conf

...

listen = *

...

平文認証の設定

クライアントからユーザ名/パスワードでログインできるようにします。
(暗号化は後で、多分やる・・・)

$ vi /etc/dovecot/conf.d/10-auth.conf
...

disable_plaintext_auth = no
auth_mechanisms = plain login

...

メールボックスの設定

とりあえずmbox形式でメールを保存します。(何となくmaildir方式の方がよさそうなので、後日機会を見て変更します。)

$ vi /etc/dovecot/conf.d/10-mail.conf
...

mail_location = mbox:~/mail:INBOX=/var/mail/%u:INDEX=MEMORY

...

設定の反映

dovecotを再起動して変更した設定を反映させます。

$ systemctl restart dovecot

ファイアウォールの設定

imapの接続を許可します。

$ firewall-cmd --add-service imap
$ firewall-cmd --list-service
imap

以上!

以上でサーバの設定は完了です。
Thunderbirdでアカウントを設定すればメールが受信できるはずです。

mbox方式からMaildir方式への変更

概要 CentOS7にPostfixとDovecotがをインストールしましたが、メールの保存形式が「mbox」方式のままです。 サーバのメールをクライアントPCで閲覧したい。(dovecot, imap) これを「Maildir」方式に変更します。 mbox と Ma...