インスタンスのステータスチェック発生時、自動で AWSSupport-ExecuteEC2Rescue が実行されるように実装してみた

インスタンスのステータスチェック発生時、自動で AWSSupport-ExecuteEC2Rescue が実行されるように実装してみた

Clock Icon2024.07.17

はじめに

テクニカルサポートの 片方 です。
インスタンスのステータスチェック に関するお問い合せがある際に、EC2Rescue をご案内することがございます。
EC2Rescue は、Windows Server や Linux Server インスタンスで実行できるトラブルシューティングツールです。このツールを使用すると、OS レベルの問題をトラブルシューティング可能で、詳細なログや設定ファイルを収集して詳細な分析に利用可能です。

https://docs.aws.amazon.com/ja_jp/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-executeec2rescue.html

今回は、インスタンスのステータスチェック発生に、CloudWatch アラーム + Amazon EventBridge を利用して自動で AWS Systems Manager AWSSupport-ExecuteEC2Rescue Automation ドキュメントを実行したいと思います。

やってみた

EC2Rescue は暗号化されたルート ボリュームを持つインスタンスはサポートされていません。その他にも要件があるのでご自身環境で利用可能であるか確認することをお勧めします。  
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html

ロール

ロール名: 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 で作成しました。
イベントパターンを持つルールを選択します。

画像2

イベントソースはその他を選択し、下部へスクロールします。

画像3

カスタムパターン(JSON エディタ)を選択。プレフィックスマッチングになっていること確認して以下の例を参考に json を記述します。
こちらでは、CloudWatch アラーム名が i-xxxxxxx-StatusCheckFailed_Instance であるならばトリガーされるように * を利用して記述します。完了したら次へ。

{
  "source": ["aws.cloudwatch"],
  "detail": {
    "alarmName": [{
      "wildcard": "*-StatusCheckFailed_Instance"
    }],
    "state": {
      "value": ["ALARM"]
    }
  }
}

画像4

以下に設定します。

  • AWS のサービス
  • Systems Manager オートメーション
  • AWSSupport-ExecuteEC2Rescue

画像5

自動化パラメータを設定で入力トランスフォーマーを選択し以下の入力パスを記述します。

{
  "instance-id": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId"
}

画像6

テンプレートには以下の様に記述します。
SubnetId と LogDestination(トラブルシューティングのログをアップロードするアカウントの Amazon S3 バケット名)はオプションです。

{
    "UnreachableInstanceId": [
        <instance-id>
    ],
    "EC2RescueInstanceType": [
        "t3.small"
    ],
    "SubnetId": [
        "subnet-xxxxxxxxxxx"
    ],
    "LogDestination": [
        "your-s3-bucket name"
    ]
}

画像7

これで、設定は完了です。

検証してみた

Windows Server の EC2 インスタンスで検証しました。マネージドノードにする必要がありますが本ブログでは省かせていただきます。
Amazon EventBridge の設定で CloudWatch アラーム名が i-xxxxxxx-StatusCheckFailed_Instance である場合にトリガーされるように命名します。

画像9

次に、インスタンスのステータスチェックを発生させます。
例えば PowerShell で "Disable-NetAdapter -Name "Ethernet 3" -Confirm:$false" コマンドを実行するなど、お好みの方法で発生させます。
または、AWS CLI コマンドの "aws cloudwatch set-alarm-state" より手動で ALARM 状態にしてください。

https://dev.classmethod.jp/articles/raise-an-alarm-again-with-an-alarm-already-in-alarm-state-in-cloudwatch-alarm/

暫くすると、インスタンスのステータスチェックが発生して、対象の CloudWatch アラームがアラーム状態となりました。
Amazon EventBridge で MatchedEvents と Invocations が発生しました。

画像11

その後、AWSSupport-ExecuteEC2Rescue Automation ドキュメントが実行され、Rescue インスタンスの起動と AMI が自動で取得していました。
画像10

画像12

成功です!

まとめ

本ブログが誰かの参考となれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.