Lambdaの運用・保守に使えるかもしれないIOpipe入門

# IOpipeとは
IOpipeは、AWSのLambdaのinvocationのカウントだったり、エラーだったりをモニタリングしたり、アラートをあげて通知したりできるサーバーレスアーキテクチャ用のDevOpsプラットフォームです。
これまでは、cloudwatchlogsのtriggerなどを駆使してslackに通知したり、タスク管理ツールに起票したり、メールで通知したりしてきたと思いますが、IOpipeを導入することで、いい感じにやれます。
詳細は[こちら](https://www.iopipe.com/)



## 機能について
サインアップ後、下記の手順でチュートリアルを行っていきます。

```
- チームの作成
- プロジェクトの作成
- Lambdaのモニタリング画面の確認
- アラートの設定
```

### チームの作成
自分でチームを作成したり、招待をもらうことで他のチームにjoinすることができます。
チームに対してプロジェクトが紐づいているようです。

### プロジェクトの作成
実際にアプリケーションのモニタリング用にプロジェクトを作成します。
プロジェクトを作成するとトークンが生成されます。
トークンを従来のLambdaにSDKと一緒に噛ませることでIOpipeにデータを送信するといった仕組みです。
自分で用意したLmabda関数にSDKをインストールします。

現在は、 `Node.js`, `Python`, `Java` に対応。

①まずはサーバーレスの環境用意

```sh
yarn add serverless
yarn add @iopipe/iopipe
```

②任意のserverless.ymlを準備

```sh
service: testiopipe
provider:
  name: aws
  runtime: nodejs8.10
  profile: <profile>
  stage: <stage>
  region: <region>

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: /
          method: get
          cors: true
```

③コードの準備

```javascript
var iopipe = require("@iopipe/iopipe")({
  token: "<プロジェクト識別トークン>"
});
module.exports.hello = iopipe(async (event, context) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: event
    })
  };
});
```

以上！

### Invocationのモニタリング

下記のような画面でモニタリングできます。
![スクリーンショット 2018-09-06 12.15.00.png](https://qiita-image-store.s3.amazonaws.com/0/74698/77699d86-f49b-cd27-8b11-a9e11bc78d4c.png)

上記のモニタリング画面では、指定した時間帯、または直近`15m`,`1h`,`4h`, `24h`でのinvocation数、success数、error数が確認できます。


### アラート機能
アラート機能では、各ファンクションに対してルールを割り当て、それに対してアラートを検知し通知することができます。

ルールを作成します。
選べるメトリックの種類は、
`Invocation Duration`, `Errors`, `Invocation Count`, `Custom Metric`, `Custom Number Metric`, `Trace Measure`, `Process ID` の中から選択が可能です。
選択後は、`Equal To`, `Grater Than`等でしきい値を設定できます。
こういったルールを複数組み合わせることも可能です。
![スクリーンショット 2018-09-06 13.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/74698/7905cbcf-9e25-e339-7fc5-63b328b25918.png)

####　hook機能
アラート発生時にhook先にeventを送信することができます。
現在は、`Email`, `Slack`, `Webhook`, `Lambda Function` の4つが対応しているので、割と何でもできます。

送信されるイベントデータには下記のようなデータが含まれています。

```json
{
    "created": 1536055382323,
    "event": {
        "id": "<uuidv4っぽいやつ>",
        "url": "<endpoint>"
    },
    "func": {
        "name": "Alert matching function iopipetest-test-fatality"
    },
    "functionIds": ["<arn>"],
    "global": false,
    "hook": {
        "id": "<uuidv4っぽいやつ>",
        "value": "<endpoint>",
        "created": ,
        "type": "webhook"
    },
    "hooks": [{
        "id": "<uuidv4っぽいやつ>",
        "value": "",
        "created": ,
        "type": "slack_channel"
    }, {
        "id": "<uuidv4っぽいやつ>",
        "value": "<endpoint>",
        "created": ,
        "type": "webhook"
    }],
    "id": "<uuidv4っぽいやつ>",
    "latestEventFunctions": [],
    "latestEventId": "<uuidv4っぽいやつ>",
    "muteUntil": ,
    "name": "TEST IOpipe Alert",
    "project": {
        "teamName": "MyTeam",
        "teamId": "<uuidv4っぽいやつ>",
        "id": "<uuidv4っぽいやつ>",
        "name": "MyProject",
        "token": "<token>",
        "active": true,
        "created": 
    },
    "ruleConjunction": "or",
    "rules": [{
        "id": "<uuidv4っぽいやつ>",
        "metric": "count",
        "operand": "10",
        "operator": "gt",
        "result": false,
        "range": 300000,
        "total": 0,
        "name": null,
        "funcs": []
    }, {
        "id": "<uuidv4っぽいやつ>",
        "metric": "errors",
        "operand": "1",
        "operator": "gte",
        "result": true,
        "range": 300000,
        "total": 1,
        "name": null,
        "funcs": [{
            "id": "<lambda arn>",
            "total": 1,
            "result": null
        }]
    }],
    "status": "alarm",
    "statusTimestamp": 1536137758986,
    "timestamp": 1536138774900,
    "transition": true,
    "transitionFromNow": "a few seconds ago"
}
```


## 料金について
現在は、Startupプラン(無料)、Teamプラン(有料)、 Enterpriseプラン(有料)と3パターンあります。

|          |*Startup*                 |*Team*|*Enterprise*|
|---------------|--------------------------|------|------------|
|メンバー数    |1チームにつき1人まで         |無制限 | 無制限      |
|プロジェクト数       |1プロジェクトまで|５プロジェクトまで|無制限|無制限|
|関数呼び出し回数|月に100万回|月に500万回|無制限|
|データ保存期間|７日間|30日間|カスタム出来るらしい|

他にもプランにより使える機能も異なるようです。
気になる方は[こちら](https://www.iopipe.com/pricing/)を確認してください。

## まとめ
Lambda等のサーバーレス構成のアプリケーションって何をどう保守・運用するのか。とても難しいと思います。
これまでは、そもそもサーバーが無いのに何を監視するのか、エラーだけ通知すればいいのか等、各所で議論されていたと思います。
このツールを活用することで、何か出来そうな気がしてます。