- Published on
AWSのEC2をLambdaでスケジュール設定して決まった曜日や時間だけ稼働させる方法
- Authors
- ジャバ・ザ・ハットリ
staging の EC 2インスタンスはデバッグ用にしか使っていないので、土日とか真夜中の時間帯は眠らせて、朝になったら起きる設定にした。その作業メモ。
こういうのを365日24時間稼働させておかないで、要らない時には眠らせておくと AWS 様に支払う金額が割安にできる。そこで「本来なら**ドルもかかってるサーバーコストがオレ様の設定で低価格で済んでるんだぜ」と雇用主に言って、その差額分をボーナスとして貰ってください。
指定の日時にスタートする方とストップする方と2種類の設定が必要。2つとも大して違いはないけど、まずはスタートする方から。
1
Lambda を出す。(もし使っているリージョンに Lambda が無ければ別リージョンへ移動する)
Create a Lambda function のボタンを押す
2
Select blueprint はスキップする
3
Configure function を設定する。
Name は分かりやすく、Start EC2 <プロジェクト名>などが入っていれば Ok か、と。
Description はお好きなように。
Runtime は Node.js 4.3
4
Lambda function code に以下のコードを入れる。
1 行目の INSTANCE_ID = '*******';には Instance ID を入れる。Instance ID は AWS > EC2 > Instance のインスタンス表に出ている。
AWS.config.region = '********';にはリージョンを入れる。例 ap-southeast-1 リージョンの最後は数字。アルファベットではない
const INSTANCE_ID = '*******'
var AWS = require('aws-sdk')
AWS.config.region = '********'
function ec2Start(cb) {
var ec2 = new AWS.EC2()
var params = {
InstanceIds: [INSTANCE_ID],
}
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')
})
}
5
Lambda function handler and role を設定する。
Role で Basic execution role を選択すると、IAM の設定画面へ飛ぶ
6
Role を設定する
Role Name にわかりやすい名前を設定
Policy Document を表示して Edit ボタンを押す。
Policy Document を以下の内容に書き換える
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:StartInstances"
],
"Resource":[
"arn:aws:logs:*:*:*",
"arn:aws:ec2:*"
]
}
]
}
保存して Role の作成が完了したら、Lambda に戻る
7
Advanced settings はそのままにして「Next」を押す
8
内容に間違いがないか確認して「Create function」を押す
9
「Test」ボタンを押すことで、止まっているインスタンスが動くことを確認する。
10
Event sources タブの Add event source を押す
11
Event source type で CloudWatch Events - Schedule を選択する
スケジュール設定は「Schedule expression」に入れた内容で決定される。
詳しくはここ。
例)
Invoke Lambda function every 5 minutes
5分ごとに実行
rate(5 minutes)
Invoke Lambda function at 06:00pm (UTC) every Mon-Fri
月曜から金曜の午後6時(UTC)に実行。時刻は全て UTC なので自分の意図する時間帯への変換が必要。
cron(0 18 ? \* MON-FRI \*)
12
「submit」ボタンを押したら完了。
13
指定の時刻にストップする設定は Lambda function code に貼り付けるコード(手順4)がこれ。
const INSTANCE_ID = '******'
var AWS = require('aws-sdk')
AWS.config.region = '*********'
function ec2Stop(cb) {
var ec2 = new AWS.EC2()
var params = {
InstanceIds: [INSTANCE_ID],
}
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')
})
}
Role(手順6)がこれ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:StopInstances"
],
"Resource": [
"arn:aws:logs:*:*:*",
"arn:aws:ec2:*"
]
}
]
}
後は名前以外、全て同じ。
IP アドレスが毎日変わる
もし指定したインスタンスに Elastic IP を付けてなかったら毎日寝て起きてする度に IP アドレスが変更される。capistrano などの設定上、それが不便なら Elastic IP を付ける。
以上。
Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく |
作者: NRI ネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬 |
出版社/メーカー: SB クリエイティブ |
発売日: 2015/03/25 |
メディア: Kindle 版 |
Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA) |
作者: NRI ネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴 |
出版社/メーカー: SB クリエイティブ |
発売日: 2016/04/20 |
メディア: 単行本 |