Amazon SNS → AWS Lambda → Slack → AWS Chatbot에서 AWS 명령 실행

AWS로부터 Slack상에서 AWS명령을 실행할 수 있다는 발표가 있었으므로, 직접 입력이 아닌 다른 서비스로부터의 기입으로도 대응하고 있는지 확인해 보았다.



사전 준비는 건너뜁니다



Slack과 AWS Chatbot의 연결 설정 등은 본가 사이트에 있으므로 건너뜁니다.

Lambda 구현



이런 느낌의 간단한 것
import json
import os
import logging
import urllib.request

logger = logging.getLogger(__name__)

SLACK_URL = os.environ['SLACK_URL']

def lambda_handler(event, context):
    logger.info('Start Slack message sending.')
    message = event['Records'][0]['Sns']['Message']

    params = {
        "text": message,
        "icon_emoji": ":heavy_exclamation_mark:"
    }
    text = "payload=" + json.dumps(params)
    request = urllib.request.Request(
        SLACK_URL, 
        data = text.encode("utf-8"), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response = response.read().decode("utf-8")
        return response
message 변수에는 SNS에서 보낸 메시지가 들어 있으므로이를 추출합니다. 이벤트에 저장된 SNS의 데이터는 다음과 같습니다.
{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "ARN内容",
      "Sns": {
        "Type": "Notification",
        "MessageId": "メッセージID",
        "TopicArn": "SNSのトピックARN",
        "Subject": "タイトル",
        "Message": "メッセージ内容",
        "Timestamp": "送付時刻",
        "SignatureVersion": "1",
        "Signature": "XXX",
        "SigningCertUrl": "https://XXX",
        "MessageAttributes": {}
      }
    }
  ]
}

SNS측 설정



다음과 같은 SNS 설정을 하여 Lambda에 정보를 흘리도록 한다. (매우 간단하고 특별한 설정은 없습니다)



메시지를 SNS에서 보냅니다.



다음과 같은 메시지를 SNS에서 Publish해 봅니다.
<@aws> help

<XXX> 는 Slack에서 멘션을 보낼 때의 기법.

잠시 후 Slack 측에 메시지가 게시되고 AWS 명령의 게시 결과가 반환되었습니다.



요약



간단하지만 AWS Chatbot을 통해 AWS 명령을 발행하는 것은 Slack에 다른 서비스에서 쓰는 것도 가능하다는 것을 알았습니다. Slack -> AWS Chatbot -> AWS 명령 발행 가능성도 확산되었습니다.

좋은 웹페이지 즐겨찾기