AWS Lambda で本番/検証環境を切り替える場合、いくつかの手段があります。今回はContext オブジェクトから得られる関数名を利用するアプローチを紹介します。なおコード例は Python です。

前提: AWS Lambda に環境変数はない

AWS Lambda に 環境変数はありません。機能追加が待ち望まれる今日この頃ですが、外部サービスのトークンなど、セキュリティ上の観点からソースコードに埋め込みたくない情報を利用する場合は、AWS KMS を利用するのが宜しいと思います。

本番/検証環境の切替方法

ところで、ソースコード中で $ENV などの環境変数の値に応じて、設定ファイルの読み込み先やログ出力のレベルを変更するなど、プログラムの動作を変更したい場合があります。

上述のとおり、AWS Lambda では環境変数は利用できないので、どこかから情報を取得する必要があります。

1つの方法として、Build/Deploy のプロセスの中で値を変更する策が考えられます。環境毎に設定ファイルを用意しておき、ファイル名を変更してもよいかも知れません。しかし、CI サービスを利用しない/できない場合や、その他要因でこの方法がとれない場合、以下の方法を検討してみてください。

context.function_name の利用

AWS Lambda の Entry Point (標準では lambda_handler()) へ渡される2つのオブジェクトのうち、context からは AWS Lambda の環境に関するさまざまな情報を取得できます。内容は上述の公式ドキュメントが詳しいです。

本番/検証環境それぞれで別の Function として Deploy している場合、動作の切替判定に context.function_name が利用できます。

def lambda_handler(event, context):

    if context.function_name == "your-awesome-function":
        log_level = "ERROR"

    elif context.function_name == "dev-your-awesome-function":
        log_level = "INFO"

    else:
        log_level = "DEBUG"

Unit Test

AWS Lambda は特性上、手元に実行環境がないため、簡単なスクリプトでも Unit Test を準備しておくことをおすすめします。Unit Test では、Context オブジェクトは以下のように生成し、lambda_hanlder() に渡します。

pytest を利用したテストコードの抜粋です。

class DummyContext(object):

    def __init__(self, function_name):
        self.function_name = function_name

class TestLambdaFunction(object):

    def test_your_function(self):
        event = {}
        context = DummyContext("dev-your-awesome-function")

        result = lambda_function.lambda_handler(event, context)
        assert result is True

以上です。