AWSのLambdaの動作をHelloWorldで理解する


LambdaでHelloWorldするメモ。
画像ばっかりで中身薄いです。

## 使う前の疑問

* LambdaのトップページにHelloWorldのサンプルあるけど、だから何？
* node.jsとかで動くのは知ってたけど、モジュールとかどうやって追加するのだろう？
* CloudWatchとどうやって連動させるのだろう。
* console.log()とか使ってるコードを見かけるけどどこに出力されるのだろう。
* ローカルでどうやって開発・テストするんだろう（掘り下げるのは後日）。

など。分かってる人からすれば「え？」という感じでしょう。

## だから何？

LambdaのトップページにはHelloWorldのでもあるけど、だから何？って感じ。

<img width="1071" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/70fd1aa0-db96-9223-66a8-793759289c6a.png">


## 関数の（土台）作成

何は無くてもまずは関数を作成。

1から開発する方法と、設計図(Blueprint）を元にする方法がりますが、まあ、HelloWorldなので1から書きます。

* 名前はhelloWorld。
* ランタイムはとりあえず6.xでいいかなと。
* 最初はロールが無いので[カスタムロールの作成]を選択。

<img width="1083" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/fae45971-158f-b181-35a4-386068db18ae.png">

ロールの作成を選ぶとIAMのページに移動するので、そのまま[許可]ボタンをクリック。

<img width="780" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/5a05b1b9-ae3b-1ab6-bdcc-d9941fed0e87.png">

関数作成ページに戻るのでそのまま[関数の作成]ボタンをクリック。

<img width="995" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/5394e0b4-3560-603d-4c78-7af38764fd79.png">

>ロールは空欄になっていてもOK。

## 関数の実装

関数コードとして表示されるコードを下記のように少し変更、保存し、[テスト]をクリックし実行します。

>とりあえず、console.log()とcallback()がどのように出力されるかが知りたい。

```js:index.js
exports.handler = (event, context, callback) => {
    
    //log
    console.log("Hello from console.log");
    
    //callback
    //callback関数はcallback(エラー時戻り値,正常時戻り値)という形式
    callback(null, 'Hello from callback');
    
};
```

<img width="1053" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/45bc4c5b-0bf9-4282-5bad-0a467e07c65e.png">

## 実行結果

詳細をクリックすると、戻り値として、"Hello from callback"が、ログ出力に"Hello from console.log"があるのがわかります。そして[ここをクリックし]をクリックしてみます。

<img width="1054" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/6d96de47-5779-1b0c-2235-2adf0a5c09b2.png">

>ま、だから何？はまだ払拭されたわけではないですが。

## 動作ログの確認

クリックすると、CloudWatchのコンソールに移動し、ログが確認できます。

<img width="1114" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/00604c90-b609-c5f0-2d7e-a95030db491a.png">

実際はここにリダイレクトされます（ロググループの１階層下）。

<img width="1115" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/78bbfe2a-276a-0586-03db-041d3d50cf4a.png">

関数の実行ログの中にログ出力が確認できます。

<img width="1141" alt="009.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/3e6cc073-d991-6f69-fff4-8aec87fc9aad.png">

## CloudWatchで定期実行してみる

LamddaはS3や、その他AWSの各リソースの様々なEventをトリガーとして動作させることもできますが、折角CloudWatchに移動してきたので、まずはCloudWatchによる定期実行を試してみます。

イベント->ルールメニューを選択し[ルールの作成]をクリック。

<img width="1136" alt="010.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/5f61c616-11d5-4355-9120-30b4410687dc.png">

イベントソースとしてスケジュールを選択し、速度を1分に設定。続いて、ターゲットの追加を行い、Lambda関数よりhellWorldを選択。[設定の詳細]をクリック。

<img width="1134" alt="011.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/18c4de58-19cd-090e-1ee1-47cf902473ba.png">

名前を設定して[ルールの作成」をクリックします。

<img width="1126" alt="013.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/981e0ebf-0269-8259-fa99-99821e885700.png">

ルールの作成が成功し、1分毎の実行が開始されます。

<img width="1130" alt="012.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/7bd07889-76d8-72f8-75ec-08bc36c23e61.png">

1分毎の実行が、先程のログで確認できます。

<img width="1135" alt="014.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/8c348826-6e77-d28d-9fdd-f868561889a0.png">


## Zipによるコードのアップロード

上記例ではインラインで記述しましたが、実開発においてインラインで完結することは稀です。特に、npm install で追加モジュールを要する場合は、事実上Zipによるアップロード一択です（他のツールを使う方法もありますが）。

### ローカルでの作業

#### 作業場所の準備

まあ、普通にnode.jsの開発をする時と同じ。

```bash
cd
mkdir helloWorld
cd helloWorld

vi index.js
```

#### 実装

先述のコードそのまま。

```js:index.js
exports.handler = (event, context, callback) => {
    
    //log
    console.log("Hello from console.log");
    
    //callback
    //callback関数はcallback(エラー時戻り値,正常時戻り値)という形式
    callback(null, 'Hello from callback');
    
};
```

### zip

zipで固めます。

```bash
zip -r helloWorld.zip *
```

>ディレクトリではなく、ファイルの階層で実行しないとエラーになります。zipの名前はたぶんなんでも良い。

### アップロード

<img width="1044" alt="015.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/7cd0e4ed-c952-d2a8-3904-0f2d354c02e3.png">

アップロードが展開され、テストが可能になります。

>ファイルサイズによってはコードは展開できないことがあるようです。

<img width="1040" alt="016.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/91b75d2c-13c8-121b-f2ef-f00d923421e0.png">

## ハンドラとファイル名（変数名）の関係

しれっとやり過ごしていましたが、関数コードのところに表樹されているハンドラ。標準ではindex.handlerとなっているのですが、これは、[ファイル名].[関数名]となっていて、これがミスマッチだと動きません。

>まあ、特に理由がない限りindex.jsでexports.handlerとするのが無難です。

<img width="1190" alt="017.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/3567e1a4-b484-c484-0322-d1a19e7387a7.png">

だいたいの雰囲気はわかりました。後は開発するだけ。