【问题标题】:Calling Custom Lambda Layers Functions on Lambda在 Lambda 上调用自定义 Lambda 层函数
【发布时间】:2019-08-04 03:51:18
【问题描述】:

我正在尝试实现一个自定义 AWS Lambda 层,以便将其与我的函数一起使用。
它应该是一个简单的层,从 ssm 获取一些参数并初始化 puresec 的 function_shield 以保护我的服务。
代码看起来更像这样:

import os
import boto3
import function_shield as shield


STAGE = os.environ['stage']
REGION = os.environ['region']
PARAMETERS_PREFIX = os.environ['parametersPrefix']


class ParameterNotFoundException(Exception):
    pass


session = boto3.session.Session(region_name=REGION)
ssm = session.client('ssm')

# function_shield config
parameter_path = f"/{PARAMETERS_PREFIX}/{STAGE}/functionShieldToken"

try:
    shield_token = ssm.get_parameter(
        Name=parameter_path,
        WithDecryption=True,
    )['Parameter']['Value']

except Exception:
    raise ParameterNotFoundException(f'Parameter {parameter_path} not found.')


policy = {
    "outbound_connectivity": "block",
    "read_write_tmp": "block",
    "create_child_process": "block",
    "read_handler": "block"
}


def configure(p):
    """
    update function_shield policy
    :param p: policy dict
    :return: null
    """
    policy.update(p)
    shield.configure({"policy": policy, "disable_analytics": True, "token": shield_token})


configure(policy)

我希望能够将此层链接到我的函数,以便在运行时对其进行保护。
我正在使用无服务器框架,看起来我的层部署得很好,就像我的示例函数一样。此外,AWS 控制台向我显示该层已链接到我的函数中。

我将图层命名为“shield”并尝试在我的测试函数中按其名称导入它:

import os
import shield


def test(event, context):
    shield.configure(policy)  # this should be reusable for easy tweaking whenever I need to give more or less permissions to my lambda code.
    os.system('ls')

    return {
        'rep': 'ok'
    }

理想情况下,我应该在 CloudWatch 上收到错误消息,告诉我 function_shield 阻止了 child_process 运行,但是我收到一个错误消息,告诉我在运行时没有声明“屏蔽”。

我错过了什么? 除了 numpy、scipy、二进制文件等之外,我找不到任何用于层的自定义代码示例。

我很抱歉我的愚蠢...
谢谢你的好意!

【问题讨论】:

    标签: python amazon-web-services aws-lambda


    【解决方案1】:

    您还需要将层中的文件命名为shield.py,使其在Python 中为importable。请注意,图层本身的命名方式并不重要。这是 AWS 世界中的配置,对 Python 世界没有影响。

    真正起作用的是图层存档的结构。您需要将您想要 import 的文件放入 python 目录中,将其压缩并使用生成的存档作为一个层(我认为无服务器框架正在为您执行此操作)。

    在 Lambda 执行环境中,层存档被提取到 /opt,但只有 /opt/pythonPYTHONPATH 中声明。因此需要“包装器”python 目录。

    【讨论】:

      【解决方案2】:

      看看这里。我已经描述了在 lambda 上设置或调用自定义 lambda 层函数的所有必要步骤。

      https://medium.com/@nimesh.kumar031/how-to-set-up-layers-python-in-aws-lambda-functions-1355519c11ed?source=friends_link&sk=af4994c28b33fb5ba7a27a83c35702e3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多