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 *
- Cron式:
- ターゲット
- Lambda関数: ec2-stop-instances
月曜から金曜の日本時間午前8時に、EC2インスタンスを起動
CloudWatch > ルール > ルールの作成
- イベントソース
- Cron式:
0 23 ? * SUN-THU *
- Cron式:
- ターゲット
- 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