我們寫 Lambda Function的時候, 要實作 handler . 當事件驅動了這個 function 的時候, 相關資訊會經由 event 這個參數傳進來.

def handler_name(event, context): 
    ....
    return some_value  

接下來就探討一下, 我們會從 event 裡看到什麼樣的資訊.

準備動作

AWS Lambda 小練習: 氣溫資料爬蟲 為例, 我希望每當爬蟲把網頁抓回來丟上S3之後, S3的trigger 就能自動呼叫另一隻 Parser 用途的Lambda Function, . 所以至少我得知道來源是哪個檔案才能進行下一步.

以下是新增 trigger步驟:

對著你寫好的 parser lambda function, 新增一個由 S3 發動的 trigger. 這邊順便加了一些條件. 這邊只接受物件上傳 Put Event (其他的event 如:物件刪除、搬移的都忽略)

--

如此一來, 只要是爬蟲爬回來的, 或是你手動上傳到 S3 的資料, 都能觸發 trigger .

觀察 event 內容

以下是一個測試用的 lambda function. 只加了一行, 那就是 print(event) ,先全部倒出來看看.

def lambda_handler(event, context):

    print(event)

    return None

然後我們到 CloudWatch-Log 功能 , 看看剛才print()倒出來了什麼東西

--

格式整理一下:

{
  'Records': [{
    'eventVersion': '2.0',
    'eventTime': '2017-02-13T10:14:13.925Z',
    'requestParameters': {
      'sourceIPAddress': '111.111.111.111'
    },
    's3': {
      'configurationId': '38f2a1d6-3899-48aa-9b76-56989c44897b',
      'object': {
        'eTag': '96eb4b02334c278c2827caaf24078ad2',
        'sequencer': '0058A186F5D93B3962',
        'key': '1486553116992.htm',
        'size': 41356
      },
      'bucket': {
        'arn': 'arn:aws:s3:::test.fan',
        'name': 'test.fan',
        'ownerIdentity': {
          'principalId': 'AUMOGSY6CG5VP'
        }
      },
      's3SchemaVersion': '1.0'
    },
    'responseElements': {
      'x-amz-id-2': 'SMcbhKhR9x/R7cKMWsYwA9xl+cXLHcfDNyO2uK24L1eaaFU+Mq8To2CUowPIfkUh',
      'x-amz-request-id': '7702F37D2BEF90AB'
    },
    'awsRegion': 'ap-southeast-1',
    'eventName': 'ObjectCreated:Put',
    'userIdentity': {
      'principalId': 'AUMOGSY6CG5VP'
    },
    'eventSource': 'aws:s3'
  }]
}

這是 python 的 dict 資料結構格式, dict 又包著 list 又包著 dict 的結構有些複雜.. 不過我們只需目視就可以看到一些有用的資訊, 例如檔名, bucket名稱, size 等等.

以下是取出來的方法:

def lambda_handler(event, context):

    dict_event = event['Records'][0]

    s_eventName = dict_event['eventName']
    s_eventTime = dict_event['eventTime']    
    s_object_name = dict_event['s3']['object']['key']
    s_bucket = dict_event['s3']['bucket']['name']

    print [s_eventName,s_eventTime,s_object_name,s_bucket]

    return None

執行結果如下:

[u'ObjectCreated:Put', u'2017-02-13T10:14:13.925Z', u'1486553116992.htm', u'test.fan']

以上就是對於 event 內容的一些探索.

參考資料