Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away