🚀

【AWS】Slackから「RDS停止」をキックする

2022/06/27に公開


はじめに

ご覧いただきありがとうございます。阿河です。

前回の記事では、AWSサービスで検知した情報をSlackに流しました。
今回は「SlackからAWSサービスを起動させる」を行いたいと思います。

AWS Chatbotを経由して、RDSを停止させます。

対象者

  • AWSを運用中
  • AWSとSlackの連携方法について知りたい

概要

  1. Slack~AWS Chatbotを連携させる
  2. LambdaでRDSを停止させる
  3. 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」の連携を試してみました。
より応用して、複雑な処理を実行できるように実験していきたいと思います。

御覧いただきありがとうございました!!

MEGAZONE株式会社 Tech Blog

Discussion