■概要
単純な内容ですが、Lambda+EventBridgeを使ったEC2インスタンスの自動再起動を設定します。
停止起動ではなく再起動ですが、停止起動でもほとんど工程は変わらないかと思います。
どなたかのお役に立てば。
■今からやる事
EC2インスタンスを毎週朝8時に再起動(reboot)する設定を行います。
以下の4つです。
1.Lambda関数を作成
2.関数用のポリシーを作成
3.EventBridgeのルール作成
4.実行確認
■lambda関数を作成
まず初めに関数の作成ですが、名称は「EC2_Reboot」としました。
ランタイムは「python3.9」です。
この時、実行ロールを「基本的な Lambda アクセス権限で新しいロールを作成」で設定すると、下記のようなロールが自動生成されます。
「EC2_Reboot-role-xxxxxx」
ちなみに上記ロールに紐づくポリシーは「AWSLambdaBasicExecutionRole-xxxxxxxxxxxxxxxxxxxxxx」というポリシーで中身はCloudWatch Logsに関わるものでした。
(恐らくこれがないと実行メトリクスが見れない為、注意)
■関数の中身
関数の中身ですが、以下のようなシンプルなものにしました。
実行後のログのPUT等も行いません。
インスタンスIDは任意のものを指定してください。
import boto3
client = boto3.client('ec2')
def lambda_handler(event, context):
client.reboot_instances(
InstanceIds=[
'i-xxxxxxxxxxxxxx',
],
)
ログストリームへの送信を行う場合は下記が参考になります!
Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge
■関数用IAMポリシー
関数作成時にロールが自動生成されましたが、インスタンスを再起動する為には別途ポリシーが必要になります。
適したポリシーをロールへアタッチしましょう。
今回はポリシー作成にて、以下のような特定のインスタンスのみの再起動を行う最小限のポリシーを作成し、アタッチしました。
(000000000000の部分はAWSアカウントID、i-xxxxxxxxxxxxxxxはインスタンスIDを指定)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:RebootInstances",
"Resource": "arn:aws:ec2:*:000000000000:instance/i-xxxxxxxxxxxxxxx"
}
]
}
■Event bridge ルール
最後に関数実行のトリガーとなるEvent bridge ルールです。
以下の例では、毎週朝8時となるように設定しています。
ターゲット選択画面ではlambda関数を選択し、先ほど作成した関数を指定します。
これで完了です!
■再起動されるか確認
関数の実行自体は関数内にあるメトリクスより確認が可能です。
その他、インスタンスの再起動についてはコンソール上では分かりずらい?かと思います。
再起動実行後のインスタンスへ接続し、下記のコマンドを実行する事で確認可能です。
$ last reboot
【 last 】コマンド――システムのログイン履歴を一覧表示する
https://atmarkit.itmedia.co.jp/ait/articles/1903/22/news031.html
■最後に
個人的にはSSMを使用した自動再起動を試したかったんですが、既存ドキュメントにはないのでやるなら少し工夫が必要そうです。
停止、起動であればあるみたいなので是非参考に!
参考:
Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge
Systems Manger のメンテナンスウィンドウの使用を開始および停止するように Amazon EC2 インスタンスをスケジュールするにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/ssm-ec2-stop-start-maintenance-window
AWS Boto3 with Python
https://awstip.com/aws-boto3-with-python-57a5e767d4ae