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から送られてきたメッセージが入っているので、それを抽出しています。eventに格納される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コマンド発行の可能性がまた広がりました。