如何在AWS lambda

时间:2015-09-16 23:07:08

标签: aws-lambda aws-kms

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

在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文件。

答案 2 :(得分:0)

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

在Java语言中:

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);
}

答案 3 :(得分:0)

我将使用JavaScript adk访问KMS密钥。我们需要创建一个lambda函数分配策略[读取,放置,列表,轮换]。使用aws-adk访问密钥。

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

---
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;
};