【问题标题】:How to use AWS KMS in AWS lambda如何在 AWS lambda 中使用 AWS KMS
【发布时间】:2020-09-30 03:59:37
【问题描述】:

我刚刚开始使用 AWS 服务,尤其是 AWS Lambda。有没有办法在 Lambda 代码 (Java) 中使用 AWS KMS 服务。我想使用 KMS 来解密加密的外部化(从属性中读取)秘密。我的 Lambda 代码在 java 中。提前致谢。

【问题讨论】:

  • 这对你有用吗?我正在尝试做同样的事情,但一直卡在两件事上:1.在运行时不能包含加密密码。我找到的唯一解决方案是创建其他源目录并根据配置文件将它们包含在 Leiningen 中。 2.从lambda调用KMS时,我的函数挂起并超时(不管我设置了多长时间)

标签: aws-lambda aws-kms


【解决方案1】:

在 Python 中:

with open('encrypted_pem.txt', 'r') as encrypted_pem:
    pem_file = encrypted_pem.read()

kms = boto3.client('kms', region_name=REGION)
return kms.decrypt(CiphertextBlob=b64decode(pem_file))['Plaintext']

取自AWS Labs Chef cleanup source

README of that repo 首先解释了如何使用 AWS KMS CLI 加密 PEM 文件。

【讨论】:

  • 另外,请确保具有适当的 KMS 权限,以便能够访问/使用 KMS 解密操作。
【解决方案2】:

是的,它应该可以正常工作。

我最近将一个 Node.js RESTful API 移植到 Lambda,并且无需更改任何 KMS 代码。

您只需确保运行您的 Lambda 函数的角色对您通过 AWS 设置的密钥具有权限,以用于加密/解密调用。

【讨论】:

    【解决方案3】:

    我在 Node.js 10.x(异步/等待方式)中有一个实现,它对你很有用。 首先,如前所述,您必须确保为 Lambda 函数提供具有 KMS 服务权限的角色。

    在 Javascript 中:

    const AWS = require('aws-sdk');
    const fs  = require('fs');
    const kms = new AWS.KMS();
    const { promisify } = require('util');
    const readFileAsync = promisify(fs.readFile);
    
    const decrypt = async (kms) => {
      let secret = null;
      try {
        const secretPath = `./your.encrypted.file.json`;
        const encryptedSecret = await readFileAsync(secretPath);
        let params = {
          CiphertextBlob: encryptedSecret
        };
    
        const decrypted = await kms.decrypt(params).promise();
        secret = decrypted.Plaintext.toString('utf-8');
      } catch (exception) {
        console.error(exception);
        throw new Error(exception);
      }
    
      return JSON.parse(secret);
    }
    

    【讨论】:

      【解决方案4】:

      我将使用 JavaScript adk 来访问 KMS 密钥。我们需要创建一个 lambda 函数 assign policy[read, put, list, roate]。使用aws-adk 访问密钥。

      第 1 阶段:使用适当的策略创建 lambda 函数。 AWS 密钥管理的 Sam 策略模板列表(POLICY_TEMPLATE)

      ---
      AWSTemplateFormatVersion: 2010-09-09
      Transform: AWS::Serverless-2016-10-31
      Description: Lambda function to show demo
      
      Parameters:
        OutputPrefix:
          Type: String
          Description: Prefix for variables exported from templates.
      
      Globals:
        Function:
          Runtime: nodejs12.x
          Handler: index.handler
          Environment:
            Variables:
              STORE_TABLE_NAME:
                Fn::ImportValue: !Sub "${OutputPrefix}-StoreTable"
      
      Resources:
        StoreItemInsertHandlerFunction:
          Type: AWS::Serverless::Function
          Properties:
            FunctionName: StoreItemInsertHandler
            CodeUri: ../../../src/handlers/dist
            Policies:
              - AWSSecretsManagerGetSecretValuePolicy:
                  SecretArn: "*"
      

      第 2 阶段:使用 aws-sdk 访问密钥

      import AWS from 'aws-sdk';
       const getSecretKey = async (key) => {
        const client = new AWS.SecretsManager({
          region: env('AWS_REGION'),
        });
        let result = '';
        try {
          result = await client.getSecretValue({ SecretId: key }).promise();
        } catch (e) {
          throw new Error(`Secret key [${key}] is not set.`);
        }
        return result;
      };
      
      

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 2020-02-25
        • 2022-01-01
        • 2020-05-06
        • 2019-11-18
        • 2021-01-06
        • 2023-02-08
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多