LoginSignup
1
0

More than 5 years have passed since last update.

CodePipelineのイベント通知をEメールでさくっと受け取る

Posted at

CodePipelineの開始時と終了時にEメールで通知を受け取りたかったので、Terraformでさくっと構築してみた。

SNSを作成

まずはSNSトピックを作成して、「CloudWatchEventsからPublishされてもいいよ」というIAMポリシーを付与する。

sns.tf
resource "aws_sns_topic" "codepipeline" {
  name = "CodePipelineExecutionStateChange"
}

resource "aws_sns_topic_policy" "codepipeline" {
  arn    = "${aws_sns_topic.codepipeline.arn}"
  policy = "${data.aws_iam_policy_document.sns_topic_policy.json}"
}

data "aws_iam_policy_document" "sns_topic_policy" {
  statement {
    effect  = "Allow"
    actions = ["sns:publish"]

    principals {
      type        = "Service"
      identifiers = ["events.amazonaws.com"]
    }

    resources = ["${aws_sns_topic.codepipeline.arn}"]
  }
}

CloudWatchEventsを作成

次にCloudWatchEventsを使って、CodePipelineのイベントが発生したときに、SNSトピックをPublishするように設定する。

cloudwatch_events.tf
resource "aws_cloudwatch_event_rule" "codepipeline" {
  name        = "CodePipelineExecutionStateChane"
  description = "CodePipeline Pipeline Execution State Change"

  event_pattern = <<PATTERN
{
  "source": [
    "aws.codepipeline"
  ],
  "detail-type": [
    "CodePipeline Pipeline Execution State Change"
  ]
}
PATTERN
}

resource "aws_cloudwatch_event_target" "codepipeline_to_sns" {
  rule = "${aws_cloudwatch_event_rule.codepipeline.name}"
  arn  = "${aws_sns_topic.codepipeline.arn}"

  input_transformer {
    input_paths = {
      PipelineName = "$.detail.pipeline"
      State        = "$.detail.state"
    }

    input_template = "\"Pipeline [<PipelineName>] execution state changed [<State>]\""
  }
}

メールの送信メッセージをカスタマイズ

CloudWatchEventsにはInput Transformerというイベントをカスタマイズできる機能がある。
Input Transformerを使わない場合、以下のようにイベントのJSONがただ送られてくるだけになる。

df5c1936ba82ce09d3045cabd6f3d8db.png

これだと味気ないため、Input Transformerでメールの内容をいい感じにする。Terraoformではaws_cloudwatch_event_target.*.input_transformerを設定してあげればいい。

input_transformer {
  input_paths = {
    PipelineName = "$.detail.pipeline"
    State        = "$.detail.state"
  }

  input_template = "\"Pipeline [<PipelineName>] execution state changed [<State>]\""
}

input_pathsには、input_templateで使える変数を定義する。
$.detail.pipelineのようなイベントデータは公式ドキュメントの「Amazon CloudWatch Events でパイプラインの状態の変更を検出」にサンプルイベントとして載っているので、そちらを参照されたし。

またinput_templateは、文字列をさらにダブルクオーテーション"で囲む必要があるため、気を付けよう。

7f5de837bd56eb384b87b3806d9ac965.png

うむ。いい感じになった。

通知フィルター

「もっと通知の段階を増やしたい、減らしたい」という場合は、event_patternのdetail-typeを変更すればCodePipelineのステージやアクションごとに通知を飛ばすことが可能になる。

その他にもスキップするパターンなども指定することが可能だ。
詳しくは上でも貼った公式ドキュメントの「Amazon CloudWatch Events でパイプラインの状態の変更を検出」に書かれている。

またevent_patternのJSONは、Events作成画面から簡単に作成・取得できる。
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#rules:action=create

Eメールでの購読を承認

次にSNSのコンソール画面で、トピックのサブスクリプションを作成する必要がある。
Eメールの場合は承認が必要で、現在Terraformではサポートしていないからだ。

手動でサブスクリプションを作成した後、確認メールの承認URLを踏んで承認しておこう。

Eメールを受信

試しにCodePipelineを起動してみる。
すると先ほどのようなメールが、「AWS Notifications<no-reply@sns.amazonaws.com>」という人物から届く。

7f5de837bd56eb384b87b3806d9ac965.png

よし。こういうのでいいんだ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0