【AWS】Slackから「RDS停止」をキックする
はじめに
ご覧いただきありがとうございます。阿河です。
前回の記事では、AWSサービスで検知した情報をSlackに流しました。
今回は「SlackからAWSサービスを起動させる」を行いたいと思います。
AWS Chatbotを経由して、RDSを停止させます。
対象者
- AWSを運用中
- AWSとSlackの連携方法について知りたい
概要
- Slack~AWS Chatbotを連携させる
- LambdaでRDSを停止させる
- Slackからキックする
事前準備
- AWSアカウント作成
- AdministratorAccessを付与したIAMユーザーの作成
- プライベートサブネットにRDSを1台作成して起動する
1. Slack~AWS Chatbotを連携させる
AWS Chatbotでチャットクライアントを設定
AWSマネジメントコンソールで、Chatbotのページに移動。
チャットクライアントとして「Slack」を選択の上で、「クライアントを設定」をクリック。
任意のワークスペースを指定します。
AWS Chatbotが指定したSlackワークスペースにアクセスする権限を許可します。
設定済クライアントに、Slackワークスペースが追加されます。
プライベートチャンネルの設定
Slack側でプライベートチャンネルの作成。
「チャンネル詳細を表示する」からチャンネルIDが確認できるので、コピーしておきます。
チャネルを設定
AWS Chatbotの設定に戻ります。
「新しいチャネルを設定」をクリックします。
設定名: 任意の名前
チャネルタイプ: プライベート
チャネルID: 先ほどコピーしたチャンネルID
- ロール設定: チャネルIAMロール
- チャネルIAMロール: テンプレートを使用してIAMロールを作成する
- ロール名: 任意の名前
- ポリシーテンプレート: 「読み取り専用コマンドのアクセス許可」「Lambda呼び出しコマンドのアクセス許可」
上記の設定を行い、チャネルを作成します。
AWS ChatbotをSlackワークスペースに追加
ドキュメントの14番に、AWS ChatbotをSlackワークスペースに追加する方法について記述があります。
指定したチャンネルで
/invite @aws
を入力して、AWS Chatbotを招待します。
@aws help
と入力すると、可能なコマンドが表示されます。
※但し書きに「AWS-Managed ReadOnlyAccessポリシーで定義されているように、ほとんどの読み取り専用コマンドを実行し、Lambda関数を呼び出し、サポートケースを作成できます」とあります。
2. LambdaでRDSを停止させる
Lambda用のIAMロールを作成
- ユースケース: Lambda
- AmazonRDSFullAccess/AWSLambdaVPCAccessExecutionRoleを付与
VPCエンドポイント作成
VPCのページ⇒「エンドポイント」を選択。
- サービスカテゴリー: AWSのサービス
- サービス: lambda
- VPC: RDSのあるVPC
- DNS名を有効化
- サブネット: プライベートサブネットを指定
- VPCエンドポイントポリシー: フルアクセス
Lambda関数を作成
- オプション: 一から作成
- ランタイム: Python3.8
- アーキテクチャ: x86_64
- ロール: 作成したロール
タイムアウトを30秒に変更する。
コードを記述します。
import boto3
import json
def lambda_handler(event,context):
rds = boto3.client('rds')
db = rds.describe_db_instances(DBInstanceIdentifier='xxxxxxxxxxxxx')
response = db['DBInstances']
for instance in response:
status = instance['DBInstanceStatus']
if status == 'available':
rds.stop_db_instance(DBInstanceIdentifier='xxxxxxxxxx')
else:
print('RDS already stop')
boto3のドキュメントを参照しながら、RDSを停止させるコードを書きます。
DBInstanceIdentifierは、自身の環境のDB識別子に置き換えてください。
Lambdaのテストを実行しましょう。
テストの結果、データベースの停止が始まりました。
後はSlackからキックして、Lambdaを実行できるようにしていきます。
次のセクションに移る前に、RDSを再度起動しておきます。
3. Slackからキックする
Slack側で下記を入力します。
これは先ほど「@aws help」を入力した際に、返ってきたヘルプの中に記述があったコマンドです。
@aws labmda invoke --help
返ってきた内容を要約すると
- Lambda関数を呼び出す。
- 必須パラメータとして「function-name」がある。
- オプションを追加することもできます。
@aws lambda invoke xxxxxxxxxxxxxx --region ap-northeast-1
「xxxxxxx」にLambda関数名、「region」配下にリージョンを入れてください。
ではコマンドを実行してみましょう。
「Would you like me to do so?」と確認があるので、続行します。
結果はどうでしょうか。
RDSの停止が始まりました。
Slack画面にも「StatusCode: 200」と表示されました。
念のためCloudWatch Logsでログを確認したところ、Lambdaが実行されたことが確認できました。
SlackからLambda実行のキッカケを与えることができました。
さいごに
前回から2回の投稿で「AWS⇒Slack」「Slack⇒AWS」の連携を試してみました。
より応用して、複雑な処理を実行できるように実験していきたいと思います。
御覧いただきありがとうございました!!
Discussion