AWS CodeDeployのデプロイ結果をSlackに流す

こんにちは、メディアシステム開発部の竹谷です。

私のチームではAWS CodeDeployを使っているのですが、デプロイ結果をSlackに流せないかなと思って調べてみました。
CodeDeployは、デプロイのステータスをAWS SNSに流すことができるので、CodeDeploy→SNS→Lambda→Slackといった流れで実現してみました。

SNSの設定

まずは、CodeDeployのステータスを流すSNS topicを新規作成します。

CodeDeployの設定

トリガーの作成から、デプロイステータスをSNSに送る設定を行います。

作成したSNS topicを指定します。

Lambda functionの作成

次にLambda functionの作成ですが、Lambdaを実行するIAM Roleをあらかじめ作っておきます。

最低限AWSLambdaExecuteが必要です。

Lambda functionを作成します。
今回はPythonで作成します。右下のsns-message-pythonを選びます。

作成したSNS topicを選択します。

Roleには作成しておいたRoleを指定します。

コードは以下のような感じです。
(requests ライブラリを使用していますので、実際にはパッケージ化する必要があります)

import json
import requests

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    message = event['Records'][0]['Sns']['Message']
    print("From SNS: " + message)

    messageDict = json.loads(message)
    if messageDict['status'] == 'FAILED':
        slackColor = 'danger'
        slackValue = messageDict['errorInformation']
    else:
        slackColor = 'good'
        slackValue = messageDict['status']

    url = 'https://hooks.slack.com/services/xxxxx/xxxxx'
    payload = {
        'channel': '#deploy',
        'username': 'CodeDeploy',
        'icon_emoji': ':shipit:',
        'attachments': [
            {
                'fallback': 'code deploy status : ' + messageDict['deploymentGroupName'] + ' : ' + messageDict['status'],
                'color': slackColor,
                'title': messageDict['deploymentGroupName'] + ' : '  + messageDict['status'],
                'text': slackValue
            }
        ]
    }
    headers = {'content-type': 'application/json'}
    r = requests.post(url, data=json.dumps(payload), headers=headers)

    return message

CodeDeployを動かしてみる

Lambda functionを作成して、実際にCodeDeployを動かすとSlackに流れることが確認できました。

デプロイ開始と成功した場合。

デプロイ失敗した場合。

まとめ

デプロイ結果がSlackに流れると便利ですね。