본문 바로가기

Cloud-computing/AWS

[AWS]Amazon SNS - Lambda - Slack 알림 설정 방법 with KMS

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