AWS re:Postを使用することにより、以下に同意したことになります 利用規約

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

所要時間3分
0

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

簡単な説明

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

注: 次の解決方法は、シンプルな解決方法です。より高度に解決するには、AWS Instance Scheduler を使用してください。詳細については、「Automate starting and stopping AWS instances」(AWS インスタンスの起動と停止を自動化する) を参照してください。

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

1.    AWS Identity and Access Management (IAM) ポリシー、および Lambda 関数実行のためのロールを作成します。

2.    Lambda 関数を、EC2 インスタンスを停止および起動するように作成します。

3.    Lambda 関数のテスト。

4.    関数をスケジュールどおりに実行する EventBridge ルールを作成します
注: AWS アカウントで発生したイベントに対応するルールを作成することもできます。

解決方法

注: 次のステップを完了した後に、「Client error on launch」(起動時のクライアントエラー) が表示される場合は、「暗号化されたボリュームがアタッチされた状態でインスタンスをスタートすると、インスタンスはすぐに「起動時のクライアントエラー」というエラーで停止します」を参照してください。

停止して起動する EC2 インスタンスの ID を取得します。その後、以下の手順を実行してください。

Lambda 関数の 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 ポリシーを選択してください。

EC2 インスタンスを停止および起動する Lambda 関数を記述する

1.    Lambda コンソールを開き、[Create function] (関数の作成) を選択します。

2.    [Author from scratch] をクリックします。

3.    [Basic information] (基本情報) で、次の情報を追加します。

[Function name] (関数名) で、EC2 インスタンスを停止させるために使用する関数として識別する名前を入力します。例えば、「StopEC2Instances」です。
[Runtime] (ランタイム) には [Python 3.9] を選択します。
[Permissions] (アクセス許可)で [Change default execution role (デフォルト実行ロールを変更)] を選択します。
[Execution role] (実行ルール) で [Use an existing role] (既存のロールを使用する) を選択します。
[Role] で今回作成した IAM ロールを選択します。

4.    [Create function] をクリックします。

5.    [Code] (コード) の [Code source] (コードソース) で、次のコードをコピーして、コードエディタのエディタペインに貼り付けます: (lambda_function)。このコードは、指定した EC2 インスタンスを停止します。

EC2 インスタンスを停止する関数コードの例

import boto3
region = '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))

注: [region] (リージョン) で、「us-west-1」を自分のインスタンスがある AWS リージョンと置き換えます。[instances] で、サンプルの EC2 インスタンス ID を、実際に停止および起動したいものの ID と置き換えます。

6.    [Deploy] (デプロイ) を選択します。

7.    [Configuration] (設定) タブで、[General configuration] (一般設定)、[Edit] (編集) の順に選択します。[Timeout] (タイムアウト) を 10 秒に設定し、[Save] (保存) を選択します。

注: 自分のユースケースに合わせて、Lambda 関数の設定を行います。例えば、複数のインスタンスを停止および起動するには、TimeoutMemory に異なる値を使用することが考えられます。

8.    別の関数を作成するには、ステップ 1~7 を繰り返します。次のステップを別の方法で完了して、この関数が EC2 インスタンスを起動するようにします。

ステップ 3 で、以前に使用した [Function name] (関数名) とは異なる関数名を入力します。例えば、「StartEC2Instances」です。
ステップ 5 で、コードエディタのエディタペインに、次のコードをコピーして貼り付けます: (lambda_function)。

EC2 インスタンスを起動する関数コードの例

import boto3
region = '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))

注: region および instances では、EC2 インスタンスを停止するためにコードに使用したのと同じ値を使用します。

Lambda 関数をテストする

1.    Lambda コンソールを開き、[Functions] (関数) を選択します。

2.    作成した関数から 1 つ選択します。

3.    [Code] (コード) タブを選択します。

4.    [Code source] (コードソース) セクションで [Test] (テスト) を選択します。

5.    [Configure test event] (テストイベントの設定) ダイアログボックスで、[Create new test event] (新しいテストイベントの作成) を選択します。

6.    イベント名を入力します。 その後、[Create] (作成) を選択します。

注: テストイベントの JSON コードは変更しないでください。関数はそれを使用しません。

7.    [Test] (テスト) を選択して関数を実行します。

8.    作成した他の関数について、ステップ 1~7 を繰り返します。

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

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

作成した関数が想定どおりに動作するかのテストの前後で、EC2 インスタンスの状態をチェックします。

AWS CloudTrail

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

1.    CloudTrail コンソールを開きます。

2.    ナビゲーションペインで [イベント履歴] をクリックします。

3.    [Lookup attributes] (ルックアップ属性) ドロップダウンリストを選択してから、[Event name] (イベント名) を選択します。

4.    検索バーで StopInstances と入力して結果を確認します。

5.     検索バーで StartInstances と入力して結果を確認します。

結果がない場合、Lambda 関数は EC2 インスタンスを停止または起動していないということです。

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

1.    [EventBridge コンソール] を開きます。

2.    [Create rule] (ルールを作成) を選択します。

3.    ルールの [Name] (名前) を入力します (「StopEC2Instances」など)。(オプション) [Description] (説明) にルールの説明を入力します。

4.    [Rule type] (ルールタイプ) で [Schedule] (スケジュール) を選択し、[Continue in EventBridge Scheduler] EventBridge Scheduler で続行) を選択します。

5.    [Schedule pattern] (スケジュールパターン) で、[Recurring schedule] (定期的なスケジュール) を選択します。次のいずれかのステップを完了します。

[Schedule pattern] (スケジュールパターン) の [Occurrence] (頻度) で、[Recurring schedule] (定期的なスケジュール) を選択します。その後、次のいずれかのステップを完了します。
[Schedule type] (スケジュールタイプ) が [Rate-based schedule] (レートベースのスケジュール) の場合は、[Rate expression] (レート表現) でレート値を入力し、分単位、時間単位、または日単位で時間間隔を選択します。
[Schedule type] (スケジュールタイプ) が [Cron-based schedule] (Cron ベースのスケジュール) の場合、[Cron expression] (Cron 式) でインスタンスを停止するタイミングを Lambda に指示する式を入力します。式の構文については、「ルールのスケジュール式」を参照してください。
注: Cron スケジュール式 は UTC で評価されます。必ず希望のタイムゾーンに合わせて式を調整してください。

6.    [Select targets] (ターゲットの選択) で、[Target] (ターゲット) ドロップダウンリストから [Lambda function] (Lambda 関数) を選択します。

7.    [Function] (関数) で、EC2 インスタンスを停止させる関数を選択します。

8.    [Skip to review and create] (スキップして確認および作成) を選択し、[Create] (作成) を選択します。

9.    1~8 のステップを繰り返して、EC2 インスタンスを起動するためのルールを作成します。次のステップを別の方法で完了します。

ルールの名前を入力します (「StartEC2Instances」など)。
(オプション) [Description] (説明) で、「EC2 インスタンスを毎朝午前 7 時に起動する」など、ルールの説明を入力します。
ステップ 5 で、[Cron expression] (Cron 式) には、インスタンスを起動させるタイミングを Lambda に指示する式を入力します。
ステップ 7 で、[Function] (関数) には、EC2 インスタンスを起動する関数を選択します。


関連情報

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

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

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

スケジュールされたリザーブドインスタンス

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