はじめに
Globis Advent Calendar10日目は、弊社のエンジニアチームを支えるインフラ技術をお伝えいたします。
開発スピードをさらに促進するために、Blue Green Deployment, Infrastrucure as Code, ChatOps など新しい運用思想を積極的に取り入れて、手動でのオペレーションを極力なくしています。
今回は、弊社で実運用しているChatOpsの一例として、CodeBuildの実行結果をslackに通知する方法を、可能な範囲で具体的にお伝えいたします。
設定方法
AWS Lambdaの設定
コード
import os
import json
import urllib.request
URL = os.environ['WEBHOOK_URL']
def send_slack(obj): ## slackに通知
method = "POST"
headers = {"Content-Type" : "application/json"}
js = json.dumps(obj).encode("utf-8")
request = urllib.request.Request(URL, data=js, method=method, headers=headers)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode("utf-8")
def check_status(status):
fail = False
if status == 'IN_PROGRESS':
color = '#008000' ## green
elif status == 'SUCCEEDED':
color = '#00BFFF' ## deepskyblue
else:
color = '#FF00FF' ## magenta
fail = True
return color, fail
def parse_event(event): ## cloudwatch event から渡された event(dict型)をパース、slackに渡すobjectを生成。
detail = event['detail']
status = detail['build-status']
initiator = detail['additional-information']['initiator']
log = detail.get('additional-information', {}).get('logs', {}).get('deep-link', 'Not Exist')
color, fail = check_status(status)
fields = [{'title': 'Initiator', 'value': initiator, 'short': False},
{'title': 'Status', 'value': status, 'short': False},
{'title': 'LogLink', 'value': log, 'short': False}]
obj = {'attachments': [{'color': color, 'fields': fields}]}
# if fail == True: ## Fail時にチャンネルメンション飛ばしたい時はコメントを外す。
# obj['attachments'][0]['text'] = '<!channel>'
return obj
def lambda_handler(event, context): ## lambdaから最初にcallされる関数。
obj = parse_event(event)
send_slack(obj)
return
環境変数の設定
CloudWatch Event の設定
slackでの通知結果
- ワンクリックでビルドログを眺めることができます。
運用事例のご紹介
- AWS Athenaのテーブルにクエリを実行し、中間テーブルを生成するETL処理のバッチ
- Ruby on Rails アプリケーションデプロイ時の db:migrate 処理
- 最近はCodeBuildをVPC内で実行できるようになったので、利用できる幅が広がっています!
おわりに
いかがでしたでしょうか。python初心者(僕)でもChatOpsに貢献できます。
グロービスではSREエンジニアを募集しています!
インフラの運用担当だけど手作業を自動化したいと考えている方、開発者だけどインフラも含めてコードで管理したい方、一緒に理想のインフラを作ってみませんか?