Lambdaの環境変数をKMSで暗号化して、Pythonで復号化する

# 今回のお題
IAMの暗号化キーを生成し、その暗号キーを用いてLambdaの環境変数を暗号化する。
暗号化したものをPythonで複合化して、表示してみる。

## 暗号化キーを作成する
IAM > 暗号化キーを選択する。
<img width="157" alt="スクリーンショット 2017-11-15 23.46.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/0a4e75a7-234c-1d25-00ef-6dedfd17b80c.png">

### リージョンを東京に変更する
<img width="1042" alt="スクリーンショット 2017-11-15 23.47.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/c94e04d5-225b-bbb9-d335-4ed9c7dc0fda.png">

### 画面上部のキーの作成を押下する
<img width="284" alt="スクリーンショット 2017-11-15 23.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/bdfbff48-1676-a417-9bdc-0e404a983be5.png">

### エイリアスを入力し、KMSを選択する。
今回はテストなので「test/key」としました。
入力・選択を終えたら、画面下部の「次のステップ」押下
<img width="669" alt="スクリーンショット 2017-11-15 23.49.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/5efd85ff-e146-446a-97f0-524ddb49e722.png">

### タグキーを入力
入力したら画面下部の「次のステップ」押下
<img width="971" alt="スクリーンショット 2017-11-15 23.50.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/972d8dfe-01ea-e383-b0b8-8fc7f4e89d00.png">

### キー管理者を設定
本来は、ちゃんと設定するのでしょうが、今回はlambdaのデフォルトで用意されている「lambda_basic_execution」を設定しました。
あと、自分のAWSのログインIDも設定します（変更したりできるようにするため)
<img width="950" alt="スクリーンショット 2017-11-15 23.51.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/b4c7e16f-e4ab-635f-045d-ff624edfa72c.png">

### キーの使用者の設定
こちらも同じく「lambda_basic_execution」とAWSの自分のIDを設定しておきます。
<img width="950" alt="スクリーンショット 2017-11-15 23.53.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/4ff780e5-e5de-ba98-689b-74539a30b0a4.png">

### 完了
作成が終えると、キーの一覧に表示されます。
<img width="1022" alt="スクリーンショット 2017-11-15 23.55.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/681f1d51-18d1-9c5b-c854-d10cc6450b6a.png">

## Lambdaの環境変数を設定し、暗号化する
サービス > lambdaを選択し、ソースインラインの下にある環境変数に値を入れ、暗号化を設定していきます。

### 環境変数に値を入れる
<img width="906" alt="スクリーンショット 2017-11-15 23.57.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/38bdd960-418a-8fc1-88a9-ffbd9650352d.png">

### 暗号化の設定を開く
「伝送中の暗号化のためのヘルパーの有効化」のチェックをONにすると、伝送中に暗号化するKMSキーが表示されます。
<img width="888" alt="スクリーンショット 2017-11-15 23.59.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/e6dbb162-04b7-cfa0-8c4a-0f46520bec88.png">

### 前手順で作成したKMSキーを選ぶ
リスト式ですので、クリックすると設定されている一覧が表示されます。
先ほど作成したKMSキーを選択しましょう。
<img width="869" alt="スクリーンショット 2017-11-16 0.00.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/c05a24c4-9ca1-ab30-4339-0b7540509196.png">

### 環境変数の暗号化を押下する
KMSキーを設定すると、環境変数に暗号化ボタンが表示されますので、押下します。
<img width="886" alt="スクリーンショット 2017-11-16 0.01.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/03249125-5977-c51c-c8ea-5b5e1aecaf0a.png">

↓

<img width="896" alt="スクリーンショット 2017-11-16 0.04.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/5228703e-5439-479f-158d-27bdc6204baf.png">

## Pythonで環境変数を読み込んでみる。

Lambdaで、下記のようなソースを記載します。

```
# coding: UTF-8

import os

def lambda_handler(event, context):
    print('~~~~~環境変数表示~~~~~')
    print(os.environ['test'])
```
保存して、実行します。
ログには、下記のように表示されました。
無事に暗号化できているようです。
<img width="568" alt="スクリーンショット 2017-11-16 0.06.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/6625109e-025a-37f9-686d-79b9f05a0397.png">

## 復号化してみる
復号化は、簡単でした。
下記のようなソースを記載し、実行して見ます。

```
# coding: UTF-8
from base64 import b64decode
import boto3
import os

def lambda_handler(event, context):
    kms = boto3.client('kms')
    decrypt_text = kms.decrypt(CiphertextBlob=b64decode(os.environ['test']))['Plaintext']
    
    print("~~~~~~~~~~~~~~復号化確認~~~~~~~~~~~~~~~~")
    print(os.environ['test'])
    print(decrypt_text)
```

実行結果
↓
<img width="581" alt="スクリーンショット 2017-11-16 0.09.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/2891ed5f-47ef-0a13-ea73-8b06897f1fa4.png">

## まとめ。
環境変数に対する暗号化・復号化が非常に簡単にできました。
すごい便利ですねこれ。ロールをきちんと考えれば、セキュリティ的にも大丈夫な気がします。