AWS Lambda의 Slack 연동 기능을 사용하여 EC2 인스턴스의 시작 상태를 Slack에서 확인할 수 있습니다.

8389 단어 슬랙람다boto3AWS
Lambda에 Slack 연계 blueprint가 추가되었습니다.
Slack-echo-command와 Cloudwatch-alarm-to-slack의 두 종류가 있습니다. .

할 일은 다음과 같습니다.
  • Slack 측에서 Slash Command의 초기 설정을 실시한다 *
  • Slash Command 의 token 의 암호화를 실시한다 *
  • Lambda 함수 만들기
  • IAM 역할 만들기
  • API 게이트웨이 만들기 *
  • Slash Command에서 API Gateway 엔드포인트 설정 *

  • *가 붙어 있는 부분에 대해서는, 클래스 메소드씨의 블로그 「 【신기능】AWS Lambda에 Slack 제휴의 BluePrint가 등장. ChatOps가 더 쉽게 」를 참고로 했으므로, 이번은 할애하고 싶습니다.

    Lambda 함수 만들기



    이번에는 Python으로 작성하고 싶습니다.
    blueprint "slack-echo-command-python"을 선택하십시오.

    slack_aws.py
    # -*- coding: utf-8 -*-
    
    import boto3
    from base64 import b64decode
    from urlparse import parse_qs
    import logging
    
    ENCRYPTED_EXPECTED_TOKEN = "***" # Enter the base-64 encoded, encrypted Slack command token (CiphertextBlob)
    
    kms = boto3.client('kms')
    expected_token = kms.decrypt(CiphertextBlob = b64decode(ENCRYPTED_EXPECTED_TOKEN))['Plaintext']
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    def lambda_handler(event, context):
        req_body = event['body']
        params = parse_qs(req_body)
        token = params['token'][0]
        if token != expected_token:
            logger.error("Request token (%s) does not match exptected", token)
            raise Exception("Invalid request token")
    
        command_text = params['text'][0]
    
        instances_info = ""
        if command_text == "instances":
            for reservation in boto3.client('ec2').describe_instances()["Reservations"]:
                for instance in reservation["Instances"]:
                    instances_info = instances_info + instance["InstanceId"] + "->" + instance["State"]["Name"] + " "
    
        return instances_info
    

    IAM 역할 만들기


  • EC2의 작동 권한
  • CloudWatchLogs에 대한 Put 권한
  • KMS에 대한 Decrypt 권한
  • {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1448895482556",
          "Action": "ec2:*",
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }
    
    {
             "Version": "2012-10-17",
             "Statement": [
               {
                 "Effect": "Allow",
                 "Action": [
                   "kms:Decrypt"
                 ],
                 "Resource": [
                   "arn:aws:kms:ap-northeast-1:894357485438:key/xxxxxxxx"
                 ]
               }
             ]
    }
    
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "arn:aws:logs:*:*:*"
        }
      ]
    }
    

    테스트




    위와 같이 Slash 명령을 두드리면,


    처럼 인스턴스 ID와 상태를 반환합니다.

    /aws 뒤에 오는 문자열이 command_text 에 들어오므로 그 내용에 따라 반환하는 정보를 변경해 주면 AWS 의 다양한 정보를 Slack 에서 확인할 수 있게 됩니다!

    도전



    1) 타임 아웃 대응



    가끔 아래와 같이 타임 아웃이 발생합니다.



    조사해 보면, 3,000ms 이상 경과하면 타임 아웃이 되는 모양. ( stackoverflow )
    대응하려고 생각하면 할 수 있는 것 같아서, 언젠가 하려고 합니다.

    2) Slack 에 표시하는 인스턴스 정보의 개행



    개행 문자를 돌려주는 것만으로는 좋지 않았습니다.



    대응 방법 아시는 분은 가르쳐 주셨으면합니다.

    요약



    여러가지 모르는 곳도 있습니다만, Lambda 를 사용하는 것으로 간단하게 ChatOps 환경을 만들 수 있다고 생각합니다.
    다음은 Cloudwatch-alarm-to-slack을 사용하여 무언가를 해보고 싶습니다.

    좋은 웹페이지 즐겨찾기