この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
先日、AWS Chatbotが一般公開されました。
本記事では、CloudFormationでAWS Chatbotを作成してSlackにCloudWatch Alarmを通知してみます。 CloudWatch AlarmではLambdaのErrorsを監視対象にしました。
手動ポチポチもいいけど、CloudFormationで作るのもいいですよね!
監視対象のLambdaを作成する
適当なLambdaを作成します。関数名はmanulaly-test-function
にしています。絶対にエラーが発生するようにしています。
def lambda_handler(event, context):
raise NotImplementedError('for Lambda Error')
CloudWatch AlarmとSNSトピックを作成する
YAMLの作成
次のYAMLをcloudwatch_alarm.yml
として作成します。
cloudwatch_alarm.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudWatch Alarm Sample Stack
Resources:
# CloudWatchアラーム用のSNSトピック
CloudWatchAlarmForChatbotTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: cloudwatch-alarm-for-chatbot-topic
# CloudWatchアラームの定義
LambdaFunctionErrorsAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: test-lambda-error-for-chatbot-alarm
Namespace: AWS/Lambda
Dimensions:
- Name: FunctionName
Value: manulaly-test-function
MetricName: Errors
ComparisonOperator: GreaterThanOrEqualToThreshold # 閾値以上
Period: 60 # 期間[s]
EvaluationPeriods: 1 # 閾値を超えた回数
Statistic: Maximum # 最大
Threshold: 1 # 閾値
TreatMissingData: notBreaching # Errorsがない場合は良好として扱う
AlarmActions:
- !Ref CloudWatchAlarmForChatbotTopic # アラーム遷移時のアクション
OKActions:
- !Ref CloudWatchAlarmForChatbotTopic # OK遷移時のアクション
Outputs:
CloudWatchAlarmForChatbotTopicArn:
Value: !Ref CloudWatchAlarmForChatbotTopic
Export:
Name: !Sub ${AWS::StackName}-CloudWatchAlarmForChatbotTopicArn
Outputs
でExportさせ、クロススタック参照で後述のYAMLファイルでこのSNSトピックを参照しています。
デプロイ
次のコマンドでデプロイします。
aws cloudformation deploy \
--template-file cloudwatch_alarm.yml \
--stack-name CloudWatchAlarmSampleStack
AWS Chatbotを作成する
Slackワークスペースの認証とワークスペースID取得
WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。
SlackチャンネルIDを取得
任意のチャンネルのリンクを取得します。
このリンクの最後の文字列を使います。下記例だとABCD1234
がチャンネルIDです。
https://classmethod.slack.com/archives/ABCD1234
YAMLの作成
次のYAMLをchatbot.yml
として作成します。ワークスペースIDとチャンネルIDは外部から渡すようにしました。
chatbot.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudWatch Alarm Sample Stack
Parameters:
TargetWorkspaceId:
Type: String
TargetChannelId:
Type: String
Resources:
TestChatbot:
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: TestChatbotForCloudFormation
IamRoleArn: !GetAtt ChatbotIamRole.Arn
LoggingLevel: INFO
SlackChannelId: !Ref TargetChannelId
SlackWorkspaceId: !Ref TargetWorkspaceId
SnsTopicArns:
- Fn::ImportValue: !Sub CloudWatchAlarmSampleStack-CloudWatchAlarmForChatbotTopicArn
ChatbotIamRole:
Type: AWS::IAM::Role
Properties:
RoleName: test-chatbot-iam-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: chatbot.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: test-chatbot-iam-policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- cloudwatch:Describe*
- cloudwatch:Get*
- cloudwatch:List*
Resource:
- "*"
デプロイ
次のコマンドでデプロイします。TargetWorkspaceId
とTargetChannelId
にワークスペースIDとチャンネルIDを指定します。
aws cloudformation deploy \
--template-file chatbot.yml \
--stack-name ChatbotSampleStack \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides TargetWorkspaceId=XYZXYZ TargetChannelId=ABCD1234
手動でチャンネルを追加している場合、このコマンドは失敗するのでご注意ください。
デプロイ完了
下記のようにAWS Chatbotのチャンネル設定ができました。
動作確認する
Lambdaエラーを発生させる
Lambdaを手動実行し、エラー発生させます。
Slackに通知がくる!
エラー発生時に通知が来ました。
OK状態に戻ったときにも通知がきました。バッチリですね!
さいごに
サクッと作れました。AWS Chatbotをどんどん活用していきたいです。