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

时间:2019-02-20 21:07:48

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

我正在尝试实现自定义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的运行,但是我收到一条错误消息,告诉我在运行时没有声明“ shield”

我想念什么? 除了numpy,scipy,binaries等,我找不到用于层的自定义代码示例。

对不起我的愚蠢...
感谢您的好意!

2 个答案:

答案 0 :(得分:1)

您还需要在图层shield.py中命名文件,以便import在Python中可用。请注意,图层本身的命名方式无关紧要。这是AWS世界中的配置,对Python世界没有影响。

起作用的是图层档案的结构。您需要将想要import的文件放置到python目录中,将其压缩并使用该归档文件作为一个层(我正在为无服务器框架提供压力)。

在Lambda执行环境中,图层存档被提取到/opt中,但是/opt/python中仅声明了PYTHONPATH。因此,需要“包装” python目录。

答案 1 :(得分:0)

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

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