LoginSignup
7
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-29

結論

  • 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

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5