3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-05

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の自動化に便利なデバイスだと思った。
ボタンを押すだけなので、利用者への説明が簡単なのがとても良い。

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?