Lambda, Python, and Oracle Raw

This document describes the bare minimum you'll need to use `cx_oracle` on a Lambda. Works for both Pythons 2 and 3. This is a bare Lambda and has nothing to do with Zappa or Chalice or Serverless or anything else all the cool kids seem to be using these days.

### Shared Objects

Go [here](http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html) and download `instantclient-basic-linux.x64-12.2.0.1.0.zip`. That's all you'll need. Extract it. Then copy these files to a separate folder called "lib".

* `libclntshcore.so.12.1`
* `libclntsh.so.12.1`
* `libipc1.so`
* `libmql1.so`
* `libnnz12.so`
* `libociei.so`
* `libons.so`

Then, you'll have to install `libaio` on your system and copy `libaio.so.1` into "lib". 

### But I'm Lazy

OK. I've [cached all that here](http://public.nikhil.io/oracle_client_minimum.tgz).
 
### App Structure

```
/my_lambda
├── test.py
└── lib
    ├── libaio.so.1
    ├── libclntshcore.so.12.1
    ├── libclntsh.so.12.1
    ├── libipc1.so
    ├── libmql1.so
    ├── libnnz12.so
    ├── libociei.so
    └── libons.so
```

Here's `test.py`

```python
from __future__ import print_function
import cx_Oracle

# Yeah, you need this. 
with open('/tmp/HOSTALIASES', 'w') as f: f.write(f'{os.uname()[1]} localhost\n')

# Oracle away!
def handler(event, context):
    return str(
        cx_Oracle.connect(
            'username',
            'password',
            cx_Oracle.makedsn(
                'rds.amazonaws.com', 1521, 'SOME_SID',
            )
        ).cursor().execute('SELECT 42 FROM DUAL').fetchone()
    )
```

Now `pip install cx_oracle -t my_lambda/` to install `cx_oracle` into that folder. Zip it up and make a Lambda with `test.handler` as the... handler.

### Environment Variables

You'll need to set these before you execute your Lambda

* `ORACLE_HOME` to `/var/task`
* `HOSTALIASES` to `/tmp/HOSTALIASES`

You're all set!

### Notes

* Lambdas are not allowed to modify `/etc/hosts`
* I used [this AMI](https://console.aws.amazon.com/ec2/v2/home#Images:visibility=public-images;search=amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2) to do all testing. See [this page](https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html) for more information.
* You don't need to set `LD_LIBRARY_PATH` since it already includes `/var/task/lib` (and your Lambda is executed from `/var/task`)
* Uncompressed, you're looking at ~200MB for all those files (~65MB compressed).