EC2でSTONITH設定してみた

    database

    EC2のSTONITHについてご紹介します。

    STONITHとは ”Shoot the Other Node in the Head” の略で、サーバーがクラスターの一部とみなされなくなったときに、そのサーバーを物理的に停止させたり、電源を切断したりする技術です。フェイルオーバーする時に、電源を切断するためのコマンドが呼び出されます。このコマンドは、コンフィグレーションファイル /opt/LifeKeeper/config/stonith.conf で定義され、ユーザが設定する必要があります。本記事では、EC2インスタンスの電源を切断するためのコマンドの作成からSTONITHの設定方法を紹介します。

    条件

    Amazon EC2 Systems Manager 機能の Run Command を利用します。この機能を利用するにはSystems Manager の前提条件を満たす必要があります。詳細はこちらをご覧ください。

    設定方法

    各々のノードで以下の設定を行ってください。

    1. AWS CLIのインストールと設定

    EC2インスタンスの電源切断に必要な、AWS CLIとそれに必要なソフトウェアをインストールします。インスタンスにログインして以下のコマンドを実行してください。
    参考:AWS CLI のインストールと設定

    curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
    sudo python get-pip.py
    sudo pip install awscli

    また、rootユーザでaws configure コマンドを実行して、AWS Access Key IDとAWS Secret Access Keyを設定してください。以下実行例です。赤字は必須の設定です。

    aws configure
    AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
    AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Default region name [None]: us-west-2
    Default output format [None]: json

    2. Systems Managerのセキュリティロールの設定

    EC2インスタンスのIAMロールとコマンドを実行するユーザの両方にSystems Manager APIと通信できる権限を設定します。コマンドを実行するユーザは管理者権限があるものとします。EC2インスタンスのIAMロールの設定は以下の通りです。
    参考:Systems Manager のセキュリティロールを設定する

    1. IAMコンソール https://console.aws.amazon.com/iam/ を開きます。
    2. ナビゲーションペインで [Roles] を選択し、続いて [Create New Role] を選択します。
    3. [Select role type] ページで、[AWS Service Role] の下にある [Amazon EC2] セクションの [Select] を選択します。
    4. [Attach Policy] ページで、[AmazonEC2RoleforSSM] の横にあるオプションを選択し、続いて [Next Step] を選択します。
    5. [Set role name and review] ページの [Role name] ボックスに名前を入力し、続いて説明を入力します。
      注記:ロール名を書き留めます。このロール名は、Systems Managerを使用して管理するインスタンスを新しく作成する際に指定します。
    6. [Create Role] を選択します。システムでは、[Roles] ページが返されます。

    次に、EC2インスタンスに先ほど作成したIAMロールを割り当てます。

    1. EC2コンソール https://console.aws.amazon.com/ec2/ を開きます。
    2. ナビゲーションペインでInstancesを選択し、続いてロールをアタッチするインスタンスを選択します。
    3. [Actions] を選択し、[Instance Settings] を選択して、ドロップダウンリストから [Attach/Replace IAM role] を選択します。
    4. [Attach / Replace IAM role] ページから、先ほど作成したロールをドロップダウンリストから選択します。
    5. IAMロールを選択したら、[Apply] を選択して次のステップに進みます。

    3. SSMエージェントのインストール

    Run Command 要求を処理するために、SSMエージェントをインストールします。以下はRHEL7.xの場合です。他のOSの場合は、参考に記載のページをご確認ください。
    参考:SSM エージェントのインストール

    mkdir /tmp/ssm
    sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
    sudo systemctl enable amazon-ssm-agent
    sudo systemctl start amazon-ssm-agent
    sudo systemctl status amazon-ssm-agent

    注記:OS起動時に自動でサービスが起動するように設定してください。

    4. Run Commandの確認

    ここまでの設定で、Run Commandが使用できます。こちらを参考に、インスタンスにログインせずにコマンドが実行できるか確認してください。[Command document]では、”AWS-RunShellScript”を選択してください。

    5. EC2用STONITHコマンドの作成

    EC2電源切断用のコマンドec2-stonith.shを作成します。ここでは、/root/binディレクトリに作成するものとします。

    /root/bin/ec2-stonith.sh
    #!/bin/sh

    instance="--instance-ids $1"
    region="${2:+--region $2}"

    aws ssm send-command --document-name AWS-RunShellScript $instance --parameters '{"commands":["dohalt() { sleep 1; echo o > /proc/sysrq-trigger; }","echo 1 > /proc/sys/kernel/sysrq","dohalt &","echo shutoff the system"],"executionTimeout":["10"]}' --timeout-seconds 30 $region
    sleep 1
    aws ec2 stop-instances $instance --force $region
    sleep 1
    aws ec2 stop-instances $instance --force $region

    注記:実行権限を付けてください。

    以下の通りコマンドを呼び出し、EC2が停止するか確認してください。

    /root/bin/ec2-stonith.sh <停止させたいインスタンスID> <リージョン>

    6. STONITHの設定

    以下のコマンドを実行して、LifeKeeper STONITHスクリプトをインストールしてください。そして、設定ファイルstonith.confを編集してください。詳細はLifeKeeperのマニュアルを参照ください。

    /opt/LifeKeeper/samples/STONITH/stonith-install

    /opt/LifeKeeper/config/stonith.conf
    # LifeKeeper STONITH configuration

    <ノードAホスト名> /root/bin/ec2-stonith.sh <ノードAインスタンスID> <リージョン>
    <ノードBホスト名> /root/bin/ec2-stonith.sh <ノードBインスタンスID> <リージョン>
    ・・・

     

    以上でEC2 STONITHの設定は完了です。

     

    お問い合わせ

    弊社はAWSに限らずパブリッククラウド、仮想環境、物理環境に対応したHAクラスターソフトウェア「LifeKeeper」を提供しています。

    設定や構成で何かご相談されたいことがございましたら、お気軽に以下よりお問い合わせください。