【问题标题】:Test Lambda function with secrets locally without AWS secrets manager在没有 AWS 密钥管理器的情况下在本地使用密钥测试 Lambda 函数
【发布时间】:2021-01-28 19:38:50
【问题描述】:

我有这样的代码

Unix = 'linux'
Mac = 'darwin'
if sys.platform == Unix
   do this
elif sys.platform == Mac
   do this

我对 sys 平台进行了此检查,因为 aws 是基于 unix 的,因此如果 sys.platform = 'Mac' 然后我在本地运行。

当我尝试 dockerize 这个应用程序时遇到了麻烦,因为 dockerized 构建是基于 linux 的, 所以在这个 if-else 语句中,构建将运行第一个 即使我正在构建 docker 也是 if-else 的一部分 本地容器。

是否可以在 dockerfile 中设置 sys.platform?

编辑:

问题陈述:

尝试对 aws lambda 函数进行 docker 化。为此,我需要 在本地测试 lambda 函数。

我的 Lamba 函数组合如下所示:

app
    lambda_function1
        database.py
        helper.py
functions
    lambda_function1.py

这个 lambda 函数的主要目的是读取数据 从生产数据库中,然后预测一些值 根据数据。

database.py
    import helper
    ...
    class DB:
        def __init__(self):
            self.secrets = helper.get_secrets()
            self.db_name = self.secrets.get('DB', '')
            self.db_host = self.secrets.get('Host', '')
            self.db_password = self.secrets.get('Password', '')
        ...
helper.py
    import sys
    import boto3
    ....
    def get_secrets():
        secrets = {}
        if sys.platform == constants.MAC_PLATFORM:
            secrets = local_secrets()
            return secrets
        session = boto3.session.Session()
        client = session.client(service_name='secretsmanager',
                                region_name='us-west-2')
        secrets = get_aws_secrets()

如您所见,如果 sys 平台是 'darwin', 那么秘密将是本地秘密。 如果 sys 平台是 'linux',那么秘密将被秘密拉取 来自aws。

由于某种原因,我无法使用 aws 连接到数据库 由于 tcp/ip 错误,我的本地 docker build 中的秘密。 我认为这是由于我在本地没有 aws 可能存在的一些奇怪的配置问题,因此我想从使用 docker 中的本地数据库开始,并使用 get_local_secrets 方法 获取秘密。

有什么想法吗?

【问题讨论】:

  • AWS 也有 windows 机器......但也许你应该展示一下 Mac 或 Unix 之间具体需要做什么不同的事情?或者为什么你需要 Docker 在 AWS 中运行时将其视为 Mac?
  • 如上所述,容器内的平台始终是 Linux。如果您希望能够在本地运行该容器并知道它正在本地运行,为什么不使用命令行参数或环境变量,您可以签入您的代码?所以你会运行 docker run my_container --local_test 之类的东西。
  • 你能确切地展示你想要做什么吗?这听起来像XY Problem
  • 更新了您实际要求的标题,但如果您需要模拟 AWS secretsmanager,这可能会有所帮助github.com/localstack/localstack
  • 另一种解决方案可能是围绕 boto-client 进行 try-except,然后回退到一些环境变量

标签: python docker lambda


【解决方案1】:

我会使用环境变量建议并通过在运行时设置一些值在本地运行:

import os

if os.environ.get('LOCAL_TEST', 'false').lower().strip() == 'true':
    secrets = local_secrets()
else:
    # use aws secrets

然后像这样运行你的容器:

docker run -e LOCAL_TEST=true your_image

【讨论】:

  • 我会做if bool(os.environ.get('LOCAL_TEST'))
  • @OneCricketeer 当然可以。我认为将其设置为配置中的一些布尔变量可能更具可读性,但这是主观的
  • 你为什么要降低和剥离?
  • @coderboi 以防它读入换行符或有人意外输入True
猜你喜欢
  • 2022-08-19
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2017-05-05
  • 2015-02-18
  • 2014-02-20
相关资源
最近更新 更多