5
1

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 1 year has passed since last update.

AWSにログインしたことをSlackに通知したい

Last updated at Posted at 2021-12-14

株式会社パーソンリンクアドベントカレンダー15日目です!🎉

はじめに

完成形としてはこのようになっています!
誰が何時にログインしたかをSlackに通知が来るように今回設定していきます。

今回は、dev環境でLambdaを作成しました。そのため、ログインしたときではなくロール切り替え(dev環境)の際にログインしたことになっています。
実際に実装する際には、本番環境にLambda関数を作成することでAWSログイン時の通知が来るようになります。

image.png

使用したサービス

  • Incoming Webhook
  • CloudTrail
  • Amazon EventBridge
  • Cloud Watch
  • Amazon Simple Notification Service (SNS)
  • Lambda

流れ

CloudTrail (AWSマネジメントコンソールへのログインイベントを検知)

Amazon EventBridge(検知されたイベントをSNSに通知)(Lambdaに渡せる形にする)

Amazon Simple Notification Service (SNS)(SNSに登録のあった通知先にメールを送信)今回はいらない機能ですが、ログの確認ができたので一応送っていました

Lambda(EventBridgeをトリガーにしてSlackに投げる)

指定したリージョン

米国東部(バージニア北部)us-east-1

どうしてバージニア北部に設定しないといけないのかは不明なのですが、公式によると

AWS Management Console のサインインイベントは、米国東部 (バージニア北部) リージョンでのみ CloudWatch Events によって検出できます。

と記載されていました。なので今回はバージニア北部のリージョンを選択しました

Webhook URLの取得

SlackAppディレクトリから Incoming Webhookの設定をします。
設定を追加を押すとチャンネル選択画面に移行します。
Botを働かせたいチャンネルを選択してIncoming Webhookインテグレーションの追加を押します。
これでIncoming Webhookを使用する準備ができ、Webhook URLの取得が完了しました。
後にWebhook URLを使用するので記録しておくと便利です。
忘れた!という場合はSlackAppディレクトリで Incoming Webhookの設定から自分が設定したIncoming Webhookの編集から確認することができますのでご安心を・・・

image.png

CloudTrail

CloudTrailでAWS アカウント内で行われた操作のイベントログを記録します。ここでサインインイベントが記録します。

ここでは

  • 証跡の作成
  • 作成した証跡のストレージの場所として、Amazon S3を使用

image.png

image.png

Amazon EventBridge

Amazon EventBridgeではルールを作成します

ターゲットはSNSトピックLambda関数に設定します。これにより上記の通りCloudTrailで検知されたイベントをSNSに通知、Lambdaに渡せる形にする事ができています。

image.png

image.png

image.png

Cloud Watch

Cloud WatchはEventBridgeと同じ動作をしています。
しかし、自分はここで任意のユーザーを指定しましたが、ARNを入力することで特定のユーザーに絞ることも可能である事がわかりました。

image.png

Amazon Simple Notification Service (SNS)

今回は実験的に行ったため、一応メールにも通知が来るようにしましたが実際に実装する際には通知が山のように来るのでいらない気がします・・・
一応仕組みとして理解したのでこの場でアウトプットも兼ねて記述しておきます

ここでは以下の設定を行います

  • トピック
  • サブスクリプション

トピック

image.png

サブスクリプション

image.png

ここでは通知するメールアドレスとプロトコルの設定をします

Lambda

ダッシュボードから関数の作成を選択します
関数名は任意の名前、ランタイムはPython3.8を選択します
image.png

関数の画面でトリガーを追加を選択し、今回のトリガーとなるEventBridgeを指定すると下画面のようになります
image.png

コード

import json
import urllib.request
import os



def lambda_handler(event, context):
    # TODO implement
   
    print(json.dumps(event))
    
    print(event['detail']['userIdentity']['principalId'])
    principalId = event['detail']['userIdentity']['principalId']
    target =':'
    idx =  principalId.find(target)
    username = principalId[idx+1:]
    print(username)
    post_slack(username)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def post_slack(username):
    message = username

    send_data = {
        "username": "AWSログイン通知",
        "icon_emoji": ":Aws Simple Icons Aws Cloud :",
        "text": message + "さんがログインしました",
    }
    send_text = "payload=" + json.dumps(send_data)
    # URLにはご自分のWebhook URLを入力してください
    request = urllib.request.Request(
        os.environ['webhookURL'], 
        data=send_text.encode("utf-8"), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")

としてDeployTestすることでメール通知が来るようになります。
ここで忘れ去られていたWebhookの設定をします。環境変数を選択し
image.png

キーwebhookURL、値を先程記録したwebhookURLを選択します。
これによってSlack通知が来るようになります!

5
1
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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?