🔎
Amazon Elasticsearch Serviceのsearch slow logをTerraform経由で有効にする
Amazon Elasticsearch Service(以後Amazon ES)のドメインをTerraformで管理していて、search slow logやindex slow logのCloudwatchへの送信もTerraformで有効化する時にいい感じのサンプルコードが見当たらなかったので自分のコードを残そうと思います。
Terraform の aws_elasticsearch_domain リソースのドキュメントにサンプルコードを参考にしましたが、このコードだと全てのCloudwatch Logsのグループへの書き込みが実行できるようになっているので下記のようにしてみました。
elasticseach.tf
resource "aws_elasticsearch_domain" "example" {
# .. other configuration ...
log_publishing_options {
cloudwatch_log_group_arn = aws_cloudwatch_log_group.example_search_slow_log.arn
log_type = "SEARCH_SLOW_LOGS"
}
log_publishing_options {
cloudwatch_log_group_arn = aws_cloudwatch_log_group.example_index_slow_log.arn
log_type = "INDEX_SLOW_LOGS"
}
}
cloudwatch_log_group.tf
resource "aws_cloudwatch_log_group" "example_search_slow_log" {
name = "/aws/es/example_search_slow_log"
}
resource "aws_cloudwatch_log_group" "example_index_slow_log" {
name = "/aws/es/example_index_slow_log"
}
resource "aws_cloudwatch_log_resource_policy" "example_es_cloudwatch_log_group_policy" {
policy_name = "example-es-cloudwatch-log-group-policy"
policy_document = data.aws_iam_policy_document.example_es_log_publishing_policy.json
}
data "aws_iam_policy_document" "example_es_log_publishing_policy" {
statement {
actions = [
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:PutLogEventsBatch",
]
resources = [
"${aws_cloudwatch_log_group.example_search_slow_log.arn}:*",
"${aws_cloudwatch_log_group.example_index_slow_log.arn}:*",
]
principals {
identifiers = ["es.amazonaws.com"]
type = "Service"
}
}
}
Discussion