Lambdaの説明とlambdaのlayersの作り方



## lambdaとは

AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。インフラストラクチャのプロビジョニングや管理をすることなくコードを実行コードを書いて、.zip ファイルやコンテナイメージとしてアップロードするだけです。

### サーバーレス

サーバーではなくて、その場でコードを実行する環境です、trigger(s3,SQSなど)で実行しても良い、定期実行もCloudwatchイベントからでも出来ます、サーバーと違って使ってる分だけを支払いします。同時実行も1秒で1000件まで出来ますのでインフラが楽です。

### 使い方

Lambdaを作るには割と簡単です！名前と言語とアーキテクチャを選べたらもうコード修正とテストが出来ます。

名前はエンドポイントになりますので気をつけてお名乗りください。

環境としては色々の言語は出来ます。

![Screen Shot 2022-05-27 at 15.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/7530f7c0-813e-8fb2-a702-20cc2ff14f7a.png)

Python、ruby、java、Goなどなどの言語が出来ます。

![Screen Shot 2022-05-27 at 15.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/2798fd95-a619-30a9-0e0d-2f059df7d1ed.png)

アーキテクチャも選べます。

自分のコードだけではなくて一般的ユースケース用のサンプルコードと設定プリセットから Lambda アプリケーションを構築します。

作成終わったら編集と設定画面が出てきます。

![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2022-05-27-16_06_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/03f29b4e-ea2b-6fd6-5fa3-382699942e6f.png)

そのままでコード書いて、テストが出来ます。

例えば、print('hello world')を入れると：

![Screen Shot 2022-05-27 at 16.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/d8590369-78c1-1bb1-9c3e-02ab88915cc8.png)

lambdaのresponseを見えるし、ログも見えます、さらに実行した時のメモリと実行時間。

```
Duration: 1.84 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 35 MB	Init Duration: 226.67 ms
```

1.84ミリ秒かかったので料金としては2ミリ秒でかかりました。

ライブレリとしてはデフォルトでいくつのライブレリが入ってます、ここにリストがあります（少し古いけど基本が一緒です）：
https://gist.github.com/gene1wood/4a052f39490fae00e0c3

botoがAWSのフォンクションなので全部のAWSのライブレリが入ってます！

ですが、特別のライブレリは自分で入れなきゃ行けないです、それはLayersです！

## layersとは

Lambda レイヤーは、Lambda 関数で使用できるライブラリとその他の依存関係をパッケージ化するための便利な方法を提供します。レイヤーを使用することで、アップロードされたデプロイメントアーカイブのサイズを削減し、コードをデプロイするスピードを速めることができます。

![Architecture2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/abedbf8d-a06d-42d9-31fc-a2037f996a04.gif)


### 作り方

lambdaでpipは実行しませんのでライブレリを入れた場合はlayersを作成するべきです、作り方としては割と簡単です、欲しいのライブレリをロカルでインストールして、zipして、s３にアップロードしてからの登録です。

#### ロカルの作成

例えばredisのライブラリを入れたい：
layersのフォルダを作成する。

layersの中にredisのフォルダを入れてます、その準備終わったらpip3のインストールを行います、pipの -tオプションでパスは重要です！

```console
$ mkdir layers
$ cd layers
$ mkdir redis
$ pip3 install -U redis -t redis/python
```

>layers/
>┣ redis
>　　┣ python
>　　　　┣ packaging
>　　　　┣ pyparsing
>　　　　┣ redis
>　　　　┣ redis-4.3.1.dist-info
>　　　　┣ などなどのpip3からインストールされたファイル
>
それの形じゃないとlambdaから使えないです。

無事にこの形になったら残りはredisフォルダをzipします。

`zip -r redis.zip ./redis/`

それでs3にアップロードします、作成画面はこちら：

![Screen Shot 2022-05-27 at 16.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/35db8acb-3db4-338c-75cd-d6427be6d675.png)

ここで直接にアップ出来ますが10メガまでなのでS3のほうが良いだと思いますのでさっきアップしたzipファイルのオブジェクト URLを入れる。

アーキテクチャとしては使いたいlambdaに合わせます。

ランタイムはいくつあります、使いたいlambdaに合わせます、例えばlambdaはpython 3.9でlayersは3.7と3.8だけなら入られませんので注意してください。

![Screen Shot 2022-05-27 at 16.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/ca2c8a76-a518-b8aa-f499-25f9c1601897.png)


### 使い方

作成した後に次のステップとしてはLambdaに追加する。

![Screen Shot 2022-05-31 at 18.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/4cdff765-e3ce-43db-7fbf-7aa8edd3b0be.png)

### 注意点

そこそこデカいライブラリは入れません、layersは５件まで追加しかできないし、５件で250MBまでです、Mecabなどの優秀なライブラリはできませんのでご注意ください。

AWSのSDKのライブラリはデフォルトで入っていますのでlayersで追加しなくて大丈夫です、Botoのドキュメントへを確認ください。