特定の時間または使用率のしきい値に合わせて EC2 インスタンスを自動的に停止および起動することで、Amazon Elastic Compute Cloud (Amazon EC2) の使用量を削減したいと考えています。AWS Lambda と Amazon CloudWatch Events を使用して、それを行うにはどうすればよいですか?

注意: この設定例は、簡単な解決策です。より堅実な解決策については、AWS インスタンススケジューラを参照してください。

CloudWatch Events を使用すると、アカウントで発生したイベントに対応して、指定した時間または間隔でトリガーされるイベントを作成できます。また、CloudWatch では、インスタンスの CPU 使用率が特定のしきい値に達したときにアラームを作成することもできます。

この設定では、EC2 インスタンスを停止および起動する Lambda 関数を作成します。次に、指定した間隔または特定の時間に関数をトリガーするイベントを作成します。まだ行っていない場合は、1 つ以上の EC2 インスタンスを起動します。次に、この設定を使用して停止および開始するインスタンスの ID を取得します。

注意: EC2 インスタンスの ID は、EC2 コンソールの [Instance ID] 列で見つけます。また、AWS コマンドラインインターフェイスで describe-instances を使用するか、AWS Tools for Windows PowerShell で Get-EC2Instance を使用することもできます。

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

1.    Lambda コンソールで、[Create function] を選択します。

2.    [Author from scratch] を選択します。

3.    [Author from scratch] で、以下を行います。
[Name] には、 「StopEC2Instances」など、関数の名前を入力します。
[Runtime] では、[Python2.7] を選択します。
[Role] では、[Create a custom role] を選択します。AWS Identity and Access Management (IAM) コンソールのページが新しいブラウザタブまたはウィンドウに表示されます。

4.    IAM コンソールページの [Role Summary] で、以下を行います。
[IAM Role] では、[Create a new IAM Role] を選択します。
[Role Name] には、「lambda_stop_start_ec2」など、ロールの名前を入力します。

5.    [View Policy Document] を選択してから、[Edit] を選択します。

6.    [Edit Policy] ダイアログで、必要に応じてドキュメントを読んで、[Ok] を選択します。

7.    このポリシーをコピーしてポリシーエディタに貼り付け、デフォルトのポリシーを置き換えます:

{
  "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": "*"
    }
  ]
}

8.    [Allow] を選択して、カスタムロールの作成を終了し、Lambda コンソールに戻ります。

9.    Lambda コンソールで、[Create function] を選択します。

10.    次のコードをコピーし、[Function code] の下のコードエディタのエディタペインに貼り付けます (lambda_function)。このコードは、特定した EC2 インスタンスを停止します。

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

注意: [region] では、「us-west-1」を、インスタンスが存在する AWS リージョンで置き換えます。[instances] では、サンプルの EC2 インスタンス ID を 1 つ以上のインスタンスの ID で置き換えます。

11.    [Basic settings] で、Timeout を 10 秒に設定します。

12.    [Save] を選択します。

13.    ステップ 1 から 12 を繰り返して、別の関数を作成します。関数に EC2 インスタンスを起動させるには、次のようにします。
ステップ 3 で、機能の目的を識別する名前を [Name] に入力します。たとえば、「StartEC2Instances」です。
ステップ 3 で、[Role] で、以前に作成したものと同じロールを選択します。
ステップ 10 で、次のコードをコピーして、コードエディタのエディタペインに貼り付けます (lambda_function)。

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

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

Lambda 関数をテストする

1.    Lambda コンソールで、[Functions] を選択します。

2.    作成した関数の 1 つを選択します。

3.    [Actions] を選択してから、[Test] を選択します。

4.    [Configure test event] ダイアログで、[Create new test event] を選択します。

5.    [Event name] を入力してから、[Create] を選択します。

注意: テストイベントの JSON コードを変更する必要はありません。関数はそれを使わないからです。

6.    [Test] を選択して関数を実行します。

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

ヒント: テストの前後に EC2 インスタンスのステータスをチェックして、関数が期待どおりに機能することを確認できます。

Lambda 関数をトリガーする CloudWatch Events イベントを作成する

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

2.    左側のナビゲーションペインの [Events] で、[Rules] を選択します。

3.    [Create rule] を選択します。

4.    [Event Source] で、[Schedule] を選択します。

5.    以下のいずれかを実行します。
[Fixed rate of] には、時間間隔を分、時間、日数で入力します。
[Cron expression] には、インスタンスをいつ停止するかを Lambda に指示する式を入力します。式の構文については、ルールの式のスケジュールを参照してください。
注意: cron 式は UTC で評価されます。希望するタイムゾーンに合わせて式を調整します。

6.    [Targets] で、[Add target] を選択します。

7.    [Lambda function] を選択します。

8.    [Function] では、EC2 インスタンスを停止する Lambda 関数を選択します。

9.    [Configure details] を選択します。

10.   [Rule definition] で、以下を行います。
[Name] で、「StopEC2Instances」など、イベントを識別する名前を入力します。
(オプション) [Description] には、イベントの説明を記入します。たとえば、「毎晩午後 10 時に EC2 インスタンスを停止する。」
[State] では、[Enabled] チェックボックスを選択します。

11.   [Create rule] を選択します。

ヒント: 夜間に EC2 インスタンスを停止するイベントと、午前中に再びそれらを開始する別のイベントを作成します。


このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2016 年 7 月 7 日

更新日: 2019 年 2 月 28 日