Вызов пользовательских функций Lambda Layers на Lambda - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реализовать собственный лямбда-слой AWS, чтобы использовать его с моими функциями.
Это должен быть простой слой, который получает какой-то параметр из 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 показывает мне, что слой был связан в моей функции.

Я назвал свой слой «щит» и попытался импортировать его по его имени в моей тестовой функции:

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, binaries и т. Д.

Извините за мою глупость ...
Спасибо за вашу доброту!

Ответы [ 2 ]

0 голосов
/ 03 августа 2019

Посмотрите здесь.Я описал все необходимые шаги для настройки или вызова пользовательских функций лямбда-слоев на лямбде.

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

0 голосов
/ 21 февраля 2019

Вам также нужно назвать файл в вашем слое shield.py, чтобы он мог import в Python.Обратите внимание, что не имеет значения, как называется сам слой.Это конфигурация в мире AWS, и она не влияет на мир Python.

Что влияет, так это структура архива слоев.Вам нужно поместить файлы, которые вы хотите import, в каталог python, сжать его и использовать полученный архив в качестве слоя (я полагаю, что серверная среда делает это за вас).

ВВ среде выполнения Lambda архив слоев извлекается в /opt, но в PYTHONPATH объявлено только /opt/python.Отсюда необходимость в директории python "wrapper".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...