尝试使用 KMS 解密 Lambda 函数中的密文会导致超时

2024-02-20

使用 AWS CLI 从命令行解密密文时,密文可以顺利解密:

$ aws kms decrypt --ciphertext-blob fileb://encrypted-secrets --output text --query Plaintext --region us-east-1 | base64 --decode > decryped-secrets

当尝试从 js 脚本执行此解密操作时,此解密操作也可以在本地运行:

#!/usr/local/bin/node

const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});

const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);

const params = {
      CiphertextBlob: encryptedSecret
};

kms.decrypt(params, function(err, data) {
  if (err) {
    console.log(err, err.stack);
  } else {
    const decryptedScret = data['Plaintext'].toString();
    console.log('decrypted secret', decryptedScret);
  }
});

但是,当尝试在 AWS Lambda 函数的上下文中使用与上述几乎相同的代码执行此操作时,该函数的调用会导致超时:

'use strict';

const zlib = require('zlib');
const mysql = require('mysql');
const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});

const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);

const params = {
    CiphertextBlob: encryptedSecret
};

exports.handler = (event, context, callback) => {
    kms.decrypt(params, (err, data) => {
       if (err) {
            console.log(err, err.stack);
            return callback(err);
        } else {
            const decryptedScret = data['Plaintext'].toString();
            console.log('decrypted secret', decryptedScret);
            return callback(null, `Successfully processed ${parsed.logEvents.length} log events.`);
        }
    });
};

超时日志:

START RequestId: start-request-id-redacted Version: $LATEST
END RequestId: end-request-id-redacted
REPORT RequestId: report-requested-id-redacted  Duration: 10002.43 ms   Billed Duration: 10000 ms   Memory Size: 128 MB Max Memory Used: 18 MB  
2016-11-13T19:22:28.774Z task-id-redacted Task timed out after 10.00 seconds

Notes:

  • 如果我注释掉对kms.decrypt并尝试console.log the params或者任何其他东西,这些值的输出都没有问题。似乎存在某种问题kms.decrypt调用,并且超出超时时间不会返回任何实际错误。
  • 附加到调用 lambda 函数的角色的策略包含附加策略AWSLambdaVPCAccessExecutionRole,以及以下附加的内联策略:

policygen-lambda_basic_execution_and_kms_decrypt-201611131221:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sid-redacted",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:us-east-1:account-redacted:key/key-id-redacted"
            ]
        }
    ]
}
  • 我已经从代码中删除了所有识别信息。

在与非常乐于助人的 AWS 支持人员进行一番交谈后,我们得到了答案:

超时的主要原因是由于 KMS 服务在配置 Lambda 函数的 VPC 中没有终端节点,导致 Lambda 函数内部缺乏与 KMS 服务的连接。

为了使 VPC 中的 Lambda 函数能够连接到anyAmazon S3 以外的服务,does如果 VPC 中有一个终端节点,则 Lambda 函数必须位于至少一个(但最好是两个)私有子网中/与其关联,其路由表包括到 NAT 网关的目标路由 0.0.0.0/16。

It is not可以让 Lambda 函数位于具有 Internet 网关的公共子网中。

获取 VPC 绑定的 Lambda 函数以访问 KMS 和没有 VPC 终端节点的所有其他服务的步骤:

  1. Create or take note of an existing Private Subnet, which has a routing table entry for 0.0.0.0/0 to a NAT Gateway.
    • 如果您还没有上面指定的 NAT 网关、路由表和子网,则必须首先创建它们并将它们适当地相互关联。
  2. 创建 Lambda 函数时,将 Lambda 函数附加到上面的私有子网,或者编辑 Lambda 函数以具有该配置。

如果您按照这两个步骤操作,您应该能够调用kms.encrypt以及来自 Lambda 函数内的其他请求,这些请求需要出站/出口互联网连接,因为这些服务在您的 VPC 内没有终端节点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试使用 KMS 解密 Lambda 函数中的密文会导致超时 的相关文章

随机推荐

  • 如何优雅地结束 spring @Schedule 任务?

    我正在尝试让 Spring Boot 服务优雅地结束 它有一个方法 Scheduled注解 该服务使用 spring data 作为数据库 使用 spring cloud stream 作为 RabbitMQ 在计划的方法结束之前 数据库和
  • CSS,如何使水平菜单和子菜单居中?

    我正在学习 css 但我不知道菜单和子菜单居中 我正在使用 margin auto 或 margin left 和 margin right 为 auto 但它不起作用 任何帮助 将不胜感激 谢谢 HTML div ul li a href
  • 如何在JavaScript中不使用输入类型文件读取包含html的文本文件?

    我有一个文本文件assets包含一些要在特定组件的 div 中呈现的 html 的文件夹 有没有一种方法可以读取该文件并将内容分配给字符串变量 而无需用户与 ngOnInit 中的视图 具有输入文件类型 进行交互 我的发现如果我将 html
  • 如何覆盖 CSS

    我有基本的 CSS 经验 所以我想知道如何删除由 Primefaces 设置的 CSS 样式 ui inputfield ui widget content ui inputfield ui widget header ui inputfi
  • Hadoop:映射器和缩减器的数量

    我使用不同数量的映射器和缩减器 例如 1 个映射器和 1 个缩减器 1 个映射器和 2 个缩减器 1 个映射器和 4 个缩减器 在 1 1GB 文件上多次运行 Hadoop MapReduce Hadoop安装在具有超线程的四核机器上 以下
  • JS:未捕获类型错误:对象不是函数(onclick)

    Edit 这是一个 JSfiddle http jsfiddle net XpmZG Edit2 错误在这一行
  • 如何获取物理设备支持的音频格式(WinAPI、Windows)

    我有一个音频设备 USB 麦克风 我想找出它本机支持的音频格式 位深度和采样率 在 OS X 上有一个很好的 kAudioStreamPropertyAvailablePhysicalFormats Core Audio 属性 但我找不到类
  • 使用文件名中的当前日期创建文件 + Robocopy 日志记录

    由于对批处理文件 脚本和一般 编码 的经验很少 我很快就遇到了我想要创建的批处理的问题 情况如下 我有一个文件夹 其中自动插入 txt 文件 我想根据文件的名称将这些文件移动到不同的文件夹 我用 Robocopy 做了这个 效果很好 然后我
  • 如何为 AlertDialog 创建 setAdapter()

    我创建了一个CustomDialogBuilder延伸Dialog 我想创建方法setApater 我创建了该部分 但是onClick适配器上的方法不起作用 My customDialogBuilder下面给出了类 public class
  • 为什么带有转换器的多重绑定在工具提示中不起作用?

    对于相当复杂的 WPF 工具提示的一部分 我尝试使用 MultiBinding 来生成基于两个属性的格式化文本 问题是 绑定的 MultiConverter 接收DependencyProperty UnsetValue对于其中的每个项目v
  • matplotlib matshow xtick 顶部和底部标签

    我正在尝试可视化名称共现矩阵 这个版本工作正常 import pandas as pd import numpy as np import string import matplotlib pyplot as plt n 10 names
  • 在 GitHub 上以协作者身份编辑文件

    我正在尝试对我被邀请作为合作者的 GitHub 存储库进行更改 我可以创建新文件并修改它们 但是当我尝试对现有文件进行任何更改时 我看到这条消息说 您必须在分支上才能对该文件进行或建议更改 然后 只有在通过终端推送提交后 我才能在 GitH
  • FEATURE_ACTIVITY_TRANSITIONS 与 FEATURE_CONTENT_TRANSITIONS

    我无法理解这两者之间的区别Window http developer android com reference android view Window html标志 但我不能 100 确定何时需要使用每一个以及为什么 的文档Window
  • 为什么 Flutter 小部件是不可变的?

    我无法理解为什么 Flutter 对象是不可变的 我在 Flutter 文档中尝试过 但没有那么有帮助 如果有人能帮助我解决这个问题 我将不胜感激 另外 我两天前才开始使用 flutter 非常棒 From https api flutte
  • 如何使用python捕获网络流量[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 python 并尝试抓取我的计算机和站点之间的 HTTP s 流量 其中包括所有传入和传出请求 响应 例如图像和外部调用等
  • @ngrx/store 是可观察到的热还是冷?

    我认为它是一个冷可观察的对象 默认情况下 但在代码或文档中找不到对它的引用 抱歉 如果已经问过这个问题 找不到东西 TLDR这是一个热门的观察点 因为动作主题 https github com ngrx platform blob mast
  • 如何在 vscode 中根据自定义的 launch.json 创建模板?

    对于我的项目 我定制了我的启动 json file 如何将自己的自定义启动配置保存为模板 就像C GDB LLDB 模板 这样我每次打开新文件夹 项目 时都可以轻松地重新使用它 我不想将其添加到下面全局启动配置 https code vis
  • 如何订购淘汰赛绑定?

    我正在使用 Knockout js 我陷入了一个有点奇怪的情况 很难解释 但我正在尝试 如果我不清楚 抱歉 我在单个选择列表上使用自定义绑定和选项绑定
  • 什么是缓冲区?什么是缓冲读和缓冲写?

    今天很长一段时间后我听到了 缓冲区 这个词 想知道是否有人可以很好地概述缓冲区以及它在当今世界的重要性的一些例子 缓冲区通常是内存的一部分 其中包含尚未完全提交到其预期设备的数据 在缓冲 I O 的情况下 通常有一个快速设备和一个慢速设备
  • 尝试使用 KMS 解密 Lambda 函数中的密文会导致超时

    使用 AWS CLI 从命令行解密密文时 密文可以顺利解密 aws kms decrypt ciphertext blob fileb encrypted secrets output text query Plaintext region