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 の推奨だから
また上記リンク先内に
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 はテストできました.
recover を実行するアラームを作成する場合,IAM ロールによる実行許可が使用できない. root アカウントまたは必要な権限を付与した IAM ユーザーでアラームを作成する必要がある.
- recover に必要な権限
- ec2:DescribeInstanceStatus
- ec2:DescribeInstances
- ec2:DescribeInstanceRecoveryAttribute
- ec2:RecoverInstances
詳細は以下
抜粋
アクセス許可 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 ループに食わせて一気に作成