Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Lambda上调用自定义Lambda层函数_Python_Amazon Web Services_Aws Lambda - Fatal编程技术网

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

Python 在Lambda上调用自定义Lambda层函数,python,amazon-web-services,aws-lambda,Python,Amazon Web Services,Aws Lambda,我正在尝试实现一个自定义AWS Lambda层,以便将其与我的函数一起使用。 它应该是一个简单的层,从ssm获取一些参数并初始化puresec的功能\u屏蔽,以保护我的服务。 代码看起来不像这样: import os import boto3 import function_shield as shield STAGE = os.environ['stage'] REGION = os.environ['region'] PARAMETERS_PREFIX = os.environ['par

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

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上获得一个错误,告诉我
函数屏蔽
阻止了
子进程
运行,但是我收到一个错误,告诉我在运行时没有声明“屏蔽”

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

我为我的愚蠢感到抱歉…

谢谢你的好意

您还需要在层中命名文件
shield.py
,以便在Python中导入该文件。请注意,层本身的命名方式并不重要。这是AWS世界中的一种配置,对Python世界没有影响

产生影响的是图层存档的结构。您需要将要导入的文件放入
python
目录中,将其压缩并将生成的归档文件用作一个层(我正在按serverless framework为您执行此操作)


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

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