結論
- serverless-plugin-write-env-vars/dotenvは不要になります
- (serverlessの場合)パスワードなどの暗号化は継続的に必要です
設定方法
serverlessを最新バージョン(1.2以降)にアップデートします。
また、serverless-plugin-write-env-vars + dotenvで環境変数を設定していた場合は以下のような変更を行いデプロイすればOKです
custom:
writeEnvVars: # 削除
ONE: ${env:ONE} # 削除
plugins:
- serverless-plugin-write-env-vars # 削除
provider:
name: aws
runtime: nodejs4.3
environment: # 追加
ONE: ${env:ONE} # 追加
require("dotenv").config(); // 削除
詳しくはこちらを参照してください
環境変数はKMSを利用して暗号化されます
権限によって見れたり見れなかったりします
AWSコンソール上での表示
権限がある場合
権限がない場合
利用するKMSのキーをデフォルトから独自にものに変えて、指定のキーでの復号化権限のないIAM User/Roleの場合
問題点
利用するKMSのキーをserverless.ymlで指定できない
AWSコンソール(もしくはawscli)ではKMSのキーを指定できますが、serverless(というよりCloudFormation)では設定できなそうです
AWS Cloud Formation AWS::Lambda::Function
なお、AWSコンソール上で変更してしまえば以降はserverlessでデプロイしてもその設定が引き継がれます
serverlessで作成するCloudFormationのテンプレートには平文で書かれる
AWS Lambda上では暗号化されて権限がないと見れなくても、CloudFormationの権限があればテンプレートが見れるので、設定済みの環境変数も見えてしまいます
CloudFormationに対して外部から変数を設定するか、kmsで暗号化した環境変数をCloudFormationに設定してLambda側では復号化された状態で動いたらうれしいですね
serverlessで暗号化が必要なパスワードなどのデータを環境変数として平文で設定するのは微妙でした
おまけ
自動で作成されるKMSのキーのポリシー
他のサービスの自動作成されるキーと同様でそのサービスへのアクセス権があれば見えます。
$ aws kms get-key-policy --key-id xxxxxxxxxx --policy-name default | jq -r ".Policy" | jq "."
{
"Version": "2012-10-17",
"Id": "auto-awslambda",
"Statement": [
{
"Sid": "Allow access through AWS Lambda for all principals in the account that are authorized to use AWS Lambda",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:CreateGrant",
"kms:DescribeKey"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:CallerAccount": "xxxxxxxxxx",
"kms:ViaService": "lambda.ap-northeast-1.amazonaws.com"
}
}
},
{
"Sid": "Allow direct access to key metadata to the account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxx:root"
},
"Action": [
"kms:Describe*",
"kms:Get*",
"kms:List*",
"kms:RevokeGrant"
],
"Resource": "*"
}
]
}
関連
New for AWS Lambda – Environment Variables and Serverless Application Model (SAM)
Flexible Environment Variable Support for AWS Lambda - Serverless Framework V1.2