Datadog × API Gateway × Lambda × AWS Systems Manager でプロセスの再起動を自動化する
監視していたサーバーで何らかの障害が発生した際などに、取り急ぎWebサーバーを自動的に再起動したいというケースはよくあることかと思う。
つい先日も、 Application Load Balancer
からのヘルスチェックが、 healthy
と unhealthy
を繰り返す状況が発生し、 apache
の再起動で正常復旧したことがあった。
以前、下記のブログエントリーにて、 EC2ノード上で走っているはずのnginxプロセスが止まっていた場合、自動で再起動する
ということをやった。
Datadog × API Gateway × Lambdaでプロセスの再起動を自動化する | MMMブログ
その際には、 AWS Lambda
からSSHで再起動コマンドを実行した。
今回は、そのSSHで実行した部分を、 AWS Systems Manager を使用して行ってみたいと思う。
今回は、
apache
のプロセスダウンをDatadog
で検知Datadog
→API Gateway
へWebhook
実行API Gateway
→Lambda
実行Lambda
からAWS Systems Manager
経由で、apache
再起動コマンド実行
という流れでやってみる。
EC2の準備
まずは、EC2インスタンス作成をする。
この際に、注意する必要があるのは、 AWS Systems Manager
を実行できる IAM
ロールを付与してやること。
今回は、AWS 管理ポリシー AmazonSSMManagedInstanceCore
を使って、下記のようにロールを作成、EC2に付与している。
作成したロールをEC2に付与。
【参考】
ステップ 4: Systems Manager の IAM インスタンスプロファイルの作成 - AWS Systems Manager
apache
と Datadog
のエージェントをインストールしておく。
apache
のプロセス監視は、設定が必要なため以下のように設定ファイルをコピー、編集する。
cp /etc/datadog-agent/conf.d/process.d/conf.yaml.example /etc/datadog-agent/conf.d/process.d/conf.yaml
vi /etc/datadog-agent/conf.d/process.d/conf.yaml
下記のように設定する。
- name: httpd
search_string: ['httpd']
設定後に、
systemctl restart datadog-agent
でエージェントの再起動を行う。
API Gatewayを作成
API Gateway
を作成する。
手順等は、 こちら と同じなので、割愛。
Lambdaファンクションを作成
Lambda
ファンクションを作成する。Python 3.6
での実装。
import boto3
import logging
import os
logger = logging.getLogger()
logger.setLevel(logging.INFO)
INSTANCE_ID = os.environ['INSTANCE_ID']
def lambda_handler(event, context):
ssm = boto3.client('ssm')
res = ssm.send_command(
InstanceIds=[INSTANCE_ID],
DocumentName="AWS-RunShellScript",
Parameters={
"commands": [
"systemctl restart httpd"
],
"executionTimeout": ["60"]
},
)
if res['ResponseMetadata']['HTTPStatusCode'] != 200:
print('FAILED to execute ssm.send_command().')
return
{
'message': "script completed."
}
commands
のところで、 apache
再起動コマンドの "systemctl restart httpd"
を指定している。
環境変数に、作成したEC2のインスタンスIDを設定する。
今回は最低限の実装にしているが、成功時や失敗時に Slack
通知なども追加した方が、運用する際には便利かと思う。
Datadog設定
Datadog
コンソールから Webhooks Integration
を作成する。
URLに、先ほど作成した、 API Gateway
のURLを入力する。
Datadog
のプロセス監視のアラート設定する。
Pick a Process
に Httpd
を選択。
アラート通知先に作成した Webhook
を選択。
動作確認
apache
を停止する。
しばらくすると、 Datadog
でアラートがあがり、その後期待通り AWS Systems Manager
経由で、 apache
再起動コマンド実行されて、自動的にアラート復旧まで動作した。
まとめ
Datadog × API Gateway × Lambda × AWS Systems Manager
でプロセスの再起動を自動化をやってみた。Lambda
からSSHでプロセス再起動する方法と比べると、
- セキュリティグループでSSHポートを外に開放しなくていい
というメリットがある。
手順もSSH接続する場合より簡単だった。
障害発生時の定型的なオペレーションは、自動化することで、オペレーションミスもなくせるというメリットもあるので、今後も積極的に行っていきたい。
参考
- Datadog × API Gateway × Lambdaでプロセスの再起動を自動化する | MMMブログ
- Session Manager 使えば踏み台サーバーが不要に | MMMブログ
- ステップ 4: Systems Manager の IAM インスタンスプロファイルの作成 - AWS Systems Manager