スキップしてコンテンツを表示

EventBridge スケジューラを使用して Amazon EC2 インスタンスを定期的に停止および起動する方法を教えてください。

所要時間3分
0

Amazon EventBridge スケジューラを使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを自動的に停止および起動したいと考えています。

簡単な説明

EC2 インスタンスを自動的に停止および起動するには、EventBridge スケジューラを使用して Amazon EC2 API の StartInstancesStopInstances を直接呼び出します。または、スケジューラを使用して AWS Lambda 関数を呼び出し、インスタンスを停止および起動することもできます。Amazon EC2 API をスケジューラターゲットとして使用して、追加の Lambda 関数を作成する必要がないようにするのがベストプラクティスです。

より高度なソリューションでは、AWS で Instance Scheduler を使用してください。

解決策

前提条件: 停止と起動を行うインスタンスの ID を取得します。

スケジューラを使用して Amazon EC2 API を直接呼び出します。

EventBridge スケジューラの IAM ポリシーとロールを作成する

次の手順を実行します。

  1. JSON ポリシーエディタを使用して AWS Identity and Access Management (IAM) ポリシーを作成し、EventBridge スケジューラがインスタンスを停止および起動できるようにします。
    ポリシーの例:
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:Start*",
                    "ec2:Stop*"
                ],
                "Resource": "*"
            }
        ]
    }
    注: Amazon Elastic Block Store (Amazon EBS) ボリュームをカスタマーマネージド AWS Key Management Service (AWS KMS) キーで暗号化した場合は、kms:CreateGrant をポリシーに追加してください。Lambda 関数が暗号化キーにアクセスできない場合、インスタンスを停止することはできますが、再起動することはできません。詳細については、「Required AWS KMS key policy for use with encrypted volumes」(暗号化されたボリュームで使用するために必要な AWS KMS キーポリシー) を参照してください。
  2. IAM コンソールを開きます。
  3. [ロール] をクリックし、[ロールの作成] を選択します。
  4. [信頼されたエンティティタイプ][カスタム信頼ポリシー] を選択します。
  5. 次の IAM ポリシーを入力します。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "scheduler.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "AWS_ACCOUNT_ID"
                    }
                }
            }
        ]
    }
    注: AWS_ACCOUNT_ID を実際の AWS アカウント ID に置き換えてください。
  6. [次へ] をクリックします。
  7. [アクセス許可ポリシー] で、ステップ 1 で作成した IAM ポリシーを選択します。
  8. [ロール名] に、EventBridge_Scheduler_Role などの名前を入力します。
  9. [ロールの作成] をクリックします。

EventBridge スケジューラのスケジュールを作成する

StopInstances API のスケジュールと StartInstances API のスケジュールを作成します。スケジュールを作成するときに、次の設定を行います。

  • [ターゲット API][すべての API] を選択し、[Amazon EC2] を検索します。
  • [StopInstances] または [StartInstances] を選択し、インスタンス ID を入力します。
  • [設定 - オプション][アクセス許可][既存のロールを選択] を選択し、作成した IAM ロールを選択します。

スケジューラを使用して Lambda 関数を呼び出す

Lambda 関数用の IAM ポリシーとロールを作成する

次の手順を実行します。

  1. JSON ポリシーエディタを使用して IAM ポリシーを作成し、Lambda がインスタンスを停止および起動できるようにします。
    ポリシーの例:
    {    "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:*:*:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:Start*",
                    "ec2:Stop*"
                ],
                "Resource": "*"
            }
        ]
    }
    **注:](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) カスタマーマネージド AWS KMS キーで暗号化されている Amazon EBS ボリュームを使用する場合は、**kms:CreateGrant[ をポリシーに追加してください。Lambda 関数が暗号化キーにアクセスできない場合、インスタンスを停止することはできますが、再起動することはできません。詳細については、「Required AWS KMS key policy for use with encrypted volumes」(暗号化されたボリュームで使用するために必要な AWS KMS キーポリシー) を参照してください。
  2. Lambda 用の IAM ロールを作成します。
  3. IAM ポリシーを IAM ロールにアタッチします

インスタンスの停止と起動をする Lambda 関数を作成する

次の手順を実行します。

  1. Lambda コンソールを開きます。
  2. [関数を作成] をクリックし、[最初から作成] を選択します。
  3. [基本情報] に、以下を設定します。
    [関数名] には、StopEC2InstancesStartEC2Instances など、その関数を説明する名前を入力します。
    [ランタイム][Python 3.14] を選択します。
    [アクセス許可] で、[デフォルトの実行ロールの変更] を展開します。
    [実行ルール][既存のロールを使用] を選択します。
    [既存のロール] で、作成した IAM ロールを選択します。
  4. [関数の作成] をクリックします。
  5. [コード] タブをクリックし、[lambda_funciton.py] タブを選択します。
  6. [コードソース] で、次のコードをコードエディタに入力してインスタンスの停止を設定します。
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    インスタンスの起動を設定するには、コードエディタに次のコードを入力します。
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.start_instances(InstanceIds=instances)
        print('started your instances: ' + str(instances))
    注: us-west-1 をインスタンスの AWS リージョンに置き換え、i-12345acdb12345abcd をインスタンスの ID に置き換えてください。
  7. [デプロイ] をクリックします。
  8. [設定] タブをクリックし、[一般設定] を選択します。
  9. [編集] をクリックします。
  10. [タイムアウト][10 秒] を選択し、[保存] をクリックします。

注: 関数を Amazon Virtual Private Cloud (Amazon VPC) に関連付けた場合は、関数がインターネット経由で Amazon EC2 エンドポイントに到達できることを確認します。または、Amazon EC2 の仮想プライベートクラウド (VPC) エンドポイントを設定します。

Lambda 関数をテストする

Lambda 関数をテストして、インスタンスの停止と起動を確認します。

テストを実行する前後にインスタンスのステータスをチェックし、関数が動作することを確認します。

AWS CloudTrail を使用して Lambda 関数がインスタンスを停止または起動したことを確認するには、次の手順を実行します。

  1. CloudTrail コンソールを開きます。
  2. ナビゲーションペインで、[イベント履歴] をクリックします。
  3. [ルックアップ属性] ドロップダウンリストで [イベント名] を選択します。
  4. 検索バーに StopInstances と入力して結果を確認します。次に、StartInstances と入力します。
    注: 結果が表示されない場合は、Lambda 関数によりインスタンスが停止または起動が行われていません。

Lambda 関数を実行するための EventBridge スケジューラのスケジュールを作成する

Lambda 関数を実行するスケジュールを作成します[ターゲットの選択][テンプレート化されたターゲット] を選択し、[AWS Lambda の呼び出し] をクリックします。作成した Lambda 関数を使用してください。

1コメント

This article was reviewed and updated on 2026-01-22.

エキスパート

応答済み 8日前

関連するコンテンツ