2018年6月22日金曜日

AWS Lambda で環境変数を使用 暗号化と復号

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

ただいま、Lambdaで関数作りを頑張っています。

環境変数を使用する

Lambda には環境変数をセットする項目があります。




環境変数を使用する用途としては、例えばソースにコミットするわけにはいかないパラメータの取り扱いですね。

WebAPIを使用するためのパスワードとかがそれに当たりますが、ソースや設定ファイルにパスワードを書いてコミットしておくとソースをチェックアウトする開発者全員にバレてしまいますから、環境変数にセットしておいておくことでソースには含めないわけです。

他には、私は「実行環境の場所」を判別するのにも便利です。

「ローカルで動作確認する時はこっち」「Lamda上でテストする時はこっち」「本番実行する時はこっち」と今、自分がどのモードで動いているのかを判別する材料として環境変数をセットしておくわけです。

デプロイ時にパラメータを切り替えると切り替え忘れたりしますが、環境変数にセットしておけばそんなことは心配無用ですからね。

その他、ログレベルを動的に変えるとか、使い方は色々。

サーバレスだからこそ、環境変数を便利に使うのがコツと言えると思います。


環境変数をセットして読み取り

では、実際に環境変数をセットしてみましょう。
セットは簡単。

キーと値をセットして終わり。



読み取る時は、その言語標準の方式で読み取ればOKです。
Pythonだとこうなります。

import os


def lambda_handler(event, context):
    param = os.getenv("test")

    # Tacy
    print(param)


簡単ですね。

暗号化

環境変数は暗号化することも出来ます。
暗号化したパラメータは後で復号することも可能です。

キーの作成と暗号化

まず、IAMのマネージメントコンソールから鍵を作成します。



そしてLambdaのコンソールから鍵をセットすると、何やら「暗号化」という項目が出てきましたね。



暗号化ボタンを押すと、もうどんな値が入っていたかは見えなくなります。



さて、後はこれをどうやって復号するかですが、実は「暗号」ボタンのすぐ右の「コード」というボタンを押すとすぐにサンプルソースが出てくるんですよ。

シークレットスニペットの復号

import boto3
import os

from base64 import b64decode

ENCRYPTED = os.environ['test']
# Decrypt code should run once and variables stored outside of the function
# handler so that these are decrypted once per container
DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext']

def lambda_handler(event, context):
  # TODO handle the event here

親切で助かりますね。

では、動作確認してみましょう。

動作確認ソース

import boto3
import os

from base64 import b64decode


def lambda_handler(event, context):
    ENCRYPTED = os.environ['test']

    # 390c9aa7-75f3-11e8-abe0-656e318945ae
    print(ENCRYPTED)

    DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext']

    # Tacy
    print(DECRYPTED.decode())

無事に出力されました。
特に問題は無さそうですね。

終わりに

案外簡単でした。
ただ、この環境変数って昔は無かったそうです。

2016年くらいにリリースされたみたいですね。

Lambdaはまだまだリアルタイムで進化形のサービスなのかもしれませんね。

0 件のコメント:

コメントを投稿