AWS
lambda
serverless

AWSLambdaが環境変数対応して、serverlessもそれに対応したので使ってみた

More than 1 year has passed since last update.


結論


  • serverless-plugin-write-env-vars/dotenvは不要になります

  • (serverlessの場合)パスワードなどの暗号化は継続的に必要です


設定方法

serverlessを最新バージョン(1.2以降)にアップデートします。

また、serverless-plugin-write-env-vars + dotenvで環境変数を設定していた場合は以下のような変更を行いデプロイすればOKです


serverless.yml

custom:

writeEnvVars: # 削除
ONE: ${env:ONE} # 削除

plugins:
- serverless-plugin-write-env-vars # 削除

provider:
name: aws
runtime: nodejs4.3
environment: # 追加
ONE: ${env:ONE} # 追加



handler.js

require("dotenv").config(); // 削除


詳しくはこちらを参照してください


環境変数はKMSを利用して暗号化されます

権限によって見れたり見れなかったりします


AWSコンソール上での表示


権限がある場合

lambda_env1.png


権限がない場合

利用するKMSのキーをデフォルトから独自にものに変えて、指定のキーでの復号化権限のないIAM User/Roleの場合

lambda_env2.png


問題点


利用する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