こんにちは。NTTテクノクロスの増田です。
普段はAWSを用いたインフラ構築を行っています。
はじめに
本記事では、以前ご紹介したEC2インスタンスの夜間停止自動化処理にリトライ機能を追加した作業をご紹介いたします。
背景
以前、EC2インスタンスの夜間停止自動化作業をご紹介したのですが、構築から数か月後、問題が発生しました。
“Request Limit Exceeded” エラー
構築から数か月後、インスタンスの増加に伴い、停止処理実行時に "Request Limit Exceeded" エラーが頻発するようになりました。
このエラーは、指定した時間に多数の停止処理APIが実行されることで、リクエスト制限がかかるために発生します。
その結果、一部のインスタンスが停止に失敗していたため、SSMドキュメントを改修し、停止に失敗したインスタンスのみにリトライ処理を行う機能を追加しました。
構築手順
今回は、こちらでご紹介したリソースの改修をベースに構築します。全体の構築手順はそちらをご参考ください。
System Manager
SSMドキュメント
- 新規のSSMドキュメントを作成していきます
- マネジメントコンソール > System Manager > ドキュメント > ドキュメントの作成 > オートメーション を順に選択します
- 鉛筆マークを選んで"ドキュメント名"を編集、"{} コード"を選択後、コードを記載し、"ランブックを作成" を選択します
- "ドキュメント”のコードは以下を参考にしてください
sample.yaml
description: Stop EC2 instances(s)
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
InstanceId:
type: StringList
description: (Required) EC2 Instance(s) to stop
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ''
mainSteps:
- name: stopInstances
action: aws:changeInstanceState
isEnd: true
onFailure: step:Sleep
inputs:
InstanceIds: '{{ InstanceId }}'
DesiredState: stopped
- name: Sleep
action: aws:sleep
nextStep: forceStopInstances
isEnd: false
inputs:
Duration: PT5M
- name: forceStopInstances
action: aws:changeInstanceState
isEnd: true
inputs:
InstanceIds: '{{ InstanceId }}'
CheckStateOnly: false
DesiredState: stopped
Force: true
- 続いて、以前作成したドキュメントを改修します
- マネジメントコンソール > System Manager > ドキュメント > 自己所有 > 以前作成したドキュメント を順に選択します
- [以前作成したドキュメント] ページで、アクション > 新しいバージョンを作成する を順に選びます
- "{} コード"を選択後、コードを変更し、新しいバージョンを作成 > 新しいデフォルトバージョンを作成 を選択します
- ドキュメントのコードは以下を参考にしてください
- キャプチャは "assumeRole" の設定が正しくないため、適切なロールの ARN を設定してください(改修する場合は、既存の設定を維持してOK)
- "document_name"は先ほど作成したドキュメント名を記載してください
sample.yaml
description: StopEC2Instances
schemaVersion: '0.3'
assumeRole: arn:aws:iam::${AWS::AccountId}:role/<IAM_roles_name>
mainSteps:
- name: StopEC2Instances
action: aws:executeAwsApi
isEnd: true
inputs:
Service: ssm
Api: StartAutomationExecution
DocumentName: <document_name>
TargetParameterName: InstanceId
Targets:
- Key: tag:StopInstance
Values:
- 'true'
まとめ
以上、インスタンス停止自動化処理にリトライ機能を追加した作業についてでした。
Request Limit Exceeded エラーには過去何度か苦しめられてきたため、今後はこうした事態を想定し、初期構築の段階から対策を講じていきたいですね。