0. 背景・経緯
弊社(株式会社 Loco Partners)では redash を用い、非エンジニアでもRDBからデータの取得をできる環境を作ってある。
EC2 + RDS という構成で作ってあり、それぞれインスタンスタイプは大きくはない。
非エンジニア以外も自由に使える環境なので、時折バイオレントなSQLが実行され、ウンともスンとも言わなくなってしまうことがある。
そうなると「再起動してください」とエンジニアに依頼が来る。
しかし、他のサーバの操作もできてしまうAWSコンソールでの作業はリスクが大きいのであまりやりたくない。
また、いちいち再起動の依頼をするのも面倒だろう。
ということで、 redashで使用するEC2とRDSのインスタンスを再起動するだけのボタンを作成した。
ボタンの作成にあたっては次のような手順を踏んだ。
- IAM Roleの作成
- Lambda Functionの作成
- ボタンの設定
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. ボタンの設定
次のような作業を行う。
- ボタンの登録
- Wifiの設定
- プロジェクトの作成
- プレイスメントの作成
これらの作業は全てスマホアプリで行うことができる。
下記の記事を参考に設定を行った。
こちらでは詳しい手順は割愛する。
https://qiita.com/teriyakisan/items/bb0facf5075376dcf587
ラベリング・保管
IoTボタンにはカラーバリエーションが無いため、複数持っていると区別が難しい。
コピー用紙をIoTボタンの形にハサミで切り抜き、筆ペンで文字を書き、のりで貼って何のボタンなのかわかるようにした。
また、ボタンは大きくはないため、乱雑に置いておくと紛失してしまう恐れがある。
紛失を防ぐため、Ardbeg ウェアハウスボックス2017の空き缶に格納した。
最後に
入出力の少ないOpsの自動化に便利なデバイスだと思った。
ボタンを押すだけなので、利用者への説明が簡単なのがとても良い。
他にも活用できそうな場面があれば、ボタン化して行こうと思う。