在Lambd上调用自定义Lambda层函数

2024-04-25 14:16:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个自定义的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)

我希望能够将此层链接到我的函数,以便在运行时保护它。
我使用的是serverless框架,看起来我的层部署得很好,就像我的示例函数一样。此外,AWS控制台还向我显示,该层在我的函数中是链接的。在

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

^{pr2}$

理想情况下,我应该在CloudWatch上得到并出错,告诉我function_shield阻止了{}的运行,但是我收到一个错误,告诉我在我的运行时没有声明“shield”。在

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

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


Tags: path函数importtokenawsparameterossession
2条回答

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

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

您还需要将层中的文件命名为shield.py,这样它就可以在Python中import。请注意,图层本身的命名方式并不重要。这是AWS世界中的一种配置,对Python世界没有任何影响。在

真正有效果的是层归档的结构。您需要将要import的文件放入python目录中,对其进行压缩并将其作为一个层使用(我正在按serverless framework为您做这件事)。在

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

相关问题 更多 >