AWS Amplify + Kinesis Firehoseでログ記録

## はじめに

この記事は、[AWS Amplify](https://aws.amazon.com/jp/amplify/)アプリケーションに[Kinesis Data Firehose](https://aws.amazon.com/jp/kinesis/data-firehose/)を導入するための手順を解説、共有するためのものです。

### 対象とする読者

-   AWSを使ったことがある
-   Amplifyの[Getting started](https://docs.amplify.aws/start/q/integration/js)を完了した
-   大量のログを保存する必要がある

### 環境

この記事では、JavaScriptベースのWebアプリケーションを対象とします。モバイルアプリケーションは対象としません。

必須となるnpmモジュールは以下の通りです。

_▼package.json_

```json
"dependencies": {
  "aws-amplify": "^3.3.6"
}
```

#### パッケージのバージョンを確認してください

この記事では2020/12/04時点でのAmplifyを前提にしています。Amplifyは活発に開発が行われているため、導入手順が大きく変更されている場合があります。記事を読む前に、お手元の環境を確認してください。

## AmplifyとKinesis Firehoseの解説

まず、今回利用するサービスを解説します。

### Amplify

[Amplify](https://aws.amazon.com/jp/amplify/)とは、モバイル/Webアプリケーションの開発に必要なAWSサービスのパッケージです。アプリケーションに必要となるAPI/ユーザー認証/ホスティング/ユーザー分析といった機能がひとまとめにされています。

### Amplify Analytics

[Amplify Analytics](https://docs.amplify.aws/lib/analytics/getting-started/q/platform/js)はユーザー分析とプロモーションのためのサービスです。ユーザーの行動を分析したり、特定のユーザーに向けてプッシュメッセージを送信したりします。

このサービスは標準では[AWS Pinpoint](https://aws.amazon.com/jp/pinpoint/)で構成されていますが、より高度なユーザー分析のため[Amazon Kinesis](https://aws.amazon.com/jp/kinesis/)や[Amazon Kinesis Data Firehose](https://aws.amazon.com/jp/kinesis/data-firehose/)をプラグイン形式で追加できます。

### Amazon Kinesis Data Firehose

[Amazon Kinesis Data Firehose](https://aws.amazon.com/jp/kinesis/data-firehose/)はログ情報などリアルタイムで生成されるデータを記録、変換するサービスです。

今回はFirehoseをつかって、AmplifyアプリケーションのログをS3バケットに保存します。

## Amplify + Kinesis Firehoseの導入手順

Kinesis Firehoseの具体的な導入手順を解説します。

### S3バケットを作成する

ログを保存するS3バケットを作成します。
![](https://www.evernote.com/l/AAnVLF_kmIhE1a_NXe9aCoXgvqL2varLJJwB/image.png)
バケット名は自由です。後から役割がわかりやすい名前をつけましょう。

### Kinesis Firehoseデータ配信ストリームを作成する

AWSマネジメントコンソールの画面で、Kinesisのコンソール画面を呼び出します。
![](https://www.evernote.com/l/AAmokEJTfT1EiJL7OOiQMYDyIUugFiSV-XYB/image.png)

Kinesisのコンソール画面で、データ配信ストリームを作成します。
![](https://www.evernote.com/l/AAmk6-Z1RptN9oxLNNy2TXheYEJTUus3_WkB/image.png)

以下のスクリーンショットの手順にしたがって、Kinesis Firehoseデータ配信ストリームを作成します。

![](https://www.evernote.com/l/AAlM8tTYu39Ls51EuO6r95gVaGPVj0NmZyQB/image.png)
![](https://www.evernote.com/l/AAk_jMt7VuJHdYbWJUcddQhSkpc9FzyZ4Z4B/image.png)
![](https://www.evernote.com/l/AAnVQm3-JEFB5JL4TzPaGXXudQOn40qKJrMB/image.png?001)
![](https://www.evernote.com/l/AAng5ge_kpZPpYCr5sZ9HWeVtkgupn8HjxcB/image.png?001)

Kinesisのコンソール画面に戻って、Firehoseストリームが作成されていれば成功です。

![](https://www.evernote.com/l/AAma28wTF8NHYacHVpygS4NLIfmko2GNtwkB/image.png)

### IAMロールにFirehoseへの書き込み許可を与える

Webアプリケーションにアクセスしたユーザーが、Firehoseストリームにログを書き込めるよう権限を追加します。

_▼amplify/team-provider-info.json_

```json
{
  "dev": {
    "awscloudformation": {
      ...
      "AuthRoleName": "amplify-<アプリケーション名>-authRole",
      ...
      "UnauthRoleName": "amplify-<アプリケーション名>-unauthRole",
    }
  },
```

`team-provider-info.json`の`AuthRoleName`と`UnauthRoleName`にIAMロール名が記載されています。IAMマネジメントコンソールにアクセスし、このIAMロールに以下のポリシーを追加します。

参考 : [Amplify Docs : Storing analytics data](https://docs.amplify.aws/lib/analytics/storing/q/platform/js)

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": "デリバリーストリームARN"
        }
    ]
}
```

許可するアクションは`firehose:PutRecord`と`firehose:PutRecordBatch`です。このアクションを許可すると、WebアプリケーションからFirehoseへ書き込めます。それ以外の読み込みや削除などのアクションは実行できません。

ResourceのデリバリーストリームIDは以下の画面で確認できます。
![](https://www.evernote.com/l/AAk8qvcZdIJBxa4KDVlPamcl81r8kNDU6OkB/image.png)

### フロントエンドJavaScriptでコンポーネントを読み込み

JavaScript内で、AnalyticsとAWSKinesisFirehoseProviderモジュールを読み込みます。

_▼src/app.js_

```js
import { Analytics, AWSKinesisFirehoseProvider } from 'aws-amplify';
Analytics.addPluggable(new AWSKinesisFirehoseProvider());
```

### Amplify.recordを実行

最後に、JavaScriptからrecord関数を呼び出します。第2引数に'AWSKinesisFirehose'を指定すればログはFirehoseへ出力されます。

_▼src/app.js_

```js
Analytics.record({
    data: { 
        //ログ情報
    },
    streamName: '<Firehoseのストリーム名>'
}, 'AWSKinesisFirehose');
```

デフォルトの設定では、300秒後にFirehoseからS3バケットへログが出力されます。S3バケット内にログファイルが生成されればKinesis Firehoseの導入は成功です。

以上、ありがとうございました。