AWS
Jenkins

Jenkins Pipeline から AWS SNS に publish する

Jenkins でのビルド失敗時に AWS SNS で通知を送りたかったので、そのために試行錯誤したメモ。

AWS SNS について

Simple Notification Service の略で、通知を扱うための AWS のマネージドサービス。AWS SNS にメッセージを Publish することで、設定に応じてメールやチャットツールなどに通知を送ることができる。

AWS SNS の設定方法についてはググればたくさん出てくるので割愛する。

今回は、AWS SNS の Topic は既に作成済みという前提で話をする。

Amazon SNS Build Notifier について

当初 Amazon SNS Build Notifier というプラグインを使おうとしていたが、これは動かなかった。

リポジトリを見ると 2016 年以降メンテナンスされていないようだし、そもそも Pipeline に対応していないのかもしれない。

Pipeline: AWS Steps を使う

Pipeline: AWS Steps というプラグインの中に snsPublish という機能を見つけて「これはいけそうだぞ」と思って試してみたところ、できた。

Jenkins 公式がメンテしているし、現時点ではこれを使うのがベストっぽい。

AWS の認証情報を設定する

いくつか方法があるが、ふたつ紹介する。

SNS:Publish 権限のある IAM ロールを割り当てる

Jenkins サーバを Amazon EC2 で運用している場合はこの方法が最善だと思われる。

使用する SNS トピックに対して publish できる権限を付与した IAM ロールを作成し、Jenkins が動いている EC2 インスタンスに対して割り当てるだけ。

サーバ内に認証情報を置いておく必要が無いのでセキュア。

Jenkins サーバ内に Credentials を設置する

Jenkins サーバが AWS 以外のサーバで動いている場合はこの方法をとるしかない。

Jenkins のビルドは jenkins ユーザが実行していたので、jenkins ユーザのホームディレクトリ以下の .aws/credentials に認証情報が保存されるようにする。

$ sudo su - jenkins
$ aws configure

同じサーバ内で AWS の認証情報が複数ある場合は、Pipeline 定義で withAWS という step を挟むことで柔軟に認証情報を設定できるらしい。

Pipeline 定義に通知設定を書く

以下のように書くと「ビルドが失敗した場合」に通知することができる。

Jenkinsfile
pipeline {
    stages {
        // 必ずコケるステージ
        stage('main') {
            steps {
                sh 'false'
            }
        }
    }
    post {
        failure {
            snsPublish(
                topicArn: 'arn:aws:sns:ap-northeast-1:000000000000:xxxxxxxx',
                subject: 'Build failed!',
                message: env.BUILD_URL,
            )
        }
    }
}

ビルドを実行すると、無事通知が届くと思う。

参考