星期二, 8月 03, 2021

使用 aws cli 建立 CloudWatch Event Rule 與 Target - 使用現有的 Rule 為範本

使用 aws cli 建立 CloudWatch Event Rule 與 Target - 使用現有的 Rule 為範本


上一篇文章是使用 Console 的方式定義 Input Transformer 輸出到 CloudTrail Event


這一篇文章要來寫如何使用 aws cli 來建立 CloudWatch Event Rule 與 Target - 在已經有現有的 Rule 下.


環境假設

  • 已經建立 CloudWatch Event Rule, 名稱為 Notify_Create_Delete_IAM_User

  • 已經建立 SNS 通知方式 - 使用 Email 通知, 且已經完成訂閱

  • 使用 Input Transformer 設定 Notify_Create_Delete_IAM_User 這個 Rule 的 Target 為 SNS 然後設定 Input Path 與 Input Template


首先觀察先前建立的 CloudWatch Rule "Notify_Create_Delete_IAM_User" 的內容



Event pattern 為


{

  "source": [

    "aws.iam"

  ],

  "detail-type": [

    "AWS API Call via CloudTrail"

  ],

  "detail": {

    "eventSource": [

      "iam.amazonaws.com"

    ],

    "eventName": [

      "CreateUser",

      "DeleteUser"

    ]

  }

}


  • 這邊是 JSON 格式


將內容儲存為 Notify_Create_Delete_IAM_User.json


因為等等要使用到的 aws 指令輸入只接受 string 格式

所以使用 jq 指令轉為 string


# cat  Notify_Create_Delete_IAM_User.json |  jq  tostring


"{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"


  • 這個之前真的沒有注意到這個功能, jq 真是太好用了 


當然也可以反向使用 ( string to JSON)


# echo  "{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"  |  jq


{

  "source": [

    "aws.iam"

  ],

  "detail-type": [

    "AWS API Call via CloudTrail"

  ],

  "detail": {

    "eventSource": [

      "iam.amazonaws.com"

    ],

    "eventName": [

      "CreateUser",

      "DeleteUser"

    ]

  }

}




使用 aws 指令建立 AWS CloudWatch Event Rule


# aws  events  put-rule  --name "test-2021-08-02"  --region  us-east-1  --event-pattern  

"{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"


  • 可以到 Console 觀察有建立一個 CloudWatch Event Rule, 名稱為 test-2021-08-02

  • 使用剛剛既有的 Rule 的 Event Pattern


接下來要觀察先前建立的 CloudWatch Event  Rule Target 內容


# aws  events  list-targets-by-rule  --rule  "Notify_Create_Delete_IAMuser"  --region  us-east-1


{

    "Targets": [

        {

            "Id": "1",

            "Arn": "arn:aws:sns:us-east-1:783147821205:Notify_CreateIAMUser_20210714",

            "InputTransformer": {

                "InputPathsMap": {

                    "AccountID": "$.detail.userIdentity.accountId",

                    "Create-userName": "$.detail.responseElements.user.userName",

                    "Region": "$.detail.awsRegion",

                    "Staff-userName": "$.detail.userIdentity.userName",

                    "eventName": "$.detail.eventName",

                    "eventTime": "$.detail.eventTime",

                    "sourceIPAddress": "$.detail.sourceIPAddress"

                },

                "InputTemplate": "\"這是來自雲端課的通知,偵測到Assume Role行為\"\n\"AccountID: <AccountID>\"\n\"Region:<Region>\"\n\"建立者: <Staff-userName>\"\n\"EventTime: <eventTime>\"\n\"SourceIP: <sourceIPAddress>\"\n\"EventName: <eventName>\"\n\"建立帳號名稱: <Create-userName>\""

            }

        }

    ]

}


  • Id 的部份可以換成自訂的 ID, 使用 Console 建立的會很長

  • 我是透過 SNS 通知, 所以 SNS ARN 請換成自己的 SNS ARN


使用輸出導向的方式將內容存成 notify_create_delete_iam_user_target.json


# aws  events  list-targets-by-rule  --rule  "Notify_Create_Delete_IAMuser" --region  us-east-1   > notify_create_delete_iam_user_target.json


因為之後要套用 Rule, 所以要編輯檔案


{

    "Rule":"test-2021-08-02",

    "Targets": [

        {

            "Id": "1",

            "Arn": "arn:aws:sns:us-east-1:783147821205:Notify_CreateIAMUser_20210714",

            "InputTransformer": {

                "InputPathsMap": {

                    "AccountID": "$.detail.userIdentity.accountId",

                    "Create-userName": "$.detail.responseElements.user.userName",

                    "Region": "$.detail.awsRegion",

                    "Staff-userName": "$.detail.userIdentity.userName",

                    "eventName": "$.detail.eventName",

                    "eventTime": "$.detail.eventTime",

                    "sourceIPAddress": "$.detail.sourceIPAddress"

                },

                "InputTemplate": "\"這是來自雲端課的通知,偵測到Assume Role行為\"\n\"AccountID: <AccountID>\"\n\"Region:<Region>\"\n\"建立者: <Staff-userName>\"\n\"EventTime: <eventTime>\"\n\"SourceIP: <sourceIPAddress>\"\n\"EventName: <eventName>\"\n\"建立帳號名稱: <Create-userName>\""

            }

        }

    ]

}


  • 加上 Rule 設定, 後面請接上剛剛新建立的 Rule, 然後記得加上 逗號 ,

  • Id 的部份可以換成自訂的 ID, 使用 Console 建立的會很長

  • 我是透過 SNS 通知, 所以 SNS ARN 請換成自己的 SNS ARN


完成準備檔案


使用 aws 指定套用 Rule 的 Target

我的 notify_create_delete_iam_user_target.json 在目前的目錄下


# aws  events  put-targets  --region  us-east-1  --cli-input-json  file://./notify_create_delete_iam_user_target.json


{

    "FailedEntryCount": 0,

    "FailedEntries": []

}


回 Console 驗證是否完成 :)


又向 AWS 前進一步


~ enjoy it



Reference:



沒有留言: