AWS Amplify + Kinesis Firehoseでログ記録

はじめに

この記事は、AWS AmplifyアプリケーションにKinesis Data Firehoseを導入するための手順を解説、共有するためのものです。

対象とする読者

  • AWSを使ったことがある
  • AmplifyのGetting startedを完了した
  • 大量のログを保存する必要がある

環境

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

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

▼package.json

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

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

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

AmplifyとKinesis Firehoseの解説

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

Amplify

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

Amplify Analytics

Amplify Analyticsはユーザー分析とプロモーションのためのサービスです。ユーザーの行動を分析したり、特定のユーザーに向けてプッシュメッセージを送信したりします。

このサービスは標準ではAWS Pinpointで構成されていますが、より高度なユーザー分析のためAmazon KinesisAmazon Kinesis Data Firehoseをプラグイン形式で追加できます。

Amazon Kinesis Data Firehose

Amazon Kinesis Data Firehoseはログ情報などリアルタイムで生成されるデータを記録、変換するサービスです。

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

Amplify + Kinesis Firehoseの導入手順

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

S3バケットを作成する

ログを保存するS3バケットを作成します。 バケット名は自由です。後から役割がわかりやすい名前をつけましょう。

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

AWSマネジメントコンソールの画面で、Kinesisのコンソール画面を呼び出します。

Kinesisのコンソール画面で、データ配信ストリームを作成します。

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

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

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

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

▼amplify/team-provider-info.json

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

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

参考 : Amplify Docs : Storing analytics data

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

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

ResourceのデリバリーストリームIDは以下の画面で確認できます。

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

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

▼src/app.js

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

Amplify.recordを実行

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

▼src/app.js

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

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

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