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に流れると便利ですね。
