AWS
lambda
IoT
boto3

AWS IoT エンタープライズボタンで redash を再起動するボタンを作った

0. 背景・経緯

弊社(株式会社 Loco Partners)では redash を用い、非エンジニアでもRDBからデータの取得をできる環境を作ってある。
EC2 + RDS という構成で作ってあり、それぞれインスタンスタイプは大きくはない。
非エンジニア以外も自由に使える環境なので、時折バイオレントなSQLが実行され、ウンともスンとも言わなくなってしまうことがある。
そうなると「再起動してください」とエンジニアに依頼が来る。

しかし、他のサーバの操作もできてしまうAWSコンソールでの作業はリスクが大きいのであまりやりたくない。
また、いちいち再起動の依頼をするのも面倒だろう。
ということで、 redashで使用するEC2とRDSのインスタンスを再起動するだけのボタンを作成した。

ボタンの作成にあたっては次のような手順を踏んだ。

  1. IAM Roleの作成
  2. Lambda Functionの作成
  3. ボタンの設定

1. IAM Roleの作成

Lambda Functionに設定するIAM Roleを作成する。

  • redashで使うEC2インスタンスの再起動
  • redashで使うRDSインスタンスの再起動
  • 動作ログの出力

といったことできれば良いので、下記のようなPolicyでRoleを作成した。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RebootInstances",
            "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-abcde123456789"
        },
        {
            "Effect": "Allow",
            "Action": "rds:RebootDBInstance",
            "Resource": "arn:aws:rds:ap-northeast-1:123456789012:db:redash-instance"
        },
        {
            "Effect": "Allow",
            "Action": [
            "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

EC2, RDSのリソース名は次のような仕様となっているので、環境に合わせて適切に設定する。
EC2: arn:aws:ec2:${リージョン名}:${AWSアカウントID}:instance/${インスタンスID}
RDS: arn:aws:rds:${リージョン名}:${AWSアカウントID}:db:${インスタンス識別子}

2. Lambda Functionの作成

EC2インスタンスとRDSインスタンスの再起動を行うLambda Functionを作成する。
AWSのリソースを操作するのに便利な boto を使用できる Python をランタイムとして選択した。

import boto3

def lambda_handler(event, context):

    # EC2インスタンスの再起動
    ec2 = boto3.client('ec2', region_name="ap-northeast-1")
    ec2.reboot_instances(InstanceIds=["i-abcde123456789"])

    # RDSインスタンスの再起動
    rds = boto3.client('rds', region_name="ap-northeast-1")
    rds.reboot_db_instance(DBInstanceIdentifier="redash-instance", ForceFailover=False)

    return 'end'

3. ボタンの設定

次のような作業を行う。

  1. ボタンの登録
  2. Wifiの設定
  3. プロジェクトの作成
  4. プレイスメントの作成

これらの作業は全てスマホアプリで行うことができる。

下記の記事を参考に設定を行った。
こちらでは詳しい手順は割愛する。

https://qiita.com/teriyakisan/items/bb0facf5075376dcf587

ラベリング・保管

IoTボタンにはカラーバリエーションが無いため、複数持っていると区別が難しい。
コピー用紙をIoTボタンの形にハサミで切り抜き、筆ペンで文字を書き、のりで貼って何のボタンなのかわかるようにした。

また、ボタンは大きくはないため、乱雑に置いておくと紛失してしまう恐れがある。
紛失を防ぐため、Ardbeg ウェアハウスボックス2017の空き缶に格納した。

Image uploaded from iOS (10).jpg

最後に

入出力の少ないOpsの自動化に便利なデバイスだと思った。
ボタンを押すだけなので、利用者への説明が簡単なのがとても良い。

他にも活用できそうな場面があれば、ボタン化して行こうと思う。