Posted at

[AWS Cloud9]EC2自動停止を検知して別の処理を始める

More than 1 year has passed since last update.


はじめに

AWS Cloud9はIDEのブラウザを閉じたとき、自動でEC2インスタンスが停止する機能があります。

何分後に、自動停止するかは、設定から変更が可能です。

1.PNG

AWS Cloud9を1週間使うと、EC2インスタンスが自動停止するのが「便利 → 当たり前」という感覚になりました。そして、思いました。自動停止を検知してもっと楽できないかと。


やりたいこと

AWS Cloud9の機能で


  • 検知した情報をトリガーに別の処理を動作させてみる。

  • 今回は、サンプルに以下を動作確認


    • 自動停止のお知らせメール (実装したら、イチイチお知らせが来てウザくなった)

    • RDSの自動停止 (IDEとセットで使ってたので、止め忘れがなくなり非常に便利になった)




自動停止したことを検知

CloudWatchのルールを作成。


  • イベントパターンを選択

  • サービス名:EC2

  • イベントタイプ:EC2 Instance Status-change Notification

  • 特定の状態:インスタンスの停止を設定

  • Specific instance Id(s):AWS Cloud9のインスタンスIDを設定
    2.PNG

{

"source": [
"aws.ec2"
],
"detail-type": [
"EC2 Instance State-change Notification"
],
"detail": {
"state": [
"running",
"stopped"
],
"instance-id": [
"AWS Cloud9のインスタンスID"
]
}
}


検知した情報をトリガーに別の処理を動作

ターゲットに今回は2つ(SNS(メール送信)とLambda(rds停止)を設定しました。)

SNSは使い道を思いつかなかったのでEメールを設定したのみ。jsonがそのままメールに飛んでくる。

3.PNG

LambdaはついでにIDE起動したときの動作も記述。


  • IDE起動→EC2開始→RDS開始

  • IDE終了→30分後EC2停止→RDS停止


IAMロール

{

"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"rds:StartDBInstance",
"rds:StopDBInstance"
],
"Effect": "Allow",
"Resource": "*"
}
]
}


lambda_function.py

import boto3

def lambda_handler(event, context):
dbinstance = 'RDSインスタンス名'
rds = boto3.client('rds')
instanceState = event['detail']['state']
if instanceState == 'stopped':
result = rds.stop_db_instance(DBInstanceIdentifier = dbinstance)
else:
result = rds.start_db_instance(DBInstanceIdentifier = dbinstance)
print(result)



  • 開始状態のRDS

4.PNG


  • EC2が停止するイベントが発生

5.PNG


  • RDSが自動で停止
    6.PNG


まとめ


  • CloudWatchを使うことでIDEの終了後、EC2自動停止を検知できました。

  • 後続処理を自動化できることが分かったので、一日の作業終了をブラウザを閉じるだけに出来そうです。


関連