Lambda を使用して Amazon EC2 インスタンスを定期的に停止および起動するにはどうすればよいですか?

所要時間3分
0

Amazon EC2 の使用量を減らすために、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを自動で停止および起動したいと考えています。

簡単な説明

AWS Lambda と Amazon EventBridge を使用すると、Amazon EC2 インスタンスを自動で停止および起動できます。

注: 以下に示す解決方法は簡単なソリューションの例です。より高度なソリューションについては、AWS Instance Scheduler を使用してください。詳細については、「Automate starting and stopping AWS instances」を参照してください。

Lambda を使用して EC2 インスタンスを定期的に停止および起動するには、次の手順を実行します:

  1. Lambda 関数用のカスタム AWS Identity and Access Management (IAM) ポリシーと IAM ロールを作成します。
  2. EC2 インスタンスを停止および起動する Lambda 関数を作成します。
  3. Lambda 関数をテストします。
  4. スケジュールに従って関数を実行する EventBridge スケジュールを作成します
    注: AWS アカウントのイベントに対応するルールを作成することもできます

解決策

注: 次の手順を完了すると、「Client error on launch」エラーが発生することがあります。詳細については、「暗号化されたボリュームが添付された状態でインスタンスをスタートすると、インスタンスはすぐに『起動時のクライアントエラー』というエラーで停止します。」を参照してください。

停止および起動する EC2 インスタンスの ID を取得します。その後、次の手順を実行します。

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

  1. JSON ポリシーエディタを使用して IAM ポリシーを作成します。以下の JSON ポリシードキュメントをポリシーエディタに貼り付けます:

    {  "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": "*"
        }
      ]
    }
  2. Lambda 用の IAM ロールを作成します。
    重要: Lambda に権限ポリシーをアタッチする場合は、先ほど作成した IAM ポリシーを選択してください。

注: 顧客管理の AWS Key Management Service (AWS KMS) キーで暗号化された Amazon Elastic Block Store (Amazon EBS) ボリュームを使用する場合は、kms:CreateGrant を IAM ポリシーに追加します。

インスタンスを停止および起動する Lambda 関数を作成する

  1. Lambda コンソールを開き、[関数の作成] を選択します。
  2. [一から作成] を選択します。
  3. [基本的な情報] に、次の情報を入力します:
    [関数名] には、「StopEC2Instances」など、関数を説明する名前を入力します。
    [ランタイム] で、[Python 3.9] を選択します。
    [アクセス許可] で、[デフォルトの実行ロールの変更] を展開します。
    [実行ルール][既存のロールを使用する] を選択します。
    [実行ロール] で、IAM ロールを選択します。
  4. [関数の作成] を選択します。
  5. [Code] タブの [Code source] で、以下のコードを [lambda_function] タブのコードエディタのエディタペインに貼り付けます。このコードを使用すると、指定した EC2 インスタンスが停止します。
    import boto3region = 'us-west-1'
    instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    us-west-1」インスタンスが配置されている AWS リージョンに置き換えます。「InstanceIds」は、停止および起動するインスタンスの ID に置き換えます。
  6. [デプロイ] を選択します。
  7. [Configuration] タブで [General configuration] を選択し、[Edit] を選択します。
  8. [Timeout] を 10 秒に設定し、[Save] を選択します。
    注: (オプション) Lambda 関数の設定を調整できます。たとえば、複数のインスタンスを停止して起動する場合は、各インスタンスで [Timeout][Memory] に異なる値を使用できます。
  9. 手順 1 ~ 7 を繰り返して、別の関数を作成します。以下の手順を実行して、この関数がインスタンスを起動できるようにします。
    手順 3 では、前回に使用したものとは別の関数名を入力します。例:「StartEC2Instances」。
    手順 5 では、以下のコードをコピーして、[lambda_function] タブでコードエディタのエディタペインに貼り付けます。
    import boto3region = 'us-west-1'
    instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.start_instances(InstanceIds=instances)
        print('started your instances: ' + str(instances))

          リージョンと同じインスタンス ID を使用してください。

Lambda 関数をテストする

  1. Lambda コンソールを開き、[関数] を選択します。
  2. 作成した関数の 1 つを選択します。
  3. [Code] タブを選択します。
  4. [Code source] セクションで、[Test] を選択します。
  5. [テストイベントの設定] ダイアログボックスで、[新しいテストイベントの作成] を選択します。
  6. イベント名を入力します。次に、[作成] を選択します。
    注: テストイベントの JSON コードは変更しないでください。
  7. [テスト] を選択して関数を実行します。
  8. 他の関数についても、手順 1 ~ 7 を繰り返します。

インスタンスのステータスを確認する

AWS マネジメントコンソール

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

CloudTrail

AWS CloudTrail を使用してイベントをチェックすることで、Lambda 関数がインスタンスを停止または起動したかを確認できます。

  1. CloudTrail コンソールを開きます。
  2. ナビゲーションペインで、[イベント履歴] を選択します。
  3. [ルックアップ属性] ドロップダウンリストを選択し、[イベント名] を選択します。
  4. 検索バーに「StopInstances」と入力して結果を確認します。次に、「StartInstances」と入力します。

結果が表示されない場合は、Lambda 関数がインスタンスを停止または起動しなかったことを意味します。

Lambda 関数を実行する EventBridge ルールを作成する

  1. EventBridge コンソールを開きます。
  2. [ルールを作成] を選択します。
  3. 「StopEC2Instances」など、ルールの名前を入力します。(オプション) [説明] にルールの説明を入力します。
  4. [ルールタイプ][スケジュール] を選択し、[EventBridge Scheduler で続行] を選択します。
  5. [スケジュールパターン] で [定期スケジュール] を選択します。
  6. [スケジュールパターン][頻度] で、[定期的なスケジュール] を選択します。
  7. [スケジュールタイプ] で、スケジュールの種類を選択します。その後、以下の手順を実行します。
    [Rate-based schedule] の場合、レート値を入力し、時間間隔(分、時間、または日)を選択します。
    または
    [Cron-based schedule] の場合、インスタンスを停止するタイミングを Lambda に指示する式を入力します。式の構文については、「スケジュールに従って実行する Amazon EventBridge ルールの作成」を参照してください。
    注: cron 式は UTC で評価されます。希望するタイムゾーンに合わせて式を調整してください。
  8. [ターゲットを選択] で、[ターゲット] ドロップダウンリストから [Lambda 関数] を選択します。
  9. [関数] では、インスタンスを停止する関数を選択します。
  10. [スキップして確認および作成] を選択し、[作成] を選択します。
  11. 手順 1 ~ 10 を繰り返して、インスタンスを起動するルールを作成します。次の手順を実行します。
    「StartEC2Instances」など、ルールの名前を入力します。
    (オプション) [説明] に、「EC2 インスタンスを毎朝午前 7 時に起動」など、ルールの説明を入力します。
    手順 7 の [Cron 式] に、インスタンスを起動するタイミングを Lambda に指示する式を入力します。
    手順 9 の [関数] で、インスタンスを起動する関数を選択します。

注: Lambda 関数がインスタンスを停止した後、再起動できない場合があります。Amazon Elastic Block Store (Amazon EBS) ボリュームが暗号化されていて、Lambda ロールにその暗号化キーを使用する権限がない場合に発生する可能性があります。詳細については、「暗号化されたボリュームで使用するのに必要な AWS KMS キーポリシー」と「AWS KMS のキーポリシー」を参照してください。

関連情報

チュートリアル: EventBridge を使用した AWS Lambda 関数のスケジュール

AWS サービスからのイベント

Amazon CloudWatch アラームへの停止アクションの追加

インスタンス購入オプション

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ