【Tips】AWS Lambdaの環境変数にJSONを設定したい!

AmazonLambda

森永です。

アップデートでLambdaに環境変数を設定出来るようになりました。
人間というのは欲深いもので、一つのことができるようになるとすぐに別のことを求めるようになります。

そんな私も環境変数を設定できると聞いて検証している時に、「JSON突っ込めればコード内で取り回ししやすくてウハウハじゃね?」と思うようになりました。
そこで、以下のような簡単なJSONを設定してみたのですが、見事エラーが出ました。

{ "name" : "hoge", "value" : "fuga"}

よくよくドキュメントを読むと、カンマ,を使用できないということが判明しました。
JSONにとってカンマを使えないのは飛車角落ちどころじゃない話です。

それでも僕はJSONを使いたい

カンマがダメならカンマを使わない形に変換すればいいじゃないかという結論に至ります。
そこで思いついたのが、Base64です。

早速やってみましょう。
まずは、JSONをBase64でエンコードします。
Pythonで手っ取り早くエンコードしちゃいます。

$ python
>>> import base64
>>> base64.b64encode("{ \"name\" : \"hoge\", \"value\" : \"fuga\"}")
'eyAibmFtZSIgOiAiaG9nZSIsICJ2YWx1ZSIgOiAiZnVnYSJ9'
>>>

これをLambdaの環境変数に突っ込みます。

Lambda_Management_Console

あとはこんなコードを書いてあげます。(Python以外でもいけるはずです)
やっていることは、Base64でデコードして、json.loadsで辞書型に変換しているだけです。

import os
import json
import base64

def lambda_handler(event, context):

    print os.environ['JSON']

    # 環境変数をデコード    
    json_str = base64.b64decode( os.environ['JSON'] )
    print json_str

    # デコードした環境変数をjson.loadsして辞書型に変換
    json_dict = json.loads( json_str )

    # あとは使うだけ
    print json_dict['name']

実行すると以下のようになります。

eyAibmFtZSIgOiAiaG9nZSIsICJ2YWx1ZSIgOiAiZnVnYSJ9
{ "name" : "hoge", "value" : "fuga"}
hoge

ちゃんとJSONとして使用することが出来ました!!やったー!!!

さいごに

カンマ使えないということが判明しテンション下がっていたのですが、なんとかJSON使える方法を編み出せました。
ブログのネタになると思えばこれくらいの苦労は安いもんです。
JSON以外でもカンマを使用したい場合はBase64をお試しください。