mockmockでSORACOM Funkにデータを送るプロジェクトを作成する

# mockmockでSORACOM Funkにデータを送るプロジェクトを作成する

この記事は[mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock)9日目の記事です。
昨日は@m-shimaoによる「[mockmockでSORACOM Funnelにデータを送るプロジェクトを作成する](https://qiita.com/m-shimao/items/1295cc3f7aee45f084af)」でした。

本日も昨日に引き続きSORACOMのサービスの一つである「Funk」へデータを送るプロジェクトの作成手順をまとめます。

## やりたいこと

mockmockからSORACOM FunkにJSONデータを送信します。SORACOM FunkはAWS Lambdaを起動するよう設定しておきます。

AWS LambdaがJSONで受け取った文字列をSlack投稿することで、起動を確認します。
![Untitled_mockmock_-_Cacoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/75885585-3092-f63f-f9c2-571e331385cd.png)


## AWSの設定

### AWS Lambdaの設定

[Lambdaのコンソール](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/functions)へアクセスして、「関数の作成」をクリックしてください。
![Lambda_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/a94fe87e-7d63-91ba-9865-0b55feb5dc89.png)


「一から作成」をクリックし、「基本的な情報」を以下のように入力した後、「関数の作成」をクリックしてください。
![Lambda_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/5fd14b4a-f83d-62cc-1c5b-b449246540a5.png)

|項目  |入力値  |
|---|---|
|関数名  |任意の関数名(ex.mockmock-soracom-funk-test)  |
|ランタイム  |Node.js 12.x  |
|実行ロール  |基本的なLambdaアクセス権限で新しいロールを作成  |

Lambdaの設定画面が開いたら、関数コードを以下内容にコピペしてください。

その際、`slackUrl` には自身が使用しているSlackにて発行したIncoming Webhook ULRを代入するよう修正してください。
![Lambda_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/b3dfac41-0dfa-cb72-d897-232280f00c5b.png)

```js
const https = require('https');
const url = require('url');
const slackUrl = '<SlackのIncoming Webhook URLに置き換えてください>'

exports.handler = function(e, ctx, cb) {
    const slackReqOptions = url.parse(slackUrl);
    const payload = {
        "text": "SORACOM Funkから送信されたメッセージがあります",
        "attachments": [ {
            "title": "メッセージ",
            "color": "#34cdd7",
            "text": e.message,
        } ]
    };
    const body = JSON.stringify(payload);

    slackReqOptions.method = 'POST';
    slackReqOptions.headers = { 'Content-Type': 'application/json' };
    slackReqOptions.headers = {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(body),
    };
    
    const req = https.request(slackReqOptions, function(res) {
        if (res.statusCode === 200) {
            console.log('Posted to slack');
            cb(null, {"result":"ok"});
        } else {
            cb(false, {"result":"ng", "reason":'Failed to post slack ' + res.statusCode})
        }
        return res;
    });
    req.write(body);
    req.end();
};

```

## mockmockの設定

### プロジェクトの作成

mockmockの「[プロジェクト新規作成](https://console.mock-mock.com/projects/new)」画面へアクセスし、以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f66336666323066642d316238332d326331342d636530352d6264333737356165626566322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/17320142-1ebe-8a17-6324-94777abe275a.png)

|項目  |入力値  |
|---|---|
|プロジェクト名  |任意のプロジェクト名(ex.soracom-funk-test)  |
|サーバタイプ  |SORACOM  |
|キャパシティ  |cs1  |

### SORACOM認証情報の作成

後の手順でSORACOM側の設定を変更するために必要な「SORACOM認証キー」を作成します。
mockmockの「プロジェクト設定画面」にアクセスし「SORACOM認証キー一覧」の「新規作成」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f38643066623463302d353961652d303939372d623033622d6433303634363536336637612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/59c59b3a-7f45-b038-b832-022c54199e03.png)

「認証キーをダウンロード」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f38663233636165632d303737312d653961322d393838312d6565366436613364316134352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/2b62b9c6-6f04-7a38-d273-c31c063273c8.png)

続いて、「SORACOM 認証情報ストア」を作成します。
![d057cc38-f031-b11d-c905-07a70cf4424d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/464d6eeb-145b-4ac2-aeb3-6bd50c1d79cc.png)


以下のように「SORACOM認証情報ID」が表示されていればOKです。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f63323263633839352d653765322d326335642d353939332d6230363531326532383862642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/a33e606e-bcd1-bc57-7c0f-7de149007ade.png)

### バケットバリュージェネレータの作成

サイドメニューの「バケット」の右側の「＋」をクリックし、以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f66316163613732312d356562372d343866392d373464612d3937333931653632336261352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/80301050-9904-5420-711e-f10a2a13e4df.png)

|項目  |入力値  |
|---|---|
|バケットバリュージェネレータ名  |任意のバリュージェネレータ名(ex. message)  |
|送信ルール  |ランダム  |
|データリスト  |任意の文字列(ex.SORACOM Funkを使ったシステムのテストはmockmockにおまかせ！)  |

### データテンプレートの作成

続いて、データテンプレートを作成します。
サイドメニューの「テンプレート」の右側の「＋」をクリックし、以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f34333930666439322d623835352d303065342d373530622d3138643733653561386262372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/43aa7155-ddb4-75fd-3709-7b49085f0211.png)

|項目  |入力値  |
|---|---|
|テンプレート名  |任意のテンプレート名(ex. message)  |
|元になるjson  |{ "message": "message" }  |

作成後、表示された画面で「message」をクリックしてください。
![2fdd4c61-4c93-b955-9573-5d6fc27f570e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/56ba3705-8004-d4e9-819b-0a39accd84fe.png)


以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f31316537383333332d636532382d306661392d363035652d3332633039343538633466612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/1a5641a9-ad48-6367-c5c9-6b249393b265.png)


|項目  |入力値  |
|---|---|
|キー  |message  |
|型  |String  |
|生成タイプ  |bucket  |
|ジェネレーター名  |message  |

### mockグループの作成

サイドメニューの「mockグループ」の右側の「＋」をクリックし、以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f65626630313934372d386536622d636337662d613835632d3538306530306630303038342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/94f5999b-aae5-84a9-5402-ae310cdeb10e.png)


|項目  |入力値  |
|---|---|
|mockグループ名  |任意のmockグループ名(ex. message)  |
|最大稼働時間  |600  |

### mockステータスの作成

作成したmockグループの詳細画面で「mockステータス」→「mockステータス作成」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f66306337363462392d653035642d656161612d396661642d6361336564643036306135382e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/0d29e4d0-826d-2fe6-f411-d91c82b550ba.png)

以下の通り入力した後、「登録」をクリックしてください。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f64353431663735322d646531322d346565392d383565622d3561616335653734346330652e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/8bb1bb18-ff22-897c-d04d-a4f706534b9f.png)

|項目  |入力値  |
|---|---|
|状態名  |任意の状態名(ex. normal)  |
|初期状態  |チェック  |
|最小送信間隔  |10  |
|最大送信間隔  |10  |
|データテンプレート  |message  |

## SORACOMの設定

### SORACOM CLIのインストール

SORACOMの設定はCLI経由で行う必要があるため、以下ページに従ってSORACOM SLIをインストールしてください。

[SORACOM CLI 利用ガイド](https://dev.soracom.io/jp/docs/cli_guide/)

インストールが完了したらprofileを設定しておきましょう。

```bash
$ soracom configure --profile mockmock

--- SORACOM CLI セットアップ ---
/Users/user/.soracom ディレクトリがなければ作成し、そこにファイル 'mockmock.json' を作成します。

カバレッジタイプを選択してください。

1. Global
2. Japan

選択してください (1-2) > 2


認証方法を選択してください。

1. AuthKeyId と AuthKey を入力する（推奨）
2. オペレーターのメールアドレスとパスワードを入力する
3. SAM ユーザーの認証情報を入力する（オペレーターID、ユーザー名、パスワード）

選択してください (1-3) > 1
authKeyId: (SORACOM認証キーファイルに記載されているauth_key_idの値)
authKey: (SORACOM認証キーファイルに記載されているauth_key_secretの値)
```

### SORACOM 認証情報の登録

テキストエディタ等を利用して以下のようなJSONファイルを作成します。

```json:credential.json
{
  "type": "aws-credentials",
  "description": "for_mockmock",
  "credentials": {
    "accessKeyId": "<Lambdaの実行権限を持つIAMユーザのaccess keyを入力してください>",
    "secretAccessKey": "<Lambdaの実行権限を持つIAMユーザのsecret keyを入力してください>"
  }
}
```

以下コマンドを実行して、認証情報を登録します。

```bash
soracom credentials update --credentials-id <SORACOM 認証情報ID> --body @credential.json --profile mockmock
{
	"createDateTime": 1575882058,
	"credentials": {
		"accessKeyId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
	},
	"credentialsId": "pj-xxxxxxxxxxxxx",
	"description": "for_mockmock",
	"type": "aws-credentials",
	"updateDateTime": 1575882604
}
```

### SORACOM Funkの設定

テキストエディタ等を利用して以下のようなJSONファイルを作成します。

```json:funk.json
[
  {
    "key": "contentType",
    "value": "json"
  },
  {
    "key": "credentialsId",
    "value": {
      "$credentialsId": "<SORACOM 認証情報IDを入力してください>"
    }
  },
  {
    "key": "destination",
    "value": {
      "provider": "aws",
      "resourceUrl": "<LambdaのARNを入力してください>",
      "service": "lambda"
    }
  },
  {
    "key": "enabled",
    "value": true
  }
]
```

以下コマンドを実行して、SORACOM Funkの設定を登録します。

```bash
soracom groups put-config --group-id <デバイスグループID> --namespace SoracomFunk --body @funk.json --profile mockmock
{
	"configuration": {
		"SoracomFunk": {
			"contentType": "json",
			"credentialsId": {
				"$credentialsId": "pj-xxxxxxxxxxxxx"
			},
			"destination": {
				"provider": "aws",
				"resourceUrl": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:mockmock-soracom-funk-test",
				"service": "lambda"
			},
			"enabled": true
		}
	},
	"createdAt": 1575878572981,
	"createdTime": 1575878572981,
	"groupId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
	"lastModifiedAt": 1575882779581,
	"lastModifiedTime": 1575882779581,
	"operatorId": "OP0085360624",
	"tags": {
		"name": "production-pj-xxxxxxxx"
	}
}
```

尚、デバイスグループIDはmockmockのプロジェクト設定画面にて確認できます。
![170dc527-bc27-056a-6dcf-f87719b28d08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/a1af1be0-1d13-1f33-f3a5-c39263eafb70.png)

## 動作確認

### mock起動

mockmockの「mock一覧」→「mock作成」の順でクリックしてください。
![ce4d4325-af27-bd0d-59dc-e5352b247fcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/c9e2114c-ec1b-8ac5-1d9e-c7e7658fc80e.png)

mockが作成されました。
作成したmockの「操作」→「起動」をクリックしてください。
![58c54612-5e1c-fa95-ecb6-8f4ce284d16b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/acb002b2-942a-3c25-308d-85e57eeacad0.png)

Slackにてmockmockから送信されたメッセージが確認できます。
![Slack___nicole-dev___fusic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/4f922749-82cc-cdea-79d5-aec9ded40f7c.png)


## まとめ

本記事では、mockmockでSORACOM Funkにデータを送るプロジェクトを作成しました。
今後、FaaSを簡単に呼び出す手段としてSORACOM Funkの活用が期待されますので、テストの際にはぜひお試しください。

明日は@Kta-Mが「mockmockでAmazon API Gatewayにデータを送るプロジェクトを作成する」をご紹介します。

## 参考

- [SORACOM Funk を利用して AWS Lambda を呼び出し Slack へ通知する](https://dev.soracom.io/jp/start/funk_aws_lambda/)
- [mockmockドキュメント SORACOMにデータを送る](https://console.mock-mock.com/docs/guides/soracom)