[アップデート]AWS SAM CLIがローカル実行時に環境変数をdotenv形式のファイルから取得できるようになりました

[アップデート]AWS SAM CLIがローカル実行時に環境変数をdotenv形式のファイルから取得できるようになりました

2026.03.23

初めに

先週末にAWS SAM CLI v1.156.0がリリースされました。

https://github.com/aws/aws-sam-cli/releases/tag/v1.156.0

これまではSAMのローカル実行で環境変数を渡す際には、所定のJSON形式でファイルを作成し--env-varsに渡す必要がありました。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html#serverless-sam-cli-using-invoke-environment-file

これはこれでstart-api等で複数のLambda関数を動かす場合でも一つのファイルに環境変数をまとめて渡せて便利なのですが、dotenv(.env)のように一般的に利用される形式ではないので、デバッグでローカルでちょっと動かしたりテストコードを走らせる等SAMを通さない実行をする場合、SAM用とは別の形式で環境変数の情報を保持する必要があり管理的手間となっておりました。

今回のアップデートで--env-varsに指定可能なファイルフォーマットとして一般的によく使われるdotenv形式が追加されたことにより、必ずしも独自のJSON形式で持つ必要がなくなり管理の手間が省ける形になります。

複数の関数に異なるdotenvを渡すことはできない

AWS SAMでは必ずしも1コマンドで1つの関数が立ち上がるのではなく複数の関数を立ち上げる場合があります(前述のようにstart-apiが一例)。

dotenvは{{環境変数名}}={{値}}を列挙するだけの非常にシンプルな形式で、JSONやYAML,TOMLといったような形式のように構造上のデータを標準では持つことができません。

今回のアップデートの仕様では--env-varsには一つのファイルしか受け渡せない点は変わらず、起動するすべての関数にそこに指定された環境変数を読み込ませるという関係上、関数ごとに値を変えたい場合はこれまで通りのJSON形式を利用する必要があるためご注意ください。

利用してみる

早速使ってみましょう...と言いつつフラグ等があるわけではなくいい感じに読み込んでくれるのでそちらのフォーマットを指定するだけです。

Lambda関数のコードはこのような形にしておきます。あくまで環境変数として読み込まれるのでpython-dotenvは不要です。

app.py
import json,os

def lambda_handler(event, context):
    message=os.getenv('FUNC_NAME')

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": message
        }),
    }

.envの中身は以下の通りです。

.env
FUNC_NAME=hello_world

フォルダ構成としてはこのような形にしてます。渡す引数の関係上結果はなんとなくわかる感じになりますが、念の為関数も2つにして先に記載したstart-apiの件も一応確認します。

./sam-app
├── .env
├── hello_world
│   ├── __init__.py
│   └── app.py
├── hello_world_1
│   ├── __init__.py
│   └── app.py
├── samconfig.toml
├── template.yaml
...

こちらで起動します。

% sam --version
SAM CLI, version 1.156.0
% sam local start-api --env-vars .env
...
 * Running on http://127.0.0.1:3000
2026-03-23 17:19:02 Press CTRL+C to quit

## ちなみに一つ前のバージョンで叩くと当然ですが解析できずエラーとなります。
% /tmp/venv/bin/sam --version
SAM CLI, version 1.155.2
% /tmp/venv/bin/sam local start-api --env-vars .env
Error: Could not read environment variables overrides from file .env: Expecting value: line 1 column 1 (char 0)

別画面からcurlで叩いてみるとうまく値が渡っていることが確認できます。
良くも悪くも同じ環境変数名を2つの関数で利用している場合は、両方を上書きしてしまうので注意しましょう。

% curl http://127.0.0.1:3000/hello
{"message": "hello world"}

% curl http://127.0.0.1:3000/hello-1
{"message": "hello world"}

デバッグログを出すと読み込みエラーっぽいログが出てるのですが、これはJSONでパース→失敗したらdotenv形式のパースを行うという形でフォーマットの判別を行っている仕組みの関係で出るログであり特にエラーではないのでご安心ください。

2026-03-23 16:59:39,104 | Failed to parse .env as JSON, attempting .env format

https://github.com/aws/aws-sam-cli/blob/7cfb88a92826bd596531859d18716eb4b21ab739/samcli/commands/local/cli_common/invoke_context.py#L724-L730

終わりに

アップデート内容自体は細かなことですが、デバッグによる部分実行やテストコードの実行等で何だかんだSAM外の実行は0になるわけではない以上.env自体を使うケースも多いかと思いますので、その多重管理をなくせるのは割と嬉しい部分じゃないかと思います。
(最近はAIの登場によって.envへの機密情報の記載は色々言われる部分もありますが...)

元々各種dotenvライブラリを取り扱うことで回避できる部分できる部分ではあるので、作り次第ではそこまでメリットはないケースもありますが、環境によってはハンドラー関数を持つファイルでdotenvのライブラリを読んでいればその読み込みコストを減らせたり、条件分岐の削減、誤って開発の.envを持ち込んで読み込まれる等のリスクを回避できる部分もあるので、これは?と思った方は今回のアップデートに合わせてその部分を調整してみても良いのではないでしょうか。

この記事をシェアする

FacebookHatena blogX

関連記事