长虹佳华欢迎您 这里您可以了解长虹佳华,解读我们的企业文化,感受我们的团队气氛。 这里您可以了解到长虹佳华代理的所有产品,同时我们还为您提供丰富的行业解决方案。 这里您可以了解到长虹佳华的业务发展、企业荣誉、签约品牌等最新最全的企业动态。 投资者关系 欢迎您加入长虹佳华,长虹佳华为您提供广阔的发展空间,这里是职业经理人事业发展的乐园。

使用AWS EFS文件系统加载lambda python函数依赖

使用AWS EFS文件系统加载lambda python函数依赖

1.    文档目的

通常在部署AWS lambda python函数时,函数的依赖包通常会通过加载层来挂载,但是lambda 函数层的大小是有限制的,其限制如下:

函数层:最大五层

部署程序包(.zip 文件存档)大小:

50 MB(已压缩,可直接上载)

250 MB(已解压缩)此配额适用于您上载的所有文件,包括层和自定义运行时。

3 MB(控制台编辑器)

    更多的限制,可查阅AWS 官方文档:Lambda 配额 - Amazon Lambda (amazonaws.cn)

如果函数依赖包解压后大于250MB, 那么可以使用以下方法突破限制:

  1. 使用EFS文件系统挂载依赖包;
  2. 使用container方式部署lambda函数;

    本文讨论使用EFS文件系统加载python依赖包。以下是具体的创建步骤:

2.    创建过程

2.1.创建EFS文件系统

2.2.实例上挂载EFS,安装依赖包

选择Amazon Linux 2 AMI 镜像,然后选择Select.

(如果实例和FES在相同的子网,可选择通过DNS挂载,如果不在相同的子网,则要通过ip挂载)

# yum install -y amazon-efs-utils

# mount -t nfs4 \

-o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 10.100.15.94:/ /mnt

# mkdir -p /mnt/oracle/{python,lib}

# cd /mnt/oracle

# wget \

https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip

# unzip -j instantclient-basic-linux.x64-19.3.0.0.0dbru.zip -d lib

# yum  -y install libaio

# cp /lib64/libaio.so.1 lib/

# pip3 install cx_Oracle -t python/

2.3.创建lambda函数

输入Name: python_oracle

对于运行时,选择: python 3.7

对于更改默认执行角色,选择创建具有基本 Lambda 权限的新角色。

对于 VPC选择EFS文件系统所在的VPC

对于子网:选择EFS文件系统关联的子网。

对于安全组:选择已经存在的安全组或在VCP下新建一个安全组,VPC内放行所有流量,然后刷新选择安全组。

常规配置:修改超时时间为适当的值,如1分钟,最大不超过15分钟。否则默认的3秒可能会在运行函数时报超时的错误。

文件系统:选择添加文件系统:

          下拉选择EFS文件系统;     

          下拉选择接入点;

          输入本地挂载路径:以/mnt开头,如: /mnt/efs

权限:点击角色名称,进入角色详细界面,添加权限,添加对EC2的操作策略:AmazonEC2FullAccess(也可按最小访问原则创建策略然后添加到角色权限中)

环境变量:(因为cx_Oracle要用到自己的lib库,所以至少要添加一个环境变量,指定lib库的路径) 添加环境变:LD_LIBRARY_PATH (系统库路径)在路径值的末尾加上库依赖库的路径,本例为:/mnt/efs/lib

Key: LD_LIBRARY_PATH

Value:/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib: /mnt/efs/lib

在代码定义部分加入依赖包和路径:

import sys

sys.path.append('/mnt/efs/python')

sys.path.append('/mnt/efs/lib')

import cx_Oracle

测试代码如下:

import json

import os

import sys

sys.path.append('/mnt/efs/python')

sys.path.append('/mnt/efs/lib')

import cx_Oracle

 

def lambda_handler(event, context):

    #print(sys.path)

    #print('Before: ',os.listdir('/mnt/efs/lib'))

    host1 = os.getenv('host1')

    port = os.getenv('port')

    sid = os.getenv('sid')

    db_user = os.getenv('db_user')

    db_password = os.getenv('db_password')

   

    dsn_tns = cx_Oracle.makedsn(host1, port, service_name = sid)

    conn = cx_Oracle.connect(user = db_user, password = db_password, dsn = dsn_tns, encoding = 'UTF-8')

   

    return "successfully connected to oracle server"

2.4.调用 Lambda 函数

3.     结论

:添加lambda

如果python依赖包不超过250M,可使用添加层的式加载python依赖。步骤如下:

# mkdir boto3

# pip install boto3 –target boto3

# zip -y -r boto3.zip boto3

# aws s3 cp boto3.zip s3://qdoraclelayer/oraclelayer/

友情链接SEARCH

联系我们 | 法律公告

版权所有:2002-2020© 四川长虹佳华信息产品有限责任公司

京公网安备11010602005977号 | 蜀ICP备11019833号