あらかじめ定義した時間または使用率の閾値にしたがってインスタンスを停止および開始することで、Amazon Elastic Compute Cloud (Amazon EC2) の使用を削減したいです。AWS Lambda と Amazon CloudWatch Events を構成して、この操作を自動化することはできますか?

CloudWatch Events を使って AWS Lambda 関数をトリガーし、EC2 インスタンスをスケジュールされた間隔で開始および停止できます。

注: この記事ではシンプルなソリューションの例を提示します。より堅牢なソリューションについては、AWS Instance Scheduler を参照してください。

CloudWatch Events で、スケジュールされた特定の時刻にトリガーされるイベントや、アカウントで起こるイベントに反応してトリガーされるイベントを作成できます。たとえば、一日の特定の時刻に CloudWatch Events を作成したり、あるインスタンスの CPU 使用率が一定の閾値に達したときのアラームを作成したりできます。これらのイベントにトリガーされたときにインスタンスを開始および停止するように Lambda の関数を構成することもできます。

この例では、EC2 インスタンスを開始および停止するために Lambda の関数を使用しており、CloudWatch Events を使用して朝にインスタンスを開始し、夜に停止しています。

1.    AWS Lambdaコンソールを開き、Create] を選択します。
2.    [Author from scratch] を選択します。
3.    "StopEC2Instances"のような、機能の [Name] を入力します。
4.    [Runtime] ドロップダウンの一覧から、 [Python2.7] を選択します。
5.    [Role] ドロップダウンの一覧を展開し、 [Create a custom role] を選択します。ブラウザで新しいタブまたはウィンドウが開きます。
6.    IAMロールドロップダウンメニューから [Create a new IAM Role] を選択し、例えば、 "lambda_start_stop_ec2"などのロールの名前を入力します。
7.    [View Policy Document] を選び 、[Edit] をクリックし、文書を読むようにプロンプトが表示されたら [Ok] をクリックします。次のように編集します。

{
  "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] を選択し、AWS Lambda コンソールに戻り、次に [Create Function] を選択します。
9.    インスタンスを停止するには、以下を [Function] コードエディタに入力します。

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g., 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

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

10.  [Basic settings] で、 [Timeout] 機能に10秒と入力します。
11.  [Save (保存)] を選択します。
12.  インスタンスを開始する別の機能を作成するには、以下を使用して、これらの手順を繰り返します。

import boto3
# Enter the region your instances are in. Include only the region without specifying Availability Zone; e.g.; 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['X-XXXXXXXX']

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

注: [Name (名前)] および [Description (説明)] を使用して、この関数がインスタンスを開始するために使用されるということを示しておきます。先に作成したロールを使用できます。

関数をテストする

1.    AWS Lambda コンソールを開き、 [Functions (関数)] を選択します。
2.    関数を選択して、 [Test (テスト)] をクリックします。
3.    [Event name (イベント名)] に名前を入力し、[Create (作成)] をクリックします。
4.    [Test] を選択して関数を実行します。

注: テストイベントの本体は、関数がテストイベントの本体を使用しないため、関数に影響しません。

夜にLambdaの機能をトリガーするCloudWatch Eventを作成する

1.    Amazon CloudWatch コンソールを開きます。
2.    [Events] を選択し、[Create rule] をクリックします。
3.    [Schedule] をEvent Source内でクリックします。
4.    時間の間隔またはcronの表現を入力して、インスタンスを停止する時刻をLambdaに伝えます。正しい構文について詳しくは、 「Schedule Expression Syntax for Rules」をご覧ください。
ひとこと cronの表現はUTCで評価されます。お好みのタイムゾーンに合わせてcron表現を調整するようにしてください。
5.    [Add target] を選択し、 [Lambda function] をクリックします。
6.    [Function] では、インスタンスを停止するLambda機能を選びます。
7.    [Configure details] を選択します。
8.    提供されたフィールドに、以下の情報を使用します。
       [Name (名前)] には、「StopEC2Instances」などの意味のある名前を入力します。
       [Description (説明)] には、「毎晩 EC2 インスタンスを停止する」などの意味のある説明を入力します。
       [State (状態)] では、 [Enabled (有効)] を選択します。
       [Create rule] を選択します。

朝にインスタンスを再起動するには、これらの手順を繰り返し、お好きな開始時間を使用します。


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

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

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

公開日: 2016 年 07 月 07 日

更新: 2018 年 4 月 25 日