Closed10
【Terraform】SNSの通知をEventBridgeの入力トランスフォーマーでわかりやすくする
題材
カスタマイズしないと?
jsonが見にくい
どこで設定する?
コンソールの場合、ターゲット入力を設定
から入力トランスフォーマー
を選択することで設定できました
設定
- サンプルイベント
- スポットインスタンスの中断イベントである
EC2 Spot Instance Interruption Warning
を選択
- スポットインスタンスの中断イベントである
{
"version": "0",
"id": "1e5527d7-bb36-4607-3370-4164db56a40e",
"detail-type": "EC2 Spot Instance Interruption Warning",
"source": "aws.ec2",
"account": "123456789012",
"time": "1970-01-01T00:00:00Z",
"region": "us-east-1",
"resources": ["arn:aws:ec2:us-east-1b:instance/i-0b662ef9931388ba0"],
"detail": {
"instance-id": "i-0b662ef9931388ba0",
"instance-action": "terminate"
}
}
- ターゲット入力トランスフォーマー
- 以下のようにします
{
"Instance": "$.detail.instance-id",
"InterruptionNotice": "$.time"
}
- スポットインスタンスの中断イベントから
instance-id
とtime
を抜き出し、Instance
とInterruptionNotice
に格納します。 - テンプレート
- 以下のようにします
"インスタンスID: <Instance>"
"通知を受け取った時間: <InterruptionNotice>"
- 先程設定した
Instance
とInterruptionNotice
をテンプレートに設定します
プレビュー
出力を生成
することで出力を確認することができます
インスタンスIDと通知時間が正常に出力されることを確認します
インスタンスID: i-0b662ef9931388ba0"
"通知を受け取った時間: 1970-01-01T00:00:00Z
実際にメールを飛ばす
テンプレート通りの通知がきました!
Terraform化
Terraformでも設定できるようにしておきます。
ドキュメントにサンプルがあったのでパクリましょう
resource "aws_cloudwatch_event_target" "sns" {
rule = aws_cloudwatch_event_rule.spot-interruption-rule.name
arn = aws_sns_topic.topic.arn
input_transformer {
input_paths = {
Instance = "$.detail.instance-id",
InterruptionNotice = "$.time",
}
input_template = <<EOF
"インスタンスID: <Instance>"
"通知を受け取った時間: <InterruptionNotice>"
EOF
}
}
見やすくするためにヒアドキュメントを使用しています。
所感
- Lambdaを設定する必要がない
- しかしLambdaのように値の加工はできない、あくまでイベントの値だけ使用可能
- カスタマイズが必須の場合Lambdaを使う、イベントの値だけで目的を満たせるのであればEventBridgeの入力トランスフォーマーで操作する
参考
このスクラップは2023/06/26にクローズされました