Architecture
수신 Webhook 추가
https://multi-cloudhq.slack.com/apps/A0F7XDUAZ--?tab=more_info
<https://hooks.slack.com/services/T01P8GA78P8#중략
테스트
curl -X POST --data-urlencode "payload={\\"channel\\": \\"#gke-prometheus\\", \\"username\\": \\"webhookbot\\", \\"text\\": \\"이 항목은 #개의 gke-prometheus에 포스트되며 webhookbot이라는 봇에서 제공됩니다.\\", \\"icon_emoji\\": \\":ghost:\\"}" <https://hooks.slack.com/services/T01P8GA78P8#중략
KMS 생성
create kms key
dewble@:~$ aws kms create-key --region ap-northeast-2
{
"KeyMetadata": {
"AWSAccountId": "74364",
"KeyId": "5f90c4a4-b1a2-459b-ae1c-b1e2ec90bfa5",
"Arn": "arn:aws:kms:ap-northeast-2:74364:key/5f90c4a4-b1a2-459b-ae1c-b1e2ec90bfa5",
"CreationDate": "2022-07-27T09:53:26.609000+09:00",
"Enabled": true,
"Description": "",
"KeyUsage": "ENCRYPT_DECRYPT",
"KeyState": "Enabled",
"Origin": "AWS_KMS",
"KeyManager": "CUSTOMER",
"CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
"KeySpec": "SYMMETRIC_DEFAULT",
"EncryptionAlgorithms": [
"SYMMETRIC_DEFAULT"
],
"MultiRegion": false
}
}
kms alias
dewble@:~$ aws kms create-alias --alias-name "alias/SlackKey2" --target-key-id "5f90c4a4-b1a2-459b-ae1c-b1e2ec90bfa5" --region ap-northeast-2
- 위에서 생성한 kms의 KeyId 입력
Slack 알림 추가 구성
Lambda 함수 생성
함수 생성
- 블루프린트 사용: cloudwatch-alarm-to-slack-python
구성
- 실행 역할 설정
- SNS 트리거 설정 (위 경보에서 생성한 SNS)
환경 변수 작성
- 위에서 생성한 slack webhook url과 webhook을 추가한 slack channel을 입력한다.
channel: #gke-prometheus
webhook: <https://hooks.slack.com/services/T01P8GA78P8#중략
- 위에서 생성한 KMS key를 이용하여 HookUrl만 암호화를 진행한다.
There are 2 ways to encrypt slack url after creating Lambda
1. aws console
- Lambda 함수 생성 후 환경 변수 편집을 통해 암호화를 진행한다.
2. aws cli
- cli로 hookurl을 암호화한뒤 위와 동일하게 환경 변수 편집을 통해 입력한다.
aws kms encrypt --key-id alias/SlackKey2 --cli-binary-format raw-in-base64-out --plaintext "hooks.slack.com/services/T01P8GA78P8/#중략" --region ap-northeast-2
{
"CiphertextBlob": "AQICAHjO0ZpxuoykmY/DR+FbYx6umFbL3UYhdVKEf/KPFhkWfgEHeng8dG5HTEtXY5iicSY3#중략",
"KeyId": "arn:aws:kms:ap-northeast-2:743647085036:key/5f90c4a4-b1a2-459b-ae1c-b1e2ec90bfa5",
"EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}
일반 구성 - 제한시간 변경
- 제한 시간 3초 → 10초
- 실행 시간이 3초 이상 걸린다
Edit IAM Role Policy
Lambda를 만들며 생성한 Role에 권한을 추가한다.
권한 추가
- 정책 연결
- CloudWatchReadOnlyAccess
- 인라인 정책
- Resource → Create KMS key 과정에서 생긴 Arn
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1443036478000",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:ap-northeast-2:743647:key/5f90c4a4-b1a2-459b-ae1c-b1e2ec90bfa5"
]
}
]
}
확인
알람 테스트
테스트 코드 참고
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Sns": {
"Type": "Notification",
"MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"TopicArn": "arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms",
"Subject": "ALARM: \\"Example alarm name\\" in EU - Ireland",
"Message": "{\\"AlarmName\\":\\"Example alarm name\\",\\"AlarmDescription\\":\\"Example alarm description.\\",\\"AWSAccountId\\":\\"000000000000\\",\\"NewStateValue\\":\\"ALARM\\",\\"NewStateReason\\":\\"Threshold Crossed: 1 datapoint (10.0) was greater than or equal to the threshold (1.0).\\",\\"StateChangeTime\\":\\"2017-01-12T16:30:42.236+0000\\",\\"Region\\":\\"EU - Ireland\\",\\"OldStateValue\\":\\"OK\\",\\"Trigger\\":{\\"MetricName\\":\\"DeliveryErrors\\",\\"Namespace\\":\\"ExampleNamespace\\",\\"Statistic\\":\\"SUM\\",\\"Unit\\":null,\\"Dimensions\\":[],\\"Period\\":300,\\"EvaluationPeriods\\":1,\\"ComparisonOperator\\":\\"GreaterThanOrEqualToThreshold\\",\\"Threshold\\":1.0}}",
"Timestamp": "2017-01-12T16:30:42.318Z",
"SignatureVersion": "1",
"Signature": "Cg==",
"SigningCertUrl": "<https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem>",
"UnsubscribeUrl": "<https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>",
"MessageAttributes": {}
}
}
]
}
SNS 트리거 이후 알람 확인
참고 문서
[1] Amazon SNS 설정 https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/US_SetupSNS.html
[2] CloudWatch Logs Insights 쿼리 구문 https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
[3] Amazon SNS 메시지 Slack에 게시 https://aws.amazon.com/ko/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams/
[4] AWS KMS https://docs.aws.amazon.com/ko_kr/kms/latest/developerguide/monitoring-cloudwatch.html
[5] https://longtermsad.tistory.com/49
'Cloud-computing > AWS' 카테고리의 다른 글
[AWS]Instance Scheduler on AWS (0) | 2022.12.04 |
---|---|
[AWS]Amazon SNS을 사용하여 CloudWatch Log Alerting (0) | 2022.09.25 |
[AWS]통합 CloudWatch 에이전트를 사용하여 CloudWatch Logs 시작하기 (0) | 2022.08.23 |
[AWS]AWS CLI 자동완성 설정(AWS CLI Enable Auto Completion) (0) | 2022.07.03 |
[AWS]Install AWS CLI in Ubuntu (0) | 2022.07.03 |