AWSのEC2インスタンスに組み込まれているステータスチェックのアラームをOpsWorksが提供するChefのレシピで作成する手順です。
EC2インスタンスは障害が発生したときにステータスチェックの失敗を報告して再起動することがあるので、そのチェックのためのアラームです。(ステータスチェックについては https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html?icmpid=docs_ec2_console を参照)
前提条件
- OS: Amazon Linux 2016.09
- OpsWorksのChefのバージョン: 12
SNSトピックの作成
先に通知先のSNSトピックをCloudFormationで作成します。Endpoint
のメールアドレスは適宜読み替えて下さい(AWS::SNS::Topicについては https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html を参照)。 Properties
のTopicName
(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#cfn-sns-topic-name) については指定するとリソースの置き換えが発生したときにエラーが発生する(更新の度に新しい名前を指定する必要がある)のであえて指定しません。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "SNS Topic",
"Resources": {
"AlarmTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"DisplayName": "ステータスチェック失敗の通知",
"Subscription": [
{
"Endpoint": "hoge@example.com",
"Protocol": "email"
}
]
}
}
},
"Outputs": {
"AlarmTopic": {
"Value": {
"Ref": "AlarmTopic"
},
"Description": "Alarm Topic ARN"
}
}
}
トピックSNSのARNをChefレシピのattributesに設定
CloudFormationで作成したスタックのOutputsタブに作成したSNSトピックのARNが表示されるのでここに貼り付けます。(AWSコンソールのCloufFormationの画面から作成したスタックを選択し、Outputsタブをクリックすると表示されます)
default[:sns][:alarm_topic] = "arn:aws:sns:ap-northeast-1:*******************"
アラーム作成のレシピ
awscliを使ってアラームを作成します。
##
#=== data bagsから情報を取得
stack = search(:aws_opsworks_stack).first
instance = search(:aws_opsworks_instance, "hostname:#{node[:hostname]}").first
##
#=== ステータスチェック失敗アラームの作成
execute "Create status check failed alarm" do
command %W{
aws cloudwatch put-metric-alarm
--region "#{stack[:region]}"
--alarm-name "#{stack[:name]} StatusCheckFailed at #{node[:hostname]} > 1"
--alarm-description "[#{stack[:name]}]#{node[:hostname]}(#{instance[:ec2_instance_id]})でステータスチェックに失敗しました。"
--metric-name StatusCheckFailed
--namespace 'AWS/EC2'
--statistic Maximum
--period 300
--threshold 0
--comparison-operator GreaterThanThreshold
--dimensions Name=InstanceId,Value="#{instance[:ec2_instance_id]}"
--alarm-actions #{node[:sns][:alarm_topic]}
--ok-actions #{node[:sns][:alarm_topic]}
--evaluation-periods 1
--unit Count
}.join(' ')
end
参考元
http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html
https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/data-bags.html