Trusted Advisor의 상태 변경을 Slack에 알리는 Lambda 함수를 serverless로 작성
15345 단어 람다파이썬ServerlessFramework슬랙AWS
개요
이 기사에서는 AWS Trusted Advisor의 상태 변경을 Slack에 알리기 위해 Python에서 Lambda 함수를 작성하고 serverless framework에서 배포하는 방법을 설명합니다.
AWS Trusted Advisor의 상태 변경을 알리는 의미
AWS Trusted Advisor는 AWS 인프라의 구성을 최적화하기 위해 '비용 최적화', '서비스 제한', '보안' 등의 항목에 적절한 조언을 해주는 서비스입니다.
예를 들어, RDS 수동 스냅샷의 기본 제한 수는 100이므로 수동 스냅샷 수가 80에 도달하면 AWS Trusted Advisor가 "서비스 제한"항목에 대해 경고합니다.
관리자는 AWS Management Console에서 세부 정보를 확인할 수 있으며 Email에서 주간 점검 결과를 받을 수 있습니다.
그러나, 보안이나 서비스 제한 등 운용에 영향을 주는 항목에 관해서는, 경고가 발행되면 즉시 통지되도록 해 두는 것으로, 공유나 대응의 스피드가 빨라진다.
AWS는 Trusted Advisor의 상태 변경을 감지하는 CloudWatch Events를 제공합니다( Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링 ). 따라서 이 CloudWatch Events를 이용하여 알림 시스템을 구축하는 것이 좋다.
AWS Trusted Advisor
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링
Lambda 함수를 만들어 보자!
작업
CloudWatch Events 샘플 JSON 확인
CloudWatch Events의 JSON을 확인하고 통지하는 메시지는 어떻게 할지 생각할 필요가 있다.
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링의 "Trusted Advisor에 대한 CloudWatch 이벤트 규칙을 만들려면:"의 단계를 계속합니다. 아래 그림과 같이 입력합니다.
(나의 경우는 스테이터스가 「OK」일 때는 통지하지 않게 하고 있다.)
샘플 JSON 파일이 표시되므로 복사하여 개발 및 테스트에 사용합니다.
유용한 항목은 개인적으로 다음과 같습니다.
JSON 키 이름
설명
status
변경 후 상태
resource_id
리소스 ID
detail.check-name
체크 항목명
detail.check-item-detail
체크 세부정보
Slack 알림을 위한 코드 작성
실제로 SLack에 통지하기 위한 코드를 작성해 간다.
나는 파이썬에 익숙하기 때문에 파이썬으로 썼다.
필요한 라이브러리 설치
필요한 라이브러리는 requests
로, 미리 pip로 인스톨 해 둔다.
$ pip install requests
$ pip freeze > requirements.txt # デプロイ時に使用
requirements.txtcertifi==2018.8.24
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23
실행 코드
handler.py# -*- coding: utf-8 -*-
import json
import requests
import os
def webhook_icon(status=''):
if status == 'INFO':
return ':information_source:'
elif status == 'WARN':
return ':warning:'
else:
return ':rotating_light:'
def attachement_color(status=''):
if status == 'INFO':
return '#CCCCCC' # 灰
elif status == 'WARN':
return '#FFFF00' # 黄
else:
return '#FF0000' # 赤
def alert(event, _context):
detail = event.get('detail', {})
status = detail.get('status', 'ERROR')
resource = detail.get('resource_id')
check_name = detail.get('check-name')
check_detail = detail.get('check-item-detail')
requests.post(os.getenv('SLACK_WEBHOOK_URL'), data=json.dumps({
"text": "<!channel> *AWS Trusted Advisorのステータス変更を検知しました*",
"icon_emoji": webhook_icon(status=status),
"attachments": [
{
"fallback": check_name,
"color": attachement_color(status=status),
"author_name": "Trusted Advisor",
"author_link": "https://console.aws.amazon.com/trustedadvisor/home?#/dashboard",
"title": check_name,
"fields": [
{
"title": "ステータス",
"value": status,
"short": False
},
{
"title": "リソース",
"value": resource,
"short": False
}
]
},
{
"title": '詳細',
"fallback": check_name,
"color": attachement_color(status=status),
"text": "```\n{0}\n```".format(check_detail)
}
]
}))
Webhook 아이콘은 Trusted Advisor의 상태에 따라
AWS Trusted Advisor는 AWS 인프라의 구성을 최적화하기 위해 '비용 최적화', '서비스 제한', '보안' 등의 항목에 적절한 조언을 해주는 서비스입니다.
예를 들어, RDS 수동 스냅샷의 기본 제한 수는 100이므로 수동 스냅샷 수가 80에 도달하면 AWS Trusted Advisor가 "서비스 제한"항목에 대해 경고합니다.
관리자는 AWS Management Console에서 세부 정보를 확인할 수 있으며 Email에서 주간 점검 결과를 받을 수 있습니다.
그러나, 보안이나 서비스 제한 등 운용에 영향을 주는 항목에 관해서는, 경고가 발행되면 즉시 통지되도록 해 두는 것으로, 공유나 대응의 스피드가 빨라진다.
AWS는 Trusted Advisor의 상태 변경을 감지하는 CloudWatch Events를 제공합니다( Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링 ). 따라서 이 CloudWatch Events를 이용하여 알림 시스템을 구축하는 것이 좋다.
AWS Trusted Advisor
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링
Lambda 함수를 만들어 보자!
작업
CloudWatch Events 샘플 JSON 확인
CloudWatch Events의 JSON을 확인하고 통지하는 메시지는 어떻게 할지 생각할 필요가 있다.
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링의 "Trusted Advisor에 대한 CloudWatch 이벤트 규칙을 만들려면:"의 단계를 계속합니다. 아래 그림과 같이 입력합니다.
(나의 경우는 스테이터스가 「OK」일 때는 통지하지 않게 하고 있다.)
샘플 JSON 파일이 표시되므로 복사하여 개발 및 테스트에 사용합니다.
유용한 항목은 개인적으로 다음과 같습니다.
JSON 키 이름
설명
status
변경 후 상태
resource_id
리소스 ID
detail.check-name
체크 항목명
detail.check-item-detail
체크 세부정보
Slack 알림을 위한 코드 작성
실제로 SLack에 통지하기 위한 코드를 작성해 간다.
나는 파이썬에 익숙하기 때문에 파이썬으로 썼다.
필요한 라이브러리 설치
필요한 라이브러리는 requests
로, 미리 pip로 인스톨 해 둔다.
$ pip install requests
$ pip freeze > requirements.txt # デプロイ時に使用
requirements.txtcertifi==2018.8.24
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23
실행 코드
handler.py# -*- coding: utf-8 -*-
import json
import requests
import os
def webhook_icon(status=''):
if status == 'INFO':
return ':information_source:'
elif status == 'WARN':
return ':warning:'
else:
return ':rotating_light:'
def attachement_color(status=''):
if status == 'INFO':
return '#CCCCCC' # 灰
elif status == 'WARN':
return '#FFFF00' # 黄
else:
return '#FF0000' # 赤
def alert(event, _context):
detail = event.get('detail', {})
status = detail.get('status', 'ERROR')
resource = detail.get('resource_id')
check_name = detail.get('check-name')
check_detail = detail.get('check-item-detail')
requests.post(os.getenv('SLACK_WEBHOOK_URL'), data=json.dumps({
"text": "<!channel> *AWS Trusted Advisorのステータス変更を検知しました*",
"icon_emoji": webhook_icon(status=status),
"attachments": [
{
"fallback": check_name,
"color": attachement_color(status=status),
"author_name": "Trusted Advisor",
"author_link": "https://console.aws.amazon.com/trustedadvisor/home?#/dashboard",
"title": check_name,
"fields": [
{
"title": "ステータス",
"value": status,
"short": False
},
{
"title": "リソース",
"value": resource,
"short": False
}
]
},
{
"title": '詳細',
"fallback": check_name,
"color": attachement_color(status=status),
"text": "```\n{0}\n```".format(check_detail)
}
]
}))
Webhook 아이콘은 Trusted Advisor의 상태에 따라
$ pip install requests
$ pip freeze > requirements.txt # デプロイ時に使用
certifi==2018.8.24
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23
# -*- coding: utf-8 -*-
import json
import requests
import os
def webhook_icon(status=''):
if status == 'INFO':
return ':information_source:'
elif status == 'WARN':
return ':warning:'
else:
return ':rotating_light:'
def attachement_color(status=''):
if status == 'INFO':
return '#CCCCCC' # 灰
elif status == 'WARN':
return '#FFFF00' # 黄
else:
return '#FF0000' # 赤
def alert(event, _context):
detail = event.get('detail', {})
status = detail.get('status', 'ERROR')
resource = detail.get('resource_id')
check_name = detail.get('check-name')
check_detail = detail.get('check-item-detail')
requests.post(os.getenv('SLACK_WEBHOOK_URL'), data=json.dumps({
"text": "<!channel> *AWS Trusted Advisorのステータス変更を検知しました*",
"icon_emoji": webhook_icon(status=status),
"attachments": [
{
"fallback": check_name,
"color": attachement_color(status=status),
"author_name": "Trusted Advisor",
"author_link": "https://console.aws.amazon.com/trustedadvisor/home?#/dashboard",
"title": check_name,
"fields": [
{
"title": "ステータス",
"value": status,
"short": False
},
{
"title": "リソース",
"value": resource,
"short": False
}
]
},
{
"title": '詳細',
"fallback": check_name,
"color": attachement_color(status=status),
"text": "```\n{0}\n```".format(check_detail)
}
]
}))
ERROR
그렇다면 WARN
그렇다면 INFO
그렇다면 하고 있습니다.
또, 통지시의 Slack의 라인의 색을
ERROR
그렇다면 빨간색WARN
그렇다면 노란색INFO
그렇다면 재하고있다.
메시지 작성에서 참고로 한 사이트
Message Formatting
Attaching content and links to messages | Slack
serverless 설정
Serverless Framework에서 AWS Lamda 함수 생성 이라는 기사가 매우 도움이 되었습니다.
serverless의 인스톨등은 이쪽 참고로 해 주시면. .
여기에서는 serverless의 설정 파일
serverless.yml
만 기재한다.service: trusted-advisor
provider:
name: aws
runtime: python3.6
logRetentionInDays: 7 # Lambda関数のログの保持期間は7日とする
stage: prod
region: us-east-1 # リージョンは米国東部 (バージニア北部)にしなければならない
plugins:
# デプロイ前に`npm install serverless-python-requirements`しておく必要あり
# pipでインストールしたパッケージをrequirements.txtに記載しておくことで、デプロイパッケージに含めてくれるプラグイン
- serverless-python-requirements
functions:
alert:
handler: handler.alert
description: Trusted Advisorのステータス変更をSlackに通知する
environment:
SLACK_WEBHOOK_URL: https://hooks.slack.com/services/XXXXXXXXX # Slack WebhookURLを設定
events:
- cloudwatchEvent: # CloudWatch Eventの指定
event:
source:
- "aws.trustedadvisor"
detail-type:
- "Trusted Advisor Check Item Refresh Notification"
detail:
status: # 通知するステータスを指定
- ERROR
- INFO
- WARN
배포
$ serverless deploy -v # ymlの設定間違っていないか確認
$ serverless deploy # デプロイ実行!
Lambda 함수 테스트로 알림 확인
배포가 완료되면 AWS Management Console의 Lambda 페이지에서 샘플 JSON에서 테스트를 실행하고 통보되는지 확인합니다.
상태가
ERROR
이면 다음과 같은 알림이 왔습니다.이것으로 완성.
serverless의 CLoudWatch Events 설정을 사용자 정의하면 알림 조건을 좁힐 수 있으므로,
시도해 보면 좋을지도.
Reference
이 문제에 관하여(Trusted Advisor의 상태 변경을 Slack에 알리는 Lambda 함수를 serverless로 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takmnagaya/items/321f29fee6e6408b15a7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)