如何在 AWS Lambda 中缓存多个 AWS Parameter Store 值?

2023-12-23

我想限制在 AWS Lambda 中调用 AWS Parameter Store 的次数。使用全局变量,我在第一次调用 Parameter Store 时缓存 Parameter Store 值。

main.py

import os

import boto3


redis_password = None

def get_redis_password():
    global redis_password
    if not redis_password:
        client = boto3.client("ssm")
        redis_password = client.get_parameter(
            Name=f"{os.environ["ENV"]}.redis-cache.password",
            WithDecryption=True
        )
    return redis_password["Parameter"]["Value"]

def lambda_handler(event, context):
    get_redis_password()

但是,如果我想缓存多个 Parameter Store 值,我必须创建多个全局变量并if not [INSERT_GLOBAL_VARIABLE]检查。例如:

main.py

import os

import boto3


redis_password = None
another_parameter_store_value = None

def get_redis_password():
    global redis_password
    if not redis_password:
        client = boto3.client("ssm")
        redis_password = client.get_parameter(
            Name=f"{os.environ["ENV"]}.redis-cache.password",
            WithDecryption=True
        )
    return redis_password["Parameter"]["Value"]

def get_another_parameter_store_value():
    global another_parameter_store_value
    if not another_parameter_store_value:
        client = boto3.client("ssm")
        another_parameter_store_value = client.get_parameter(
            Name=f"{os.environ["ENV"]}.another.parameter.store.key",
            WithDecryption=True
        )
    return redis_password["Parameter"]["Value"]

def lambda_handler(event, context):
    get_redis_password()
    get_another_parameter_store_value()

尝试的解决方案

为了解决这个问题,我创建了一个参数存储实用程序。

parameter_util.py

import os
import boto3


class ParameterUtil:
    def __init__(self):
        self.boto_client = boto3.client("ssm")

    def get_parameter(self, parameter_path):
        response = self.boto_client.get_parameter(
            Name=f"{os.environ['ENV']}.{parameter_path}", WithDecryption=True
        )

        return response["Parameter"]["Value"]

我的理论是,通过将 AWS Boto 客户端实例化为实例变量,它将缓存整个 Boto 客户端对象。然后get_parameter将使用缓存的 Boto 客户端进行调用。例如:

main.py

import os

import boto3

from parameter_util import ParameterUtil


redis_password = None

def get_redis_password():
    global redis_password
    if not redis_password:
        client = boto3.client("ssm")
        redis_password = client.get_parameter(
            Name=f"{os.environ["ENV"]}.redis-cache.password",
            WithDecryption=True
        )
    return redis_password["Parameter"]["Value"]

def lambda_handler(event, context):
    param_util = ParameterUtil()
    param_util.get_parameter(".redis-cache.password")
    param_util.get_parameter(".another.parameter.store.key")

但是,我不太确定这是否能解决问题。

问题

缓存 Boto 客户端是否会导致每个参数仅调用一次参数存储get_parameter叫做?还是我优化的地方不对?


您的原始代码将无法工作,因为param_util是一个局部变量,每次 Lambda 调用都会超出范围。

您可以使用内置的@functools.lru_cache http://docs.python.org/dev/library/functools.html#functools.lru_cache创建一个处理任何参数的简单函数。它将根据函数的输入为您缓存返回值(Python 3.2+)。

Decorator to wrap a function with a memoizing callable that saves up to the maxsize most recent calls. It can save time when an expensive or I/O bound function is periodically called with the same arguments.

Example:

ssm_client = boto3.client("ssm")

@lru_cache(maxsize=None)
def get_param(name):
    return ssm_client.get_parameter(
        Name=f"{os.environ['ENV']}.{name}",
        WithDecryption=True
    )["Parameter"]["Value"]

def lambda_handler(event, context):
  redis_password = get_param("redis-cache.password")
  another_parameter_store_key = get_param("another.parameter.store.key")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 AWS Lambda 中缓存多个 AWS Parameter Store 值? 的相关文章

  • Python中Shift和Caps Lock的状态

    我正在使用 Python 2 5 编写 TkInter 应用程序 我需要找出大写锁定和 Shift 键的状态 true 或 false 我在整个网络上进行了搜索 但找不到解决方案 Tkinter 中的键盘事件可能很棘手 我建议您按顺序查看以
  • 在 python 中更改函数的 __qualname__ 时会发生什么?

    为了能够pickle嵌套函数 用于多重处理 我用装饰器装饰了嵌套函数 def globalize one func def wrapper one args kwargs return func args kwargs setattr mo
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 清理嵌套的 Try/Excepts

    我刚刚编写了一段代码 令我印象深刻的是 它的嵌套程度远远超过了最佳值 我想了解如何改进其风格 特别是使其更符合 扁平优于嵌套 的原则 for app in apps if app split 1 0 zc only look for cro
  • 将行转换为 pandas 中逗号分隔的字符串

    我有一个熊猫数据框 from pandas import DataFrame import pandas as pd df2 DataFrame a one one two two three two one six b x y z y x
  • 没有实例的 Django Formset

    In this http docs djangoproject com en dev topics forms modelforms inline formsetsDjango Doc 解释了如何创建一个表单集 该表单集允许您编辑属于特定作
  • 在 Python 中使用带有 asyncio 的信号量

    我试图限制使用信号量同时运行的异步函数的数量 但我无法让它工作 我的代码归结为 import asyncio async def send i print f starting i await asyncio sleep 4 print f
  • Django-获取外键对象列表

    假设我有以下模型 class ParentModel models Model name models CharField child models ForeignKey ChildModel class ChildModel models
  • Scipy - 求矩阵列空间的基数

    我正在尝试编写一个简单的单纯形算法 其第一步是找到一个基本的可行解决方案 选择 A 的线性独立列的一组 B 将 x 中与不在 B 中的列相对应的所有分量设置为零 求解 m 个所得方程以确定 x 的分量 这些是基本变量 我知道解决方案将涉及使
  • 带有 pygame 的 Pyinstaller

    我曾多次尝试使用 PyInstaller 来捆绑我的 Python2 程序 但它似乎从未与 Pygame 模块一起使用 我已经看到了有关此主题的许多其他问题 但我找不到任何有用的答案 有人知道这个问题的解决方案吗 我正在尝试在 Ubuntu
  • zsh:当我尝试在 venv 中运行应用程序时,中止 python 错误

    我使用以下命令设置 Python 3 6pyenv这样我将来就可以管理多个Python版本 例如3 7和3 8 我没有使用 Homebrew 安装 Python 因为它改变了系统版本 这是我第一次使用zshshell 因为它是 Catali
  • TensorFlow 的 Print 或 K.print_tensor 不会在损失函数中打印中间张量

    我为 Keras 模型编写了一个相当复杂的损失函数 并且它不断返回nan训练时 因此 我需要在训练时打印中间张量 我知道你不能在损失函数中执行 K eval 因为张量未初始化 不过 我都尝试过K print tensor and tf Pr
  • PyPy/RPython 可以用来生成小型独立可执行文件吗?

    或者 可以使用 PyPy RPython 将 Python 编译 翻译为 C C 不需要 Python 运行时 我试图通过它的 RPython 和 Python 它的运行 它的编译和它的翻译来理解 PyPy 但有些失败 I have a h
  • 使用 Python for Linux 模拟按键事件

    我正在编写一个脚本来自动运行特定模型 当模型失败时 它会等待用户输入 Enter 键 我可以检测到模型何时失败 但我无法使用 python 在 Linux 上 来模拟按键事件 Windows 有 SendKeys 库来执行此操作 但我想知道
  • 创建将一把小提琴按色调分割的小提琴图的正确方法是什么?

    创建将一把小提琴分开的小提琴图的正确方法是什么hue 我尝试了不同的方法 似乎唯一的方法是创建一个为数据集中的每个条目共享相同值的功能 并将该功能的名称传递为x fig plt figure figsize 20 8 fig add sub
  • 显示进度的脚本?

    当我的 python 脚本处理大文件时 我想向用户显示进度 我见过脚本印刷 在 shell 中的同一光标位置显示进度 我怎样才能在Python中做到这一点 你应该使用python 进度条 http code google com p pyt
  • Scipy odeint 非负解

    显然 从 ODE 求解器获得非负解并非易事 https stackoverflow com questions 6977107 solving a delay differential equation dde system constra
  • 如何使用 python 绘制具有两个斜率的线

    我使用下面的代码绘制一条具有两个斜率的线 如图所示 斜率应该在一定限制 limit 5 之后下降 我正在使用矢量化方法来设置斜率值 还有其他方法来设置斜率值 有人可以帮助我吗 import matplotlib pyplot as plt
  • Pandas 如何删除包含所需字符串的行

    我想删除包含所需字符串的所有行 假设我有以下数据框 A B C 1 a x w g n 3 l p j p v 我想删除包含字符串的所有行p 我已经搜索过它 但大多数答案都是基于列名称 就我而言 我不会知道它可以出现在任何列中 输出数据帧应

随机推荐

  • 将当前时间添加到日期时间?

    我有一个代表日期的字符串 它从 DropDownList 中返回 该字符串是 2010 年 8 月 27 日 例如 现在我想将当前时间添加到此并将其解析为 Datetime 所以最终它应该是一个 DateTime 类似2010年8月27日
  • 如何使用 ts.transform 将附加语句注入到函数中

    我使用 Typescript 编译器 API ts transform ts updateFunctionDeclaration 在现有源文件中的函数开头注入附加语句 这非常有效 除了当我打印转换后的代码 使用 ts Printer 时 原
  • Dart - 将纪元以来的毫秒数(UNIX 时间戳)转换为人类可读的时间

    有没有一种好方法可以将纪元 例如 1486252500000 13 位 以来的毫秒数格式化为人类可读的格式 DateTime自纪元以来确实有一个毫秒的命名构造函数 https api dartlang org stable 1 24 2 d
  • 命名方法规则简单,兼容ARC命名约定

    我很难理解 ARC 的命名约定 我一直使用 ARC 进行编码 我想这就是原因 1 类方法 我应该为以下方法选择什么名称 这两个名称在内存管理方面有什么区别 这个名字 MyObject newObjectFrom MyObject anObj
  • 将 python 脚本的输出获取到 Jenkinsfile 中的变量中

    我有一个 Python 脚本 它在标准输出上返回一个字符串 python 脚本返回的值可以收集在 bash 脚本中 如下所示 bin bash outputString my python script py some parameter
  • 函数式编程和依赖倒置:如何抽象存储?

    我正在尝试创建一个具有较低级别库的解决方案 该库将知道在调用某些命令时需要保存和加载数据 但保存和加载函数的实现将在特定于平台的项目中提供它引用较低层的库 我有一些模型 例如 type User UserID UserID Situatio
  • 如何使用boost-spirit将结果放入STL图?

    include
  • Eclipse 在 src/main/resources 中添加了 ** 排除模式:如何读取资源文件?

    我使用 Eclipse Oxygen 2 Release 4 7 2 和标准 src main resources 文件夹创建了一个简单的 Maven 项目 并将其添加到类路径中 问题是 Eclipse 添加了一个排除模式 到 src ma
  • 播放 .wav 文件

    我正在使用 Visual Studio 2010 Express 我正在尝试编写一个简单的程序 该程序将重复波形文件 5 次 我正在运行 Windows XP SP3 据我所知 这是 include stdafx h include
  • Meteor:自定义允许和拒绝规则的错误消息

    我正在寻求标准化 Meteor 中允许和拒绝规则的错误消息 我不想在客户端的回调中定义错误 而是希望服务器以正确的错误消息进行响应 这样我只需定义它们一次 来自允许 拒绝的文档 如果函数认为应该允许该操作 则它们应该返回 true 否则它们
  • Solr 搜索字段中的值数组

    我是 Solr 搜索的新手 任何人都可以帮助我解决我的问题 我有值数组 我想将其添加到 solr 查询中 例如 query gt setQuery field 1 2 5 当我执行此操作时 我收到此错误消息 org apache solr
  • 使用文本和值填充 DropDownList

    我在 ASP NET Webforms 中有一个下拉列表 我想计算某一年是多少年前 在第一行中 2002 是当前年份 9 并且必须是值 而 9 是 visibel 文本 显示 2002 年是多少年前 2002 9 2003 8 2004 7
  • 是否可以阻止 PWA 仅在特定路由上使用缓存?

    自从我将 React 应用程序配置为 PWA 以来 我开始遇到谷歌身份验证问题 当用户单击 使用 Google 登录 时 应该会访问此端点 route GET api users auth google desc Authenticate
  • 在颤振中我如何检查位置是否启用?

    当用户输入没有启用位置的谷歌地图页面时 我遇到问题 地图不会更新 所以我想检查用户是否事先启用了位置 所以我需要一个函数 如果启用了位置 则返回 true 如果没有启用 则返回 false use 权限处理插件 https pub dev
  • 如何在 Dart 中查找集合的所有子集?

    我需要获取数组的所有可能的子集 假设我有这个
  • 为什么我在 Google 地图 Android API 上收到签名无效的信息?

    我的应用程序在 5 1 版本的设备上可以正常进行位置更新 从那时起 我做了两件事 生成签名的 apk 尝试将其部署到 6 0 设备 我不知道发生了什么 但现在 google api 即使在我原来的设备上也无法工作 这是错误日志的一部分 我认
  • 自定义 UISlider

    如何自定义UISlider 更改样式 背景 你可以通过this http www raywenderlich com 4344 user interface customization in ios 5自定义控件的教程 要自定义 UISli
  • 触发一次后关闭事件监听器

    我有一个脚本可以触发一个提供免费下载的弹出框 当用户的鼠标离开页面时它会触发 显然不适用于移动设备 我已经有一个可行的解决方案 在我的脚本中 我设置了一个 cookie 来停用脚本 30 分钟 并且该部分有效 如果我刷新页面 弹出窗口不会再
  • GraphQL:成功突变后如何发出警告?

    让我们想象一下我有一个createPost插入新帖子的突变 在典型的应用程序中 该突变可以 成功 返回一个Post 失败 抛出错误 我使用阿波罗错误 https github com thebigredgeek apollo errors来
  • 如何在 AWS Lambda 中缓存多个 AWS Parameter Store 值?

    我想限制在 AWS Lambda 中调用 AWS Parameter Store 的次数 使用全局变量 我在第一次调用 Parameter Store 时缓存 Parameter Store 值 main py import os impo