我刚刚开始使用AWS服务,特别是AWS Lambda。有没有办法在Lambda代码(Java)中使用AWS KMS服务。我想使用KMS来解密加密的外部化(从属性读取)秘密。我的Lambda代码在java中。提前谢谢。
答案 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;
};