株式会社パーソンリンクアドベントカレンダー15日目です!🎉
はじめに
完成形としてはこのようになっています!
誰が何時にログインしたかをSlackに通知が来るように今回設定していきます。
今回は、dev環境でLambdaを作成しました。そのため、ログインしたときではなくロール切り替え(dev環境)の際にログインしたことになっています。
実際に実装する際には、本番環境にLambda関数を作成することでAWSログイン時の通知が来るようになります。
使用したサービス
- 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の編集
から確認することができますのでご安心を・・・
CloudTrail
CloudTrailでAWS アカウント内で行われた操作のイベントログを記録します。ここでサインインイベントが記録します。
ここでは
- 証跡の作成
- 作成した証跡のストレージの場所として、Amazon S3を使用
Amazon EventBridge
Amazon EventBridgeではルールを作成します
ターゲットはSNSトピックとLambda関数に設定します。これにより上記の通りCloudTrailで検知されたイベントをSNSに通知、Lambdaに渡せる形にする事ができています。
Cloud Watch
Cloud WatchはEventBridgeと同じ動作をしています。
しかし、自分はここで任意のユーザーを指定しましたが、ARNを入力することで特定のユーザーに絞ることも可能である事がわかりました。
Amazon Simple Notification Service (SNS)
今回は実験的に行ったため、一応メールにも通知が来るようにしましたが実際に実装する際には通知が山のように来るのでいらない気がします・・・
一応仕組みとして理解したのでこの場でアウトプットも兼ねて記述しておきます
ここでは以下の設定を行います
- トピック
- サブスクリプション
トピック
サブスクリプション
ここでは通知するメールアドレスとプロトコルの設定をします
Lambda
ダッシュボードから関数の作成を選択します
関数名は任意の名前、ランタイムはPython3.8を選択します
関数の画面でトリガーを追加を選択し、今回のトリガーとなるEventBridgeを指定すると下画面のようになります
コードは
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")
としてDeployしTestすることでメール通知が来るようになります。
ここで忘れ去られていたWebhookの設定をします。環境変数を選択し
キーをwebhookURL
、値を先程記録したwebhookURLを選択します。
これによってSlack通知が来るようになります!