🕌

CloudWatch RUMをTerraformで定義する

2024/02/04に公開

この度自分の自己紹介的なwebサイトを構築しようと思い、そのサイトのエラー検知にcloudwatchのReal User Monitoringを使うことにしたので、それのterraformでの構築方法をメモ

結論

以下のようにすればいい

resource "aws_rum_app_monitor" "rum" {
    name = "${var.app_name}-rum-prod"
    domain = "blog.shiratori.xyz"
    app_monitor_configuration {
        allow_cookies       = true
        enable_xray         = false
        identity_pool_id    = aws_cognito_identity_pool.id-pool.id
        session_sample_rate = 1
        telemetries         = [
            "errors",
            "http",
            "performance",
        ]
    }

    custom_events {
        status = "DISABLED"
    }
}

resource "aws_cognito_identity_pool" "id-pool" {
    identity_pool_name  = "${var.app_name}-id-pool"
    allow_unauthenticated_identities = true
    allow_classic_flow               = true
}

resource "aws_cognito_identity_pool_roles_attachment" "guest_attachment" {
  identity_pool_id = aws_cognito_identity_pool.id-pool.id

  roles = {
    "unauthenticated" = aws_iam_role.guest_role.arn
  }
}

resource "aws_iam_role" "guest_role" {
  name = "${var.app_name}-guest_role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
            Federated = "cognito-identity.amazonaws.com"
        },
        Action = "sts:AssumeRoleWithWebIdentity"
        Condition = {
                StringEquals = {
                    "cognito-identity.amazonaws.com:aud" = aws_cognito_identity_pool.id-pool.id
                },
                "ForAnyValue:StringLike" = {
                    "cognito-identity.amazonaws.com:amr" = "unauthenticated"
                }
            }
      },
    ]
  })
  managed_policy_arns = [aws_iam_policy.guest_policy.arn]
}

resource "aws_iam_policy" "guest_policy" {
  name        = "${var.app_name}-guest_policy"
  path        = "/"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "rum:PutRumEvents",
        ]
        Effect   = "Allow"
        Resource = aws_rum_app_monitor.rum.arn
      },
    ]
  })
}

試行錯誤の内容をメモ

とりあえずコンソールポチポチ

terraformを構築するために、まずcloudwatch rumを使ったことがなかったのでコンソールをポチポチしながらどんな設定があるのか把握します。

やり方は次のリンクを参考にしました。

CloudWatch RUMをNext.jsアプリに組み込んでクライアント側の情報をモニタリングする | DevelopersIO

下記画像のような設定項目があったのでCognitoが作る必要があることがわかりました。

またクライアントでRUMの起動用のスクリプトが必要です。

try {
        const config: AwsRumConfig = {
          sessionSampleRate: 1,
          guestRoleArn: "hogehoge",
          identityPoolId: "hogehoge",
          endpoint: "https://dataplane.rum.ap-northeast-1.amazonaws.com",
          telemetries: ["performance","errors","http"],
          allowCookies: true,
          enableXRay: false
        };
      
        const APPLICATION_ID: string = 'hogehoge';
        const APPLICATION_VERSION: string = '1.0.0';
        const APPLICATION_REGION: string = 'ap-northeast-1';
      
        new AwsRum(
          APPLICATION_ID,
          APPLICATION_VERSION,
          APPLICATION_REGION,
          config
        );
      } catch (error) {
        // Ignore errors thrown during CloudWatch RUM web client initialization
      }

ここで guestRoleArn というものがあるのに気づきました。

調べてみたらどうやら認証されてないユーザー用にIAMRoleが必要みたいです。

というわけでRUMとCognito Id PoolとIAM Roleが必要なことがわかりました。

Terraformにimport

必要なリソースが分かったので、それらをterraformにimportしていきます。

そしてterraform plan して差分を吸収します。

こまごましたエラーの解決

ちょいちょい以下のようなミスがあったので修正して完成です。

  • RUMの起動用のスクリプトを置き換わったIdPoolなど用に変更
  • Policyの設定のタイポ

まとめ

調べてる途中でリソースの作成が検知出来たらなーと思ったら記事がありました。

CloudTrailでAWSリソース作成を検知して通知する | DevelopersIO

次回はこれでリソース作成を検知しつつ必要なリソースを数えてterraform化したいと思います。

Discussion