質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

Amazon Route 53

Amazon Route 53 はAmazonが提供する、 可用性と拡張性に優れた ドメインネームシステム(DNS)サービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

1403閲覧

Terraformを使ってAWS CloudWatch AlarmとAWS Route53 Health Checkを連携させる方法について

Baloncesto

総合スコア7

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

Amazon Route 53

Amazon Route 53 はAmazonが提供する、 可用性と拡張性に優れた ドメインネームシステム(DNS)サービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2022/04/19 15:42

現在、TerraformでURLのHealthCheckを検出するためのAWS CloudWatch Alarmを設定しています。HealthCheckの確認はAWS Route 53で行っています。

HealthCheckIdはCloudWatchの方でRoute53のIDを正常に取得出来ているようなのですが、
以下画像の通り、CloudWatchのアラームとリンクができず困っております。

イメージ説明

Terraformでのやり方についてご教示頂けます助かります。

なお、一点気になっているのが、GUIコンソールから作成しようとすると
「us-east-1」リージョンに配置されるようなのですが、Terraformから実行すると
東京リージョン「ap-northeast-1」に作成されてしまいます。
こちらが原因となりますでしょうか?
「us-east-1」リージョンで作成する方法について教えて頂けますと幸いです。

イメージ説明

.tfファイルは以下となります。

provider "aws" { profile = "terraform-dev" region = "ap-northeast-1" } # --------------------- # Route53 Health Check # --------------------- resource "aws_route53_health_check" "HealthCheck" { failure_threshold = "3" fqdn = var.fqdn port = 443 request_interval = "30" resource_path = var.resource_path type = "HTTPS" cloudwatch_alarm_region = "us-east-1" regions = ["ap-northeast-1", "ap-southeast-1", "us-west-2"] tags = { Name = "${var.name}" } } # --------------------- # CloudWatch Alart # --------------------- resource "aws_cloudwatch_metric_alarm" "healthcheck" { provider = aws.us-east-1 alarm_name = var.alarm_name comparison_operator = "LessThanOrEqualToThreshold" evaluation_periods = "1" metric_name = "HealthCheckStatus" namespace = "AWS/Route53" period = "60" statistic = "Minimum" threshold = "1" dimensions = { HealthCheckId = aws_route53_health_check.HealthCheck.id Region = "us-east-1" } alarm_description = "Send an alarm if ${var.environment} is down" actions_enabled = "true" alarm_actions = ["${aws_sns_topic.topic.arn}"] }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Route53のヘルスチェックのCloudWatch Alarmについて

ご認識の通りus-east-1で作成する必要があるので、すでに作っているならリージョンを正しく指定した上で作成してみてください。
それでうまく行かないならTerraformのコードを追記してください。

Terraformで作成時にap-northeast-1に作成される理由について

hcl

1region = "ap-northeast-1"

ここでリージョンをap-northeast-1に指定しているからです。
単にus-east-1のリソースを管理したいならここをus-east-1に変更すればよいです。
ただし、これをやると同時に管理している他のリソースもすべてus-east-1で作成されるようになってしまいます。

現実には異なるリージョンのサービスを同じtfstateで管理したいこともあります。
同じtfstateで複数のリージョンを管理したいときはMultiple Providerの設定をします。
やり方はこのあたりを参考にするといいでしょう。
alias: Multiple Provider Configurations
複数リージョンのサービス使用時はMultiple Providerを使用する

投稿2022/04/20 04:09

編集2022/04/20 04:17
yu_1985

総合スコア7447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/04/20 04:14 編集

すいません、前半部分を忘れてたので後ほど追記します。 一旦正しくリージョンを指定する方法を試してみてください。
yu_1985

2022/04/20 04:18

追記しました。まずは正しいリージョンに作ってみてください。
Baloncesto

2022/04/20 05:00

ご回答いただき誠にありがとうございます。 情報が不足しており申し訳ありません。 us-east-1で作成を試みているのですが、 実行しようとすると以下の通りエラーとなってしまいます。 ※昨日掲載した.tfには載せていなかったのですが、SNSも作成しようと思っております。 しかし、us-east-1で作成しようとすると以下の通りエラーが帰ってしまいます。 ※ap-northeast-1では以下のエラーは発生しません 昨日のご質問とは少々別問題になるのかもしれませんが、こちらが発生する理由がわからず 困っております。 $ terraform plan aws_route53_health_check.HealthCheck: Refreshing state... [id=75ae6617-e738-47bb-b6a0-151320eda950] aws_sns_topic.topic: Refreshing state... [id=arn:aws:sns:ap-northeast-1:376471554058:HealthCheck-from-TF4] ╷ │ Error: error reading SNS Topic (arn:aws:sns:ap-northeast-1:376471554058:HealthCheck-from-TF4): InvalidParameter: Invalid parameter: TopicArn │ status code: 400, request id: 798171b3-683c-50cc-9fbb-2b6afc1b44ad │ │ with aws_sns_topic.topic, │ on main.tf line 74, in resource "aws_sns_topic" "topic": │ 74: resource "aws_sns_topic" "topic" { │
yu_1985

2022/04/20 05:13

us-east-1からap-northeast-1のSNSトピックを参照しようとしてるのが気になりますね。 SNSトピックもus-east-1で作ったらどうなりますか。
Baloncesto

2022/04/20 05:24

SNSトピックもus-east-1で作成するよう以下の通り変更しまして、terraform planを実行したのですが、 先ほどと同様のエラーが返ってきてしまいます。 ~省略~ provider "aws" { profile = "terraform-dev" region = "us-east-1" alias = "virginia" } resource "aws_sns_topic" "topic" { name = var.sns_topic provider = aws.virginia delivery_policy = jsonencode({ ~省略~ エラー内にap-northeast-1があるため、東京リージョンで作成しようとしているのかと 考えているのですが、AWS のデフォルトリージョンをus-east-1にしても、terraformクレデンシャル情報を us-east-1にしても改善されず苦慮してります。。
yu_1985

2022/04/20 05:35

一旦SNSトピックをdestroyしてから作り直したほうが確実かもしれませんね…。 あと、関係ないですがTerraform0.12以上のバージョンでは、変数単体を指定するときは単に aws_sns_topic.topic.arn のようにすれば取得できます。 囲う必要があるのは他の文字列と結合する必要があるときなどです。 "Send an alarm if ${var.environment} is down" のほうは${}で囲っていないと正しく変数展開されません。
Baloncesto

2022/04/20 14:39

こちら新しくAWS IDを払い出しまして、まっさらな環境で実施したところすべて上手くいき、想定通りの動作となりました。色々とご相談にのっていただきありがとうございました。
yu_1985

2022/04/20 17:10

よかったです。 Terraformがある程度依存関係を解決してくれるとはいえ、時には手動で依存関係を解決してやらないとうまくいかないことはままあるので、そういうときは根気強くトラブルシュートしていくしかないですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問