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
