Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@ot-nemoto

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
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?