はじめに
RDS (PostgreSQL) のログを CloudWatch に出力したら、Terraform で保持期間を設定しようとして「The specified log group already exists」と怒られたときのおはなしです。
わかったこと
- Terraform 管理下にないリソースをコードにかくと、有無を言わさず新規作成になってしまう
-
terraform importを使えば、既存リソースを Terraform の管理下に置くことができる
やりたかったこと
- RDS for PostgreSQL のログを CloudWatch Logs に出力したい
- CloudWatch Logs の保持期間は 1か月(30日)にしたい
- 上記の設定は Terraform でコード化したい
何をして何が起きたか?
PostgreSQL のログを CloudWatch Logs に出力する
RDSを定義しているリソースで enabled_cloudwatch_logs_exports を追加し、CloudWatch Logs に PostgreSQL のログを出力できるようにしました。
resource "aws_db_instance" "my_postgres" {
// Engine options
engine = "postgres"
engine_version = "14.18"
// Settings
identifier = "my-postgres"
// (中略)
// Log
enabled_cloudwatch_logs_exports = [
"postgresql"
]
}
apply すると、CloudWatch Logs に /aws/rds/instance/my-postgres/postgresql というロググループが自動で作成され、PostgreSQL のログが出力されていました。
ただし、保持期間が「失効しない」となっていたので、これを「1か月」に変更しようとしました。
CloudWatch Logs の保持期間を変更する
自動で作成されたロググループに対して retention_in_days を指定したリソース定義を追加しました。
resource "aws_cloudwatch_log_group" "postgresql" {
name = "/aws/rds/instance/${aws_db_instance.my_postgres.identifier}/postgresql"
retention_in_days = 30
}
apply すると、ここで「The specified log group already exists」エラーが発生したのです。
いや、知ってるけども。
Terraform で保持期間を変更したいんじゃ!
ちゃっぴーさん
に聞いてみました。
なるほどね…
既存のロググループを Terraform 管理下におく
にいわれたとおり import して Terraform の state に取り込んでみました。
terraform import aws_cloudwatch_log_group.postgresql "/aws/rds/instance/my-postgres/postgresql"
再挑戦! CloudWatch Logs の保持期間を変更する
import のあとで apply したところ、無事に保持期間が変更できました ![]()
さいごに
ログのエクスポート設定を入れる前に、保持期間を指定したロググループを作成しておけば、つつがなく apply できていたのかもしれません(知らんけど)。
とはいえ、terraform import のことを知るきっかけになったので結果オーライです。
既存リソースを後づけで Terraform 管理にできるのは便利だな、と感じました。
