🕌
CloudWatch RUMをTerraformで定義する
この度自分の自己紹介的な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