Create your own EC2 of the same type as the AWS Lambda public images - free tier is just fine. It needs to look like lambda serverless servers https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
Servers (even serverless servers that are servers when they're not) use drivers. Download the oracle instant client libraries for linux x86-64 for basic and ODBC and put them in our home dir
https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.5.tar.gz
You need docker and the docker daemon:
sudo yum install docker.x86_64Start the daemon
sudo usermod -a -G docker ec2-user (you might not be ec2 user)
sudo yum install git
git clone https://github.com/tianon/cgroupfs-mount
sudo mv cgroupfs-mount/cgroupfs-mount /usr/local/bin/
sudo /usr/local/bin/cgroupfs-mount
sudo dockerd &
We now need/want to use Serverless. I guess at this point you might think is Lambda already serverless why do I need serverless? Because it makes the process a bit easier is the short answer as you will see further down.
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bashnvm -ls-remote
. ~/.nvm/nvm.sh
Check out what versions are there, I like to pick the second last LTS to be safe-ish
nvm install v8.12.0
Now we're kindof going to do stuff in here a little bit (https://read.iopipe.com/the-right-way-to-do-serverless-in-python-e99535574454 ) What a great article - Read it or this wont make sense.
npm install -g serverless
mkdir ~/my-serverless-driver-project
cd ~/my-serverless-driver-project
sls create -n my-serverless-driver-project -t aws-python
sls deploy
You'll get the following as it's a new instance
"Serverless Error ---------------------------------------Do an AWS configure to set yourself up https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
ServerlessError: AWS provider credentials not found. Learn how to set up AWS provider credentials in our docs here: <http://bit.ly/aws-creds-setup>.
"
sls invoke -f helloOK Basics are done, good on you. You can also see why serverless is sortof handy for setting some stuff on for you already if you go into the console - you can see it uploads files etc without any hassals.
vim httprequest.py
"
import os
import pyodbc
def handler(event, context):
connection = pyodbc.connect('DRIVER={Oracle12};DBQ=some.server.com.au:1521/mydb;Uid=jared;Pwd=mypass')
st='OK'
#st=os.popen('ldd -v libsqora.so.18.1').read()
#st=os.popen('/var/task/bin/dltest /var/task/libsqora.so.18.1').read()
for root, dirs, files in os.walk("."):
for filename in files:
st = st+ filename + '\n'
return {"content": st}
"
Note above I have left in troubleshooting code if there are library issues. This may be very important.
update the functions section of your serverless.yml
"Install more stuff...!
functions:
hello:
handler: handler.hello
httprequest:
handler: httprequest.handler"
These are required to build python libs
sudo yum install gccLet's get some drivers shall we? This was the hardest part to get right
sudo yum install gcc-c++
tar xvzf unixODBC-2.3.5.tar.gzWe can create pyodbc if we get some odbc dev drivers - these odbc drivers arent required for the lambda
cd unixODBC-2.3.5
./configure --sysconfdir=/var/task --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/home
sudo make install
cp -R /home/bin/ /home/ec2-user/my-serverless-driver-project/
#cp -R /home/include/ /home/ec2-user/my-serverless-driver-project/
cp /home/lib/* /home/ec2-user/my-serverless-driver-project/
cd /home/ec2-user/my-serverless-driver-project/
(yes this is silly but I'm using it just to pip install python)
sudo yum install unixODBC-develLet's get some more drivers... Oracle this time. Dear readers are there smaller drivers I can use???
sudo pip install pyodbc
cp /usr/local/lib64/python2.7/site-packages/pyodbc.so /home/ec2-user/my-serverless-driver-project/
cd ~
unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
unzip instantclient-odbc-linux.x64-18.3.0.0.0dbru.zip
cp instantclient_18_3/* /home/ec2-user/my-serverless-driver-project/
Delete a bunch to keep the lambda under the file limit
rm /home/ec2-user/my-serverless-driver-project/liboramysql18.so
rm /home/ec2-user/my-serverless-driver-project/libclntsh.so
rm /home/ec2-user/my-serverless-driver-project/ucp.jar
rm /home/ec2-user/my-serverless-driver-project/libocci.so
A system driver needs to be copied accross
cp /lib64/libaio.so.1 /home/ec2-user/my-serverless-driver-project/UnixODBC needs to know where your driver is
vim /home/ec2-user/my-serverless-driver-project/odbcinst.ini
[Oracle12]
Description = Oracle ODBC driver for Oracle 12c
Driver = /var/task/libsqora.so.18.1
Setup =
FileUsage =
CPTimeout =
CPReuse =
sls deploy
sls invoke -f httprequest
(Or if you're feeling lazy sls deploy && sls invoke -f httprequest )
As you could imagine I didn't nail this the first time around, so take a look at the hashed out commands to see if the libraries are there inside lambda. I am really shaking my head a bit about the implementation of UnixODBC and the sheer size of the Oracle drivers that make it painful in the lambda world. I also highly recommend using serverless-python-requirements but it won't work for this example due to DB drivers. Perhaps there's a way to get that working with docker.
Apparently the oracle thin client can greatly reduce the number from 70mb to 30mb. I will try this shortly and update the post.
ReplyDeleteNice Blog very use full inormation.AWS-certified experts help you develop a cloud strategy which aligns with your business transformation road map and implement cloud management solutions to harness the AWS Cloud Managed Services
ReplyDeleteGambling & Casinos - Mapyro
ReplyDeleteFind 울산광역 출장마사지 your ideal location in Coos Bay area and 논산 출장샵 you'll enjoy the casino, slots and 동두천 출장마사지 video poker rooms and restaurants near you. Get 김포 출장안마 directions, reviews and information 여수 출장마사지 for