Lambdaでお手軽サーバーレス入門（とりあえず作ってみる編）

初Qiitaです。
いろいろ不慣れな点はありますが、お手柔らかにお願いします。

# 前提

めっちゃ深く掘り下げるものではないです。
「Lambdaってこんなものなんやなー」っていうのが理解できるレベルを目指します。

私、社会人7年目ですが、AWSも2012年から使ってきたものの、実はこれまでEC2メインで使ってきました。
（C#/ASP.NETのWebアプリ開発）

ところがベトナムに海外転職して、ちょうど新規プロダクトの開発を始めることになったので、AWSラブな私としてはLambdaを使おう、となりました。

# AWS Lambdaって？

いろいろ詳しいことは他記事に譲りますが、一言で言うと（言えるかな？）

**難しいサーバー構築などなしに簡単にアプリのコードが動く！**

といったところでしょうか。
たとえコードを書いても、何かしらそれを実行するための環境も必要です。
Webアプリの例だと、（物理的な、もしくはクラウドの）サーバーマシン、OS、Webサーバー（NginxやApache）、ランタイム（PythonやNode）…

そして、OSを用意するということは、自分でメンテナンスをする必要性もあります。
これがまた面倒…

なので、コードを動かすだけのプラットフォームがあれば…あっ、Lambdaがある！

# 簡単に作ってみる

実際に書いてみましょう。

## AWSコンソールにログイン

AWSアカウントはご用意ください。
無料で作れます。
また画面はEnglishになっていますが、お好みで。

リージョンは東京を選んでみました。
（会社では本番にSingapore、ステージングにSydneyを使っているので、誰も使っていないという理由だけです。）
![lambda01.png](https://qiita-image-store.s3.amazonaws.com/0/143240/e719a079-694e-222e-88e3-443a169271a7.png)

## Lambda management console

All servicesの下のComputeの下に、Lambdaがあるので、クリックします。
![lambda02.png](https://qiita-image-store.s3.amazonaws.com/0/143240/701fe462-4522-ed6a-f790-f6f1ca963ccf.png)

Create functionをクリックすると、どのように作るかが表示されますが、最初から書いてみようと思うので、Author from scratchを選び、画面の項目を埋めていきます。



* Runtime  
お好きな言語で。今回は私が慣れてきたPython3で書いてみます。

* Role  
いろいろ選択肢があります。
  * Choose an existing role  
    既にあるRoleを使いたい場合は、これを選択して、下のExisting roleで選びます。
  * Create a new role from one or more templates  
    新しいロールを、テンプレートから選べます。今回はこれを使ってみます。
  * Create a custom role  
    AWSのロールを自分で作れます。詳しい方はこちらを使ったほうが早そうですね。

2つめのオプションを選ぶと、ロール名と、テンプレートを選べます。

* Policy templates  
選択肢がかなりありますが、今回は「Simple microservice permissions」にしてみます。
足りなくなったらあとでRoleを編集しちゃおう。

![lambda03.png](https://qiita-image-store.s3.amazonaws.com/0/143240/f8a85d00-59ff-54cc-195a-ba201b3cb8f8.png)

すべての項目が埋まったので、右下の「Create function」をクリック。

# ファンクション画面

関数ができました。
Scratchといいつつ、少しだけコードを書いてくれています。
![lambda04.png](https://qiita-image-store.s3.amazonaws.com/0/143240/d1f7412c-eb6e-2034-4d3b-f477c62b55c2.png)

## ちょっとだけ解説

エディタの上の方に、3つほど設定するところがあります。

* Code entry type  
Lambdaのコードをどのように格納するかを選べます。  
  * Edit code inline  
    エディタでコードを編集できます。  
    インラインエディタでは、3MBまでの関数しか扱えません。これ以上の場合は、下2つのオプションしか使えません。
  * Upload a .zip file  
    Zipファイルをアップロードして、Lambdaに格納できます。
  * Upload a file from Amazon S3  
    ストレージサービスS3に保存したZipファイルをLambda関数として格納できます。
* Runtime  
  この関数を動かすランタイムを選べます。  
  昔はNode, Pythonしかなかった記憶がありますが、いつのまにかどんどん増えてます。
* Handler  
  Lambda関数が動くときに、どのファイルのどの関数を実行するか、を指定します。  
  初期値では `lambda_function.lambda_handler` となっていますが、これは「lambda_function.py」というファイルの「lambda_handler」という関数を指定していることになります。

### Handlerとソースコードの関係についてちょっとだけ

Handlerで指定する関数には、必ず以下の2つの引数を設定しなければなりません。
足りなければエラーになります。

* 1つ目（慣例的に`event`）
  実行時に渡すイベントが入ってます。  
  Nodeであれば`{}`（ディクショナリ）、Pythonであれば`dict`の形で入ります。
* 2つ目（慣例的に`context`）
  ランタイム情報が入っています。  
  [Pythonでの例](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context-object.html)  
  申し訳ないんですが、私は使ったことがないです。

では、ひとまず動かしてみましょう。

## Test

右上のTestをクリックすると、イベントの設定画面になります。
ここで指定した`dict`型のオブジェクトが、Handlerで指定した関数の1つ目の引数にそのまま入ります。
ここでは初期値のままにしてみます。
Event nameに好きな名前を指定して、Createをクリック。
![lambda05.png](https://qiita-image-store.s3.amazonaws.com/0/143240/efb241e6-572d-199a-5f41-0049269dc179.png)

すると元の画面に戻りますが、右上のTestボタンの左には、先程作ったテストのイベント名が表示されます。

このまま、Testをもう一度クリックします。

![lambda06.png](https://qiita-image-store.s3.amazonaws.com/0/143240/a0414977-8038-2293-6565-c736c3785a7e.png)

成功しました。
赤枠の部分に、出力が表示されます。
今回、関数の戻り値は次のような内容だったため、そのまま表示されました。

```python
    return {
        "statusCode": 200,
        "body": json.dumps('Hello from Lambda!')
    }
```

では、`event`を表示してみましょう。

```python
    return {
        "statusCode": 200,
        "body": json.dumps(event)
    }
```

インラインエディタでも、多少はコード補完をしてくれます。
これを右上のSaveで保存してから、Testをクリックして実行すると…
![lambda07.png](https://qiita-image-store.s3.amazonaws.com/0/143240/7b96cbee-5fb0-a3cc-3634-12891cbf2867.png)
戻り値の内容が変わりました！

テストイベントを以下のように変えてみます。

```json
{
  "name": "Ken'ichi Ogawa",
  "age": 29,
  "company": "AnyMind Group"
}
```

すると実行結果も…

![lambda08.png](https://qiita-image-store.s3.amazonaws.com/0/143240/30fba4dc-c806-de2d-6220-c2dbc051421b.png)

ちゃんと変わりました。

# 次回予告

せっかく書いたファンクションも、毎回Consoleから呼び出しているだけでは活用しきれていません。
いろんな呼び出し方について、記事を書いていきます！
次回：[Lambdaでお手軽サーバーレス入門（呼び出し元のまとめ編）](https://qiita.com/kakken1988/items/bc786d08ca95bed53e16)