LoginSignup
6
8

More than 5 years have passed since last update.

EC2インスタンスを特定の時間に起動・停止

Posted at

ECSで起動しているEC2インスタンスを停止すると、AutoScalingGroupに所属しているので、勝手に次のインスタンスが立ち上がる。
なのでECSで起動しているEC2インスタンスを特定の時間に起動・停止したい場合には、AutoScalingGroupの希望するインスタンス数を変更することで対応した。

以下は、通常のEC2インスタンスを特定の時間に起動・停止する方法と、AutoScalingGroup内のEC2インスタンスを特定の時間に起動・停止する方法

EC2インスタンスを特定の時間に停止・起動

IAM

ポリシー

ポリシー > ポリシーの作成

  • JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}
  • ポリシー名: ec2-start-stop-policy (任意)

ロール

ロール > ロールの作成

  • 信頼されたエンティティの種類を選択
    • AWSサービス
  • このロールを使用するサービスを選択
    • Lambda
  • Attach アクセス権限ポリシー
    • ec2-start-stop-policy
  • 確認
    • ロール名: ec2-start-stop-role (任意)

Lambda

ec2-start-instances

関数 > 関数の作成

  • 名前: ec2-start-instances
  • ランタイム: Node.js 6.10
  • ロール: ec2-start-stop-role
  • 関数コード
index.js
const INSTANCE_IDS = [
        'i-05b9670c7db7*****', /** ここに対象のインスタンスIDを指定 */
        'i-06abe8322085*****',
        'i-0e93b1488b10*****'
    ];

var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1';

function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: INSTANCE_IDS
    };

    ec2.startInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context) {
    console.log('start');
    ec2Start(function() {
        context.done(null, 'Started Instance');
    });
};

ec2-stop-instances

関数 > 関数の作成

  • 名前: ec2-stop-instances
  • ランタイム: Node.js 6.10
  • ロール: ec2-start-stop-role
  • 関数コード
index.js
const INSTANCE_IDS = [
        'i-05b9670c7db7*****', /** ここに対象のインスタンスIDを指定 */
        'i-06abe8322085*****',
        'i-0e93b1488b10*****'
    ];

var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1';

function ec2Stop(cb){
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: INSTANCE_IDS
    };

    ec2.stopInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context) {
    console.log('start');
    ec2Stop(function() {
        context.done(null, 'Stoped Instance');
    });
};

CloudWatch

月曜から金曜の日本時間午後9時に、EC2インスタンスを停止

CloudWatch > ルール > ルールの作成

  • イベントソース
    • Cron式: 0 12 ? * MON-FRI *
  • ターゲット
    • Lambda関数: ec2-stop-instances

月曜から金曜の日本時間午前8時に、EC2インスタンスを起動

CloudWatch > ルール > ルールの作成

  • イベントソース
    • Cron式: 0 23 ? * SUN-THU *
  • ターゲット
    • Lambda関数: ec2-start-instances

AutoScalingGroup内のEC2インスタンスを特定の時間に停止・起動

EC2

Auto Scaling グループ > (対象グループ) > スケジュールされたアクション > 予定アクションの作成

月曜から金曜の日本時間午後9時に、AutoScalingGroup内のEC2インスタンスを停止

  • 名前: stop-ecs-cluster (任意)
  • 希望するキャパシティ: 0
  • 繰り返し: Cron: 0 12 * * MON-FRI

月曜から金曜の日本時間午前8時に、AutoScalingGroup内のEC2インスタンスを起動

  • 名前: start-ecs-cluster (任意)
  • 希望するキャパシティ: 1 (立ち上げたい数)
  • 繰り返し: Cron: 0 23 * * SUN-THU
6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8