こんにちは、小寺です。LambdaのPythonランタイム3.8の廃止通知を受けて、EC2の自動起動、自動停止する方法について、改めてまとめてみました。
2024 年 10 月 14 日に AWS Lambda での Python 3.8 ランタイムのサポートを終了します。これは Python 3.8 のサポート終了 (EOL) が 2024 年 10 月に予定されていることに合わせたものです [1]。
Lambda ランタイムサポートポリシー [2] で説明されているように、 AWS Lambda における言語ランタイムのサポート終了はいくつかの段階で行われます。2024 年 10 月 14 日以降、 AWS Lambda は Lambda 関数で使用される Python 3.8 ランタイムにセキュリティパッチやその他の更新を適用しなくなり、Python 3.8 を使用する関数はテクニカルサポートの対象ではなくなります。また、Python 3.8 は AWS マネジメントコンソールでは利用できなくなります。ただし、Python 3.8 を使用する関数は引き続き AWS CloudFormation, AWS CLI, AWS SAM またはその他のツールを使用して作成および更新が可能です。2025 年 2 月 28 日以降、Python 3.8 ランタイムを使用して新しい Lambda 関数を作成することはできなくなります。2025 年 3 月 31 日以降、Python 3.8 ランタイムを使用している既存の Lambda 関数を更新することはできなくなります。
Healthダッシュボードの通知より
EC2の自動起動・停止には以下のような方法で実装することができます。過去に実装したものは、1のAWS Lambda指定が多いですね。理由を考えると、Systems ManagerのRunbookの機能が発表される前や、EventBridge Schedulerの機能が発表される前だったからかなーというところです。
- EventBridgeのターゲットに、EC2を起動させるAWS Lambda指定
- EventBridgeのターゲットにAWS Systems Manager Automationのドキュメントを指定
- EventBridgeからEC2のAPIを直接呼び出す
- EventBridge SchedulerからEC2のAPIを直接呼び出す
特に1のLambdaを使った方法だと、ランタイムのPythonのバージョン管理をする必要がありますよね。今回はEventBridge Schedulerから直接EC2のAPIを呼び出す方法で試してみました。
IAMロール設定
IAMのロールより「ロールの新規作成」を行います。

カスタム信頼ポリシーには以下を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可を追加部分では、EC2の起動と停止ができる権限があれば動作します。本コラムではAmazonEC2FullAccessを付与しています。

EventBridgeスケジューラー設定
(1)EventBridgeスケジューラーを選びます。「スケジュール」より「スケジュールを作成する」をクリックします。

(2)「スケジュール名」を入力します。

(3)スケジュールのパタンとしては、夜間の起動、朝の停止を定期的に行いたく、起動時間を日本時間9時として設定します。
頻度は「定期的なスケジュール」を選び、タイムゾーンは日本時間なので、「UTC+09:00」を選びます。月曜日から金曜日まで9時に起動するように設定します。
祝日など取り込める機能があるとありがたいな、と思います・・。

(4)フレックスタイムウィンドウはオフにして、夏時間も特に入力なしとしました。

(5)次のステップ2として「ターゲットの選択」を行います。全てのAPIから「EC2」を選びます。

(6)Amazon EC2のAPIから「StartInstances」APIを選びます。

(7)複数のEC2インスタンスのインスタンスID指定も可能ですが、CloudWatchのモニタリング結果によっては、インスタンスを立ち上げなおしするなどの運用を行っている場合、都度、スケジューラの修正が必要になってしまいます。他の方法でタグ指定ができるのが理想ですね。

(8)ステップ3の設定でスケジュールを有効化します。デフォルトでは、再試行回数が「185回」になっているので、10回に変更しました。

(9)アクセス許可の箇所では、「既存のロールを使用」を選び、作成しておいたIAMロールを指定します。

(10)スケジュールの確認と作成で設定を改めて確認します。

同じ方法で自動停止のスケジューラも作成します。無事に自動起動、停止が確認できました。
