インスタンスのステータスチェック発生時、自動で AWSSupport-ExecuteEC2Rescue が実行されるように実装してみた
はじめに
テクニカルサポートの 片方 です。
インスタンスのステータスチェック に関するお問い合せがある際に、EC2Rescue をご案内することがございます。
EC2Rescue は、Windows Server や Linux Server インスタンスで実行できるトラブルシューティングツールです。このツールを使用すると、OS レベルの問題をトラブルシューティング可能で、詳細なログや設定ファイルを収集して詳細な分析に利用可能です。
今回は、インスタンスのステータスチェック発生に、CloudWatch アラーム + Amazon EventBridge を利用して自動で AWS Systems Manager AWSSupport-ExecuteEC2Rescue Automation ドキュメントを実行したいと思います。
やってみた
EC2Rescue は暗号化されたルート ボリュームを持つインスタンスはサポートされていません。その他にも要件があるのでご自身環境で利用可能であるか確認することをお勧めします。
ロール
ロール名: EventBridge-SystemsManagerAutomationROLL
Amazon EventBridge にアタッチするロールを作成します。信頼関係は以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"ssm.amazonaws.com",
"events.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
カスタマー管理ポリシーと AWS 管理ポリシー: AmazonSSMAutomationRole を作成するロールにアタッチします。
アタッチするカスタマー管理ポリシーは以下を参考にしてください。
ポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction",
"lambda:DeleteFunction",
"lambda:GetFunction",
"lambda:CreateFunction"
],
"Resource": "arn:aws:lambda:*:aws-account-id:function:AWSSupport-EC2Rescue-*",
"Effect": "Allow"
},
{
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::awssupport-ssm.*/*.template",
"arn:aws:s3:::awssupport-ssm.*/*.zip"
],
"Effect": "Allow"
},
{
"Action": [
"iam:CreateRole",
"iam:CreateInstanceProfile",
"iam:GetRole",
"iam:GetInstanceProfile",
"iam:PutRolePolicy",
"iam:DetachRolePolicy",
"iam:AttachRolePolicy",
"iam:PassRole",
"iam:AddRoleToInstanceProfile",
"iam:RemoveRoleFromInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:DeleteInstanceProfile",
"iam:GetRolePolicy",
"iam:TagRole"
],
"Resource": [
"arn:aws:iam::aws-account-id:role/AWSSupport-EC2Rescue-*",
"arn:aws:iam::aws-account-id:instance-profile/AWSSupport-EC2Rescue-*"
],
"Effect": "Allow"
},
{
"Action": [
"ec2:CreateVpc",
"ec2:ModifyVpcAttribute",
"ec2:DeleteVpc",
"ec2:CreateInternetGateway",
"ec2:AttachInternetGateway",
"ec2:DetachInternetGateway",
"ec2:DeleteInternetGateway",
"ec2:CreateSubnet",
"ec2:DeleteSubnet",
"ec2:CreateRoute",
"ec2:DeleteRoute",
"ec2:CreateRouteTable",
"ec2:AssociateRouteTable",
"ec2:DisassociateRouteTable",
"ec2:DeleteRouteTable",
"ec2:CreateVpcEndpoint",
"ec2:DeleteVpcEndpoints",
"ec2:ModifyVpcEndpoint",
"ec2:Describe*",
"ec2:CreateLaunchTemplate",
"ec2:DeleteLaunchTemplate",
"ec2:ModifyInstanceAttribute",
"ec2:DetachVolume",
"ec2:AttachVolume",
"autoscaling:DescribeAutoScalingInstances",
"cloudformation:DescribeStackResource"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
Amazon EventBridge
ルール名 test で作成しました。
イベントパターンを持つルールを選択します。
イベントソースはその他を選択し、下部へスクロールします。
カスタムパターン(JSON エディタ)を選択。プレフィックスマッチングになっていること確認して以下の例を参考に json を記述します。
こちらでは、CloudWatch アラーム名が i-xxxxxxx-StatusCheckFailed_Instance であるならばトリガーされるように * を利用して記述します。完了したら次へ。
{
"source": ["aws.cloudwatch"],
"detail": {
"alarmName": [{
"wildcard": "*-StatusCheckFailed_Instance"
}],
"state": {
"value": ["ALARM"]
}
}
}
以下に設定します。
- AWS のサービス
- Systems Manager オートメーション
- AWSSupport-ExecuteEC2Rescue
自動化パラメータを設定で入力トランスフォーマーを選択し以下の入力パスを記述します。
{
"instance-id": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId"
}
テンプレートには以下の様に記述します。
SubnetId と LogDestination(トラブルシューティングのログをアップロードするアカウントの Amazon S3 バケット名)はオプションです。
{
"UnreachableInstanceId": [
<instance-id>
],
"EC2RescueInstanceType": [
"t3.small"
],
"SubnetId": [
"subnet-xxxxxxxxxxx"
],
"LogDestination": [
"your-s3-bucket name"
]
}
これで、設定は完了です。
検証してみた
Windows Server の EC2 インスタンスで検証しました。マネージドノードにする必要がありますが本ブログでは省かせていただきます。
Amazon EventBridge の設定で CloudWatch アラーム名が i-xxxxxxx-StatusCheckFailed_Instance である場合にトリガーされるように命名します。
次に、インスタンスのステータスチェックを発生させます。
例えば PowerShell で "Disable-NetAdapter -Name "Ethernet 3" -Confirm:$false" コマンドを実行するなど、お好みの方法で発生させます。
または、AWS CLI コマンドの "aws cloudwatch set-alarm-state" より手動で ALARM 状態にしてください。
暫くすると、インスタンスのステータスチェックが発生して、対象の CloudWatch アラームがアラーム状態となりました。
Amazon EventBridge で MatchedEvents と Invocations が発生しました。
その後、AWSSupport-ExecuteEC2Rescue Automation ドキュメントが実行され、Rescue インスタンスの起動と AMI が自動で取得していました。
成功です!
まとめ
本ブログが誰かの参考となれば幸いです。
参考資料
- インスタンスのステータスチェック - Amazon Elastic Compute Cloud
- AWSSupport-ExecuteEC2Rescue - AWS Systems Manager オートメーションランブックリファレンス
- 到達不可能なインスタンスでの EC2Rescue ツールの実行 - AWS Systems Manager
- AmazonSSMAutomationRole - AWS 管理ポリシー
- CloudWatch AlarmですでにALARM状態のアラームでアラームを手動発生させる | DevelopersIO
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。