プレイヤーズ・ハイ

 雑多な日記

EC2 Auto Recovery の雑なまとめ

【目次】

Auto Recovery の流れ

  • 対応しているインスタンスタイプのインスタンスを起動する

  • Create Status Check Alarm

    • Whenever で Status Check Failed を選択して Create Alarm をクリック
  • CloudWatch に作成されているアラームを確認

    • +EC2 Action, Recover this instance
  • CloudWatch アラームのパラメーターを決める

    • 何秒間隔で: 60 秒 ( = 1 ピリオド)
    • 何ピリオド: 1 ピリオド
    • 何回失敗したら: 1 回

前提条件 (対応しているインスタンスタイプなど)

  • Use a C3, C4, M3, M4, R3, T2, or X1 instance type
  • Run in a VPC (not EC2-Classic)
  • Use shared tenancy (the tenancy attribute is set to default)
  • Use EBS volumes, including encrypted EBS volumes (not instance store volumes)

aws-cli で Auto Recovery (用の CloudWatch アラームを) 作成

こんなコマンドをたたくと Auto Recovery が設定されます.

$ ar_instance_id='i-0123456789abcdefg'

$ aws cloudwatch \
    put-metric-alarm \
    --alarm-name StatusCheckFailed_System-Alarm-for-"${ar_instance_id}" \
    --metric-name StatusCheckFailed_System \
    --namespace AWS/EC2 \
    --statistic Minimum \
    --dimensions Name=InstanceId,Value="${ar_instance_id}" \
    --unit Count \
    --period 60 \
    --evaluation-periods 1 \
    --threshold 1 \
    --comparison-operator GreaterThanOrEqualToThreshold \
    --alarm-actions arn:aws:automate:ap-northeast-1:ec2:recover

【追記】 --statistic Maximum から --statistic Minimum に変更.AWS の推奨だから

docs.aws.amazon.com

また上記リンク先内に

Important
再起動と復旧アクションの競合状態を避けるには、EC2 インスタンスを復旧させるアラームを作成するときに、アラームのしきい値として 1 分に代えて 2 分を設定することをお勧めします。

とあるが,これはあくまで「再起動」と「復旧」の2つのアラームが存在する場合の推奨であり,「復旧」アラームのみであれば 1 分でもよい.

注意点など


【訂正: 2017 年 1 月 9 日 追記】

以下の「IAM ロールと IAM ユーザー」のセクションは無視してください.

以前は,IAM ロールの権限で Auto Recovery のアラームを作成すると,アラームを設定した際に一時的な認証情報が使用されていました.そして,リカバリーアクション発動時に,一時的な認証情報を再度利用しようとし,一時的な認証情報のため,それでは処理が実行できずエラーが発生していたが,現在は対応され,IAM ロールの権限で Auto Recovery のアラームを作成しても,問題なくリカバリーアクションが実行されます.

IAM ロールと IAM ユーザー

IAM ロールを使うとアラームの作成自体は問題なく終了するが,recover アクションが動かないので IAM ユーザーを作り適切な権限を付与し,そちらのプロファイルを使ってアラームを作成する.

  • Auto Recovery 用 CloudWatch アラームを作成する用の IAM ユーザーを作成
cw_alarm_for_auto_recovery
Access Key ID:
A*******************
Secret Access Key:
x***************************************
  • 権限付与, 可能な限り絞った方がよいが,手っ取り早く PowerUserAccess を付与

  • Auto Recovery 用 CloudWatch アラームを作成する aws コマンドを発行する Linux ユーザー配下に credentials を設定

$ aws configure --profile cw_alarm_for_auto_recovery
AWS Access Key ID [None]: A*******************
AWS Secret Access Key [None]: x***************************************
Default region name [None]: ap-northeast-1
Default output format [None]:

$ cat ~/.aws/config
[default]
region = ap-northeast-1
[profile cw_alarm_for_auto_recovery]
region = ap-northeast-1

$ cat ~/.aws/credentials
[cw_alarm_for_auto_recovery]
aws_access_key_id = A*******************
aws_secret_access_key = x***************************************

$ aws configure list
Name                    Value             Type    Location
----                    -----             ----    --------
profile                <not set>             None    None
access_key     ****************NVVA         iam-role
secret_key     ****************O0pW         iam-role
region           ap-northeast-1      config-file    ~/.aws/config
  • Auto Recovery 用 CloudWatch アラームを作成

  • $ aws cloudwatch put-metric-alarm コマンドに,オプション --profile cw_alarm_for_auto_recovery を付与

System Status Check の失敗をどうやってテストするか

set-alarm-state を使っても,インスタンス復旧のアクションが実行される前に確認のためのヘルスチェックが再度実行が走るため,疑似障害は起こせない.

そのため,アラームの発火条件を ALARM is INSUFFICIENT にして,インスタンスを止めてテストする.

【追記】 以下のブログによると recover はテストできない模様. terminate はテストできました.

www.simpline.co.jp

recover を実行するアラームを作成する場合,IAM ロールによる実行許可が使用できない. root アカウントまたは必要な権限を付与した IAM ユーザーでアラームを作成する必要がある.

  • recover に必要な権限
    • ec2:DescribeInstanceStatus
    • ec2:DescribeInstances
    • ec2:DescribeInstanceRecoveryAttribute
    • ec2:RecoverInstances

詳細は以下

docs.aws.amazon.com

抜粋

アクセス許可

AWS Identity and Access Management (IAM) ユーザーの場合、アラームを作成または変更するには次のアクセス権限が必要です。

ec2:DescribeInstanceStatus と ec2:DescribeInstances。Amazon EC2 インスタンスステータスメトリクスに対するすべてのアラーム用。
ec2:StopInstances。停止アクションを含むアラーム用。
ec2:TerminateInstances。終了アクションを含むアラーム用。
ec2:DescribeInstanceRecoveryAttribute と ec2:RecoverInstances。復旧アクションを含むアラーム用。

インラインポリシーの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1478745555000",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceRecoveryAttribute",
                "ec2:RecoverInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Stmt1478745582000",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricAlarm"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

Auto Recover ありのインスタンス ID 一覧取得

$ aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName==`StatusCheckFailed_System`].Dimensions' | grep Value | cut -d ':' -f 2-2 | sed 's/ //' | sed 's/"//g'
  • 既存インスタンスで Auto Recovery なしのものにすべて付与するシェルスクリプトの作成とテスト 全インスタンスのインスタンス ID - Auto Recovery ありのインスタンス ID = まだ Auto Recovery のないインスタンスのインスタンス ID リスト これを while ループに食わせて一気に作成

  • 指定したインスタンス ID の EC2 インスタンスに Auto Recovery を付与するシェルスクリプトの作成とテスト 手動でインスタンス ID のリストを作成し, これを while ループに食わせて一気に作成