Python
AWS
lambda
SORACOM
あのボタン

SORACOM LTE-M Button+AWS LambdaでEC2インスタンスの状態を操る

はじめに

タイトルそのままです。
SORACOM LTE-M Buttonを買ったので同一リージョン内のインスタンスの起動・停止・再起動をボタンだけでできるようにしました。

注意

Lambda関数のIAMロールを設定しましょう。
この辺りが参考になると思います

AWS Lambda上での実装(Python 3.6)

今回は1回押すと起動/2回押すと再起動/長押しで停止するようにします。

IoTEC2Button.py
from __future__ import print_function

import boto3
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)



def lambda_handler(event, context):
    logger.info('Received event: ' + json.dumps(event))
    #今回は東京リージョン内のインスタンスを操作するのでap-northeast-1
    client = boto3.client('ec2','ap-northeast-1')
    responce = client.describe_instances()
    #全インスタンスIDを入れておく配列
    all_list = []
    for reservation in responce['Reservations']:
      for instance in reservation['Instances']:
          ##ステータスがterminatedになっているインスタンスがあるときのエラー対策
          if instance['State']['Name'] != "terminated":
              all_list.append(instance['InstanceId'])
    click_type = event['deviceEvent']['buttonClicked']['clickType']
    #操作対象のインスタンスのID(個別で操作したい場合はここに操作対象のインスタンスIDを入れる)
    ilist=list(all_list)
    #1回押した時
    if click_type == "SINGLE":
        start =  client.start_instances(InstanceIds=ilist)
        return start
    #2回押した時
    elif click_type == "DOUBLE":
        reboot =  client.reboot_instances(InstanceIds=ilist)
        return reboot
    #長押しした時
    elif click_type == "LONG":
        forcestop =  client.stop_instances(InstanceIds=ilist,Force=True)
        return forcestop
    logger.info('OK') 

おわりに

LTE-Mボタンは外出先でも使えるので使う時だけ起動/作業終わったら停止させればコストも減らせて非常に便利です。
インスタンス常時稼働させとくとコストが...ただいちいちコンソール開くのもなぁ...なんて面倒くさがりな方(主に私)にもいいかもしれません。