Cognito Advanced Securityのユーザーイベントを取得する

Cognitoには監査ログや不正と思われるログインを検知する「Advanced Security」が用意されています。(有料)

これを監査のみ有効または有効にしていると、ユーザーのログイン履歴がユーザーイベントとして記録されるようになります。そしてこの記録されているイベントをSDKやCLIで取得する方法についてまとめました。

AWS CLIで取得する場合はcognito-idp admin-list-user-auth-events

手取り早いのはAWS CLIです。この場合、--user-pool-id--usernameの2オプションが必要です。

% aws cognito-idp admin-list-user-auth-events --user-pool-id us-west-2_xxxxxx --username dev | jq .
{
  "AuthEvents": [
    {
      "EventId": "2e52e79d-e1ae-418e-a5ef-3f6d2db9c65f",
      "EventType": "SignIn",
      "CreationDate": 1612165482.505,
      "EventResponse": "Pass",
      "EventRisk": {
        "RiskDecision": "NoRisk"
      },
      "ChallengeResponses": [
        {
          "ChallengeName": "Password",
          "ChallengeResponse": "Success"
        }
      ],
      "EventContextData": {
        "IpAddress": "127.0.0.0",
        "DeviceName": "Chrome 8, Mac OS X",
        "City": "Osaka",
        "Country": "Japan"
      }
    },
    {

TypeScript / JavaScriptはadminListUserAuthEvents

IAMのアクション名を1文字目小文字にしただけと思えば割と覚えやすいかもです。

import { Handler } from 'aws-lambda';
import { CognitoIdentityServiceProvider } from 'aws-sdk'

export const hello: Handler = async ({username}) => {
  const client = new CognitoIdentityServiceProvider()
  const { AuthEvents: events } = await client.adminListUserAuthEvents({
    UserPoolId: 'us-east-1_xxxx',
    Username: username
  }).promise()
  return events
}

これをServerless Frameworkなどで実行すればOKです。

$ sls invoke local -f hello -d '{"username": "development-user"}'

[
    {
      "EventId": "2e52e79d-e1ae-418e-a5ef-3f6d2db9c65f",
      "EventType": "SignIn",
      "CreationDate": 1612165482.505,
      "EventResponse": "Pass",
      "EventRisk": {
        "RiskDecision": "NoRisk"
      },
      "ChallengeResponses": [
        {
          "Challen

Comment