表題の件で確認させてください。
現在以下フォルダ構成の環境でTerraform環境を構築しております。
├─tf-common │ │ output.tf │ │ provider.tf │ │ sns.tf │ │ terraform.tfvars │ └─tf-tenant │ .terraform.lock.hcl │ cloudwatch.tf │ provider.tf │ route53.tf │ Tenant-0041.tfvars │ └─.terraform │ terraform.tfstate
tf-tenantフォルダ配下でterraform planを実行すると以下のようにエラーとなりました。
sns_topicが参照できない旨のエラーとなるのですが、解決できず困っております。
│ Error: Reference to undeclared resource │ │ on cloudwatch.tf line 23, in resource "aws_cloudwatch_metric_alarm" "healthcheck": │ 23: alarm_actions = ["${aws_sns_topic.topic.arn}"] │ │ A managed resource "aws_sns_topic" "topic" has not been declared in the root module.
調べてみると、moduleを利用することで別フォルダのリリースを参照できるとのことなのですが、
今ひとつ使い方がわからず、困っております。
この環境の場合、どういったmoduleを利用することでsnsのリソースを参照させることができるのでしょうか?
念のためですが、cloudwatch.tfとsns.tfのコードは以下となります。
cloudwatch.tf
6 resource "aws_cloudwatch_metric_alarm" "healthcheck" { 7 count = length(aws_route53_health_check.HealthCheck) 8 provider = aws.virginia 9 alarm_name = var.targets[count.index].alarm_name 10 comparison_operator = "LessThanThreshold" 11 evaluation_periods = "1" 12 metric_name = "HealthCheckStatus" 13 namespace = "AWS/Route53" 14 period = "60" 15 statistic = "Minimum" 16 threshold = "1" 17 18 dimensions = { 19 HealthCheckId = aws_route53_health_check.HealthCheck[count.index].id 20 } 21 alarm_description = "Send an alarm if ${var.environment} is down" 22 actions_enabled = "true" 23 alarm_actions = ["${aws_sns_topic.topic.arn}"] }
sns.tf
resource "aws_sns_topic" "topic" { # name = var.sns_topic name = var.service_name provider = aws.virginia delivery_policy = jsonencode({ "http" : { "defaultHealthyRetryPolicy" : { "minDelayTarget" : 20, "maxDelayTarget" : 20, "numRetries" : 3, "numMaxDelayRetries" : 0, "numNoDelayRetries" : 0, "numMinDelayRetries" : 0, "backoffFunction" : "linear" }, "disableSubscriptionOverrides" : false, "defaultThrottlePolicy" : { "maxReceivesPerSecond" : 1 } } }) } resource "aws_sns_topic_subscription" "default" { topic_arn = aws_sns_topic.topic.arn provider = aws.virginia protocol = "lambda" endpoint = aws_lambda_function.default.arn }