はじめに
AWS Amplifyで構築しているReactアプリケーションのログをCloudWatch Logsに送信してみました。
動作確認のバージョン
- Amplifyのバージョン: 12.8.2
手順
1. 認証基盤の設定確認
今回のシステムはログイン機構を設けていないため、未認証のユーザーによるCognito IDプールを通じてAWSリソースにアクセス(ログを記録)できるようにします。
既に構築済みのシステムの場合、amplify/backend/auth/{appName}/cli-inputs.jsonで確認可能です。
{ "version": "1", "cognitoConfig": { "identityPoolName": "xxxxxxxx", "allowUnauthenticatedIdentities": true, ← 未認証のユーザーによるCognito IDプール経由のAWSリソースアクセス "resourceNameTruncated": "xxxxxxxx",
2. AmplifyプロジェクトのIAMリソースの上書き
Amplify CLIを使用して、Amplifyプロジェクトの未認証のIAMロールに対してCloudWatch Logsに対する権限を追加します。
$ amplify override project
コマンドを実行後、amplify/backend/awscloudformation/override.tsが生成されるので以下のように編集します。
未認証のロール(unauthRole)に対してCloudWatch Logsの権限を付与しています。
import { AmplifyRootStackTemplate, AmplifyProjectInfo } from "@aws-amplify/cli-extensibility-helper"; export function override( resources: AmplifyRootStackTemplate, amplifyProjectInfo: AmplifyProjectInfo ) { const unauthRole = resources.unauthRole; const projectName = amplifyProjectInfo.projectName const env = amplifyProjectInfo.envName const policyName = `amplify-${projectName}-${env}-UILoggerPolicy` const basePolicies = Array.isArray(unauthRole.policies) ? unauthRole.policies : [unauthRole.policies]; unauthRole.policies = [ ...basePolicies, { policyName: policyName, policyDocument: { Version: "2012-10-17", Statement: [ { Resource: "arn:aws:logs:*:*:*", Action: [ "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:CreateLogGroup", "logs:PutLogEvents" ], Effect: "Allow", }, ], }, }, ]; }
ファイル保存後、バックエンドリソースをデプロイします。
$ amplify push
3. ロガーの設定
ReactアプリケーションのソースコードにAmplifyのLogger、AWSCloudWatchProviderを追加して、ログをCloudWatch Logsに送信できるように設定します。
... import { Amplify, Logger, AWSCloudWatchProvider } from 'aws-amplify'; import awsExports from "./aws-exports"; // Amplifyの設定 Amplify.configure({ Logging: { logGroupName: 'testLogGroup', logStreamName: `log-stream-${new Date().toISOString().split('T')[0]}`, }, ...awsExports }); // Loggerインスタンスの作成 const logger = new Logger('appName', 'DEBUG'); // Loggerの登録 Amplify.register(logger); // CloudWatchプラグインの追加 logger.addPluggable(new AWSCloudWatchProvider()); ... logger.info('ログ出力')
実装後の確認
Reactアプリケーションにアクセスし、CloudWatch Logsを確認するとログが出力されていることを確認できました。
感想
比較的手軽にフロントエンドの操作をロギングできるので、便利だと思いました。
クライアントサイドでロギング設定を管理しているため、セキュリティ面やパフォーマンスへの影響は気にしておいた方が良さそうです。
また、デフォルトのログ出力だとDateオブジェクトのフォーマットが分/秒/ミリ秒
になっているので、必要に応じてカスタマイズを検討してもいいかもしれません。