6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS Chaliceでchalice localしているかどうかを判定する

Last updated at Posted at 2019-12-07

はじめに

AWS上でAPI GatewayLambdaを使ってWEBサービスを作るときに便利なPythonフレームワークのAWS Chalice。便利ポイントの一つが、chalice localコマンド一発で、手元のPC(ローカル)にWEBサーバが立ち上がって、AWS上で動かすものと同じものが動いてしまう、というところ1。テストとデバッグがめちゃくちゃ捗ります。

課題

という便利なchalice localなんですが、ローカルで動かしていることをコードで判定する直接的な方法が無さそうだったので、考えてみました。
きっかけは、実施例にも示したとおり、AWS上で動かすときとローカルで動かすときでログのフォーマットを変えようとしたことです2

解決方法

以下でできます。環境変数を活用します3

  • chaliceの設定ファイル(config.json)でchalice local用のstageを定義し、定義したstageに適当な環境変数を設定する。
  • chalice localするときには、上記で定義したstageを--stageオプションで指定する。

これにより、コード側では、環境変数の存在をチェックすることで、chalice localしている(ローカルで実行している)かどうかを判定できるようになります。

実施例

設定ファイル

config.json
{
  "version": "2.0",
  "app_name": "testapp",
  "environment_variables": {
  },
  "stages": {
    "dev": {
      "api_gateway_stage": "api"
    },
    "local": {
      "environment_variables": {
        "IS_LOCAL": "true"
      }
    }
  }
}

localというstageに、IS_LOCALという環境変数をセットしています。

コード本体

app.pyの一部
import logging
import os

# setup logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logformat = (
    '[%(levelname)s] %(asctime)s.%(msecs)dZ (%(aws_request_id)s) '
    '%(filename)s:%(funcName)s[%(lineno)d] %(message)s'
)
if os.environ.get('IS_LOCAL'):
    logformat = (
        '[%(levelname)s] %(asctime)s.%(msecs)dZ '
        '%(filename)s:%(funcName)s[%(lineno)d] %(message)s'
    )
formatter = logging.Formatter(logformat, '%Y-%m-%dT%H:%M:%S')
for handler in logger.handlers:
    handler.setFormatter(formatter)

AWS上で動かすときとローカルで動かすときでログのフォーマットを変更しています2

実行方法

$ chalice local --stage local

chalice localするときには、定義したstageを--stageオプションで指定します。

おわりに

この方法、chalice localに必ず--stageオプションを付ける必要があるところがいまいちですが、課題は確かに解決できているので活用してます。
ログフォーマット以外での活用例があれば知りたい。。。(-;

  1. Tutorial: Local Mode - Quickstart and Tutorial — Python Serverless Microframework for AWS

  2. すごく細かい話なんですが、logging.Formatterに渡すフォーマット情報のうち、aws_request_idはlamba上で動かすときにしか値が得られません。chalice localするときにこの情報を使っているとエラーが出てしまうので、AWS上かローカルかでログのフォーマットを変えてあげたくなります。 2

  3. Environment variables on chalice local · Issue #748 · aws/chalice

6
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?